hn / video
在 typo3 中使用本地 ffmpeg 或 cloudconvert 自动转换视频。
Requires
- php: ^7.1
- ext-json: *
- guzzlehttp/guzzle: ^6.3
- james-heinrich/getid3: ^1.9.16
- typo3/cms-core: ~8.7.10 || ~9.5.5
Requires (Dev)
- nimut/testing-framework: ^4.1
- phpunit/phpunit: ^6.5
- typo3/cms-composer-installers: >=1.4.1
This package is auto-updated.
Last update: 2024-08-29 10:35:35 UTC
README
TYPO3 视频压缩
此扩展为 TYPO3 添加了视频转换/压缩功能。
为什么?
自己托管视频有合理的理由,但正确的视频压缩并不容易。TYPO3 已经处理了图像压缩(至少有时候)。那么如果也管理视频会怎么样呢?
特性
- 无缝集成:通过 FileRenderer 集成到使用 typo3 的
<f:media>
视图辅助器的每个元素 - 自动将许多视频格式(如 mov 和 mkv)转换为浏览器友好的格式(如 mp4 和 webm)
- 自定义尺寸 和裁剪,适用于特定用例,如背景视频或动画缩略图
- 后端模块:查看所有处理过的视频概述
- 在占位符和仪表板中实时更新 进度信息,直到视频处理完成
- 缓存感知:视频所在的页面缓存将在处理完成后清除
- 可以切换视频处理方式。默认情况下,在本地 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_filesize
和post_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]: ... }
。这将覆盖默认格式。视频/音频部分与根级别相同。可用格式为mp4
和webm
。有关更多信息,请参阅详细配置。
请注意,<f:media>
的width=""
和height=""
属性在编码过程中被忽略。这是为了防止不必要的转码,并且因为您可以将视频最大化,因此缩放到适合框架并不总是最好的选择。
详细配置
要了解配置,您首先需要了解一些基础知识。有三个级别
- 格式 the:例如,mp4或webm。格式定义了文件应该是什么,其中包含哪些流,其MIME类型以及格式特定的ffmpeg参数。流是有趣的部分。
- 流 preset:它定义了一个音频或视频流。示例:
H264Preset
和AacPreset
。预设是定义ffmpeg命令外观的类。它们相当复杂,但您可以根据需要创建自己的预设。但您可能只想配置现有的预设。 - 预设配置:这是一个简单的数组,与预设的设置器映射。在那里你可以调整兼容性、分辨率、帧率和质量。
格式定义
<?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的选项 - "此流不需要修改",因此质量相同或更低的流不会重新编码
- 使用一个值
AbstractVideoPreset
和AbstractAudioPreset
开始进入流类型的特定细节。视频预设处理帧率、视频分辨率和裁剪。音频预设处理通道和采样率。如果您需要实现例如H265支持,您可能需要扩展这些中的一个。AacPreset
、H264Preset
、OpusPreset
、VP9Preset
是格式的具体实现。如果您需要,可以将它们用作示例实现。
预设配置
这些配置允许你在多个地方调整视频/文件中的流。
您可以针对特定流类型全局定义它们
<?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
将删除一些临时文件。如果您的功能测试无任何明显原因失败,请尝试此方法。