hn/video

在 typo3 中使用本地 ffmpeg 或 cloudconvert 自动转换视频。

安装: 557

依赖项: 0

建议者: 0

安全: 0

类型:typo3-cms-extension

v1.0.0 2019-09-24 09:29 UTC

This package is auto-updated.

Last update: 2024-08-29 10:35:35 UTC


README

Packagist Version Packagist Packagist Packagist Build status

TYPO3 视频压缩

此扩展为 TYPO3 添加了视频转换/压缩功能。

为什么?

自己托管视频有合理的理由,但正确的视频压缩并不容易。TYPO3 已经处理了图像压缩(至少有时候)。那么如果也管理视频会怎么样呢?

特性

  • 无缝集成:通过 FileRenderer 集成到使用 typo3 的 <f:media> 视图辅助器的每个元素
  • 自动将许多视频格式(如 mov 和 mkv)转换为浏览器友好的格式(如 mp4webm
  • 自定义尺寸 和裁剪,适用于特定用例,如背景视频或动画缩略图
  • 后端模块:查看所有处理过的视频概述
  • 在占位符和仪表板中实时更新 进度信息,直到视频处理完成
  • 缓存感知:视频所在的页面缓存将在处理完成后清除
  • 可以切换视频处理方式。默认情况下,在本地 ffmpeg 和 CloudConvert 之间切换,但你也可以部署自己的转换器,这些转换器可以通过 ssh 或其他服务运行

工作原理

  • 它从一个新的 FileRenderer 开始,如果你使用 <f:media> 视图辅助器,这个渲染器会自动启动。
  • 此渲染器将使用新的 Video.CropScale 任务通过正常的 typo3 文件处理流程。
  • 视频将由 ffmpeg 命令或 CloudConvert 处理。
  • 在处理过程中,FileRenderer 将渲染一个简单的进度百分比。
  • 处理完成后,视频将类似于正常的 html5 视频渲染器进行渲染。

如何安装

  • 使用 composer require hn/video 安装扩展。
  • 确保 ffmpeg 可用,或者在扩展设置中配置 CloudConvert api 密钥。
  • 确保定期运行 video:process 命令。如果使用本地 ffmpeg,则此命令会运行转换。如果您使用 CloudConvert,则技术上不需要此命令,因为一切都可以通过回调处理,但它可以提高进度信息的准确性,并在回调因任何原因未到达时作为后备方案。
  • 检查 php 配置 upload_max_filesizepost_max_size 是否足够大。我建议至少 1GB。如果您使用免费的 CloudConvert,那么这也是他们允许的最大大小。

简单配置

在 ext_conf 中有一些基本的配置选项,您可以通过 typo3 后端全局设置。

  • 如何使用 ffmpeg(CloudConvert 或 ffmpeg 命令)
  • 选择性能预设,如 h264 slow、veryslow,如果您还想要编码 vp9
  • 更改编解码器级别以更改分辨率、文件大小和兼容性
  • 决定视频/音频压缩,使用类似 jpeg 质量百分比的简单百分比值

这些选项是通过 typo3 9 的 ExtensionConfiguration 类读取的,因此如果您使用 typo3 9,您还可以在您的 AdditionalConfiguration.php 中以编程方式定义这些选项,如下例所示

<?php
if (getenv('CLOUDCONVERT_APIKEY')) {
    $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['video']['converter'] = 'CloudConvert';
    $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['video']['cloudConvertApiKey'] = getenv('CLOUDCONVERT_APIKEY');
}

使用方法

只需像 textmedia 一样使用 <f:media> 视图辅助器。

<f:media file="{video}" />

您可以使用 additionalParameters 属性更改关于输出文件的一些参数。

这是一个自动播放视频的示例,您可能将其用于舞台或内容元素中作为动画图像。

<f:media file="{video}" additionalParameters="{
    autoplay: 3,
    duration; 30,
    video: {quality: 0.6},
    audio: {disabled: 1}
}" />

选项

  • autoplay: 0, 1, 2, 3;这些选项也在文件参考中可用。
    • 0:禁用自动播放。(默认值)
    • 1:启用自动播放并静音视频。
    • 2:类似于1,但循环视频。
    • 3:类似于2,但禁用控件。这类似于GIF动画。
  • muted: false, true;设置静音属性,当autoplay >= 1时默认设置。请注意,这不会从视频中移除音频流,因为可以使用控件取消静音视频。要实际禁用音频,请设置{audio: {disabled: 1}}
  • start:秒;时间偏移量。
  • duration:秒;视频的最大时长。
  • video:数组;这些选项将被传递给VideoPreset。
    • disabled:false, true;禁用视频流。
    • quality:0.0 - 1.0;视频质量的基本抽象。这应该与JPEG设置大致相当。默认值为0.8。
    • maxWidth:null, int;请注意,最大视频分辨率也受水平和帧速率的限制。当使用null时,则结果分辨率由源视频或级别限制决定。
    • maxHeight:null, int;与maxWidth相同的注释。
    • maxFramerate:int;设置帧速率的限制。默认值为30。您可能需要提高级别以维持可接受的分辨率。帧速率可能更低以减少卡顿。以下是一些示例
      • 如果源帧速率为48,则使用24
      • 如果源帧速率为50,则使用25
      • 如果源帧速率为32,则使用30,因为降至16将会是一个巨大的跳跃
    • crop:false, true;默认情况下,视频保持其宽高比。如果设置为true,则视频将被裁剪以填充宽高比。请注意,视频永远不会被放大。
    • level:1.0 - 6.2;特定编解码器的兼容级别。 h264级别VP9级别 不相同。如果您计划使用这两种编解码器,请使用相似的级别。以下是我的建议
      • 3.0:默认值;~480p@30,VP9稍高一些
      • 3.1:~720p@30和~576p@60
      • 4.0:~1080p@30和~720p@60
      • 4.1:~1080p@30和~720p@60;VP9的~1080p@60
  • audio:数组;这些选项将被传递给AudioPreset。
    • disabled:false, true;禁用音频流。
    • quality:0.0 - 1.0;视频质量的基本抽象。
  • formats:数组;格式映射,定义为{[format1]: {video: {}, audio: {}}, [format2]: ... }。这将覆盖默认格式。视频/音频部分与根级别相同。可用格式为mp4webm。有关更多信息,请参阅详细配置。

请注意,<f:media>width=""height=""属性在编码过程中被忽略。这是为了防止不必要的转码,并且因为您可以将视频最大化,因此缩放到适合框架并不总是最好的选择。

详细配置

要了解配置,您首先需要了解一些基础知识。有三个级别

  1. 格式 the:例如,mp4或webm。格式定义了文件应该是什么,其中包含哪些流,其MIME类型以及格式特定的ffmpeg参数。流是有趣的部分。
  2. preset:它定义了一个音频或视频流。示例:H264PresetAacPreset。预设是定义ffmpeg命令外观的类。它们相当复杂,但您可以根据需要创建自己的预设。但您可能只想配置现有的预设。
  3. 预设配置:这是一个简单的数组,与预设的设置器映射。在那里你可以调整兼容性、分辨率、帧率和质量。

格式定义

<?php
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['video']['formats']['mp4'] = [
    'fileExtension' => 'mp4',
    'mimeType' => 'video/mp4',
    'video' => [\Hn\Video\Preset\H264Preset::class],
    'audio' => [\Hn\Video\Preset\AacPreset::class],
    'additionalParameters' => ['-movflags', '+faststart', '-map_metadata', '-1', '-f', 'mp4'],
];

这是mp4视频容器默认的格式定义。一个格式定义由以下部分组成

  • fileExtension,它简单定义了生成的文件必须具有的文件扩展名。虽然默认格式定义也使用文件扩展名作为标识符,但你的不一定需要。
  • mimeType 用于 <source type="">。虽然会添加编解码器扩展。
  • video 定义了视频流的 预设。如果您的格式不需要/支持视频,则省略或设置为null。您可以添加一个带有选项的第二个参数,这些选项将被传递给构造函数(如果在其他地方未覆盖)。
  • audio 定义了音频流的 预设。如果您的格式不需要/支持音频,则省略或设置为null。
  • subtitle 定义了字幕流的 预设。默认情况下没有实现,但选项是有的。
  • data 定义了数据流的 预设。默认情况下没有实现,但选项是有的。
  • additionalParameters 是一个参数数组,它们被添加到ffmpeg命令中
  • priority 是一个整数,用于根据它对创建的任务进行排序。这用于将webm格式相对于mp4进行延迟,因为mp4将完成得更快。

您可以在 $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['video']['formats']['{format-name}'] 中配置格式。默认情况下使用一组格式。它在 $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['video']['default_video_formats'] 中定义,如下所示

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['video']['default_video_formats'] = [
    // 'webm' => [], // this format is by default disabled but can be enabled in ext_conf.
    'mp4' => [],
    
    // you can even pass options to the presets within here
    'mp4' => ['level' => '4.0']
    // in this case i increate the compatibility level to 4.0 which allows full-hd.
    // read more about that in the preset configuration.
];

使用格式的另一种方法是使用媒体视图助手进行即时使用。

<f:media file="{file}" additionalConfig="{formats: {mp4: {}}}" />
<!-- you can pass preset options here as well -->
<f:media file="{file}" additionalConfig="{formats: {mp4: {video: {quality: 0.6, width: 400, height: 400, crop: 1}}}}" />

预设

预设是类,它们定义了如何处理流。你可能想了解它们的基本概念,因为这将使理解预设配置更容易。

  • PresetInterface 是基础,解释了你需要什么。一个最小的预设只需定义 getParameters,它必须返回一个类似 ['-c:v', 'libx264'] 的ffmpeg参数数组。预设配置简单地将数组作为参数传递给构造函数。将 ffprobe 的结果作为参数传递给 getParameters,以便可以根据源材料实现决策。
  • AbstractPreset 是一个基本实现,通过搜索设置器方法来处理选项。因此,选项 quality 被传递为 setQuality
  • AbstractCompressiblePreset 建立在 AbstractPreset 之上,并增加了两个概念
    • 使用一个值 > 0.0<= 1.0 来抽象质量,这应该大致等于jpeg的选项
    • "此流不需要修改",因此质量相同或更低的流不会重新编码
  • AbstractVideoPresetAbstractAudioPreset 开始进入流类型的特定细节。视频预设处理帧率、视频分辨率和裁剪。音频预设处理通道和采样率。如果您需要实现例如H265支持,您可能需要扩展这些中的一个。
  • AacPresetH264PresetOpusPresetVP9Preset 是格式的具体实现。如果您需要,可以将它们用作示例实现。

预设配置

这些配置允许你在多个地方调整视频/文件中的流。

您可以针对特定流类型全局定义它们

<?php
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['video']['defaults'][\Hn\Video\Preset\H264Preset::class]['quality'] = 0.6;
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['video']['defaults'][\Hn\Video\Preset\AacPreset::class]['quality'] = 1.0;

您可以在格式定义本身中定义它们

<?php
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['video']['formats']['mp4'] = [
    'fileExtension' => 'mp4',
    'mimeType' => 'video/mp4',
    'video' => [\Hn\Video\Preset\H264Preset::class, ['quality' => 0.6]],
    'audio' => [\Hn\Video\Preset\AacPreset::class, ['quality' => 1.0]],
    'additionalParameters' => ['-movflags', '+faststart', '-map_metadata', '-1', '-f', 'mp4'],
];

您可以在默认的格式集上定义它们。在这里,您可以通过类型来定位它们,例如视频、音频。

<?php
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['video']['default_video_formats']['mp4'] = [
    'video' => ['quality' => 0.6],
    'audio' => ['quality' => 1.0]
];

您也可以在媒体视图助手中定义它们,类似于上面的定义。请注意,通过定义 formats 键,将覆盖 default_video_formats 配置。

<f:media file="{file}" additionalConfig="{formats: {mp4: {video: {quality: 0.6}, audio: {quality: 1.0}}}}" />

您还可以在不覆盖格式列表的情况下在视图助手中定义它们。查看 使用 部分以获取简单解释。

<f:media file="{file}" additionalConfig="{video: {quality: 0.6}, audio: {quality: 1.0}}" />

运行测试

此项目包含一些基本测试,以确保它在 composer.json 中描述的所有 typo3 版本中都能正常工作。这些测试由 bitbucket 运行,并在 bitbucket-pipelines.yml 中定义。

要本地运行它们,该项目中提供了一些 composer 脚本。只需克隆项目,运行 composer install,然后 composer db:start,等待几秒钟,然后 composer test。您还可以运行 composer test -- --filter TestCase 来运行特定的测试类/方法/数据集。

以下是可用命令列表

  • composer db:start 将使用 docker 命令启动数据库。如果您已有数据库可用,则无需使用它,但您需要定义 typo3Database* 变量。
  • composer db:stop 无疑将再次停止数据库...并删除它。
  • composer test 将运行所有可用测试。如果您的首次运行失败,则可能想运行 cc
  • composer test:unit 将仅运行单元测试。
  • composer test:functional 将仅运行功能测试。
  • composer cc 将删除一些临时文件。如果您的功能测试无任何明显原因失败,请尝试此方法。

缺失的功能

  • 自动生成海报,可能还有多个海报,可以从中选择一个
  • 一个视频剪辑界面(已可能通过界面实现,但尚未实现)
  • 多分辨率(自适应流),类似于 HLSMPEG-DASH,尽管我对两者的HLS 许可费用DASH 许可费用并不确定。
  • 可选地处理 fileadmin 中的文件以减少项目占用空间