如何为FFmpeg封装和ABR分发部署GPAC
As much as we love FFmpeg 对于转码操作,将内容打包为 ABR delivery. By packaging, 我的意思是格式化和分割你的媒体文件, 为HLS和DASH创建清单文件, formatting for CMAF,以及管理多个音频和字幕流. 幸运的是,有一些更容易使用的解决方案,它们同样是开源的,同样是免费的. 在本文中,我将重点介绍GPAC,它是一种很好的包装替代方案.
你可以在它的网站上看到, gpac.ioGPAC是一个开源的多媒体框架,用于许多媒体生产链. 它是FFmpeg的附件,它可以将FFmpeg用于多个进程. In this article, which focuses on VOD, I’ll use FFmpeg and MP4Box, one of the GPAC executables, separately.
In terms of credentials, 许多大公司都在使用GPAC, including Netflix, 该公司正在通过GPAC打包一些直播产品. 您可以阅读其他一些GPAC用户 here.
Getting Started
让我们从一些初步的东西开始. GPAC适用于Windows 32位(Vista+), Windows 64-bit (Vista+), Mac OS X, Linux 32 bits (Ubuntu 18.04*), Linux 64位(Ubuntu 20.4*), iOS(需要为您的设备重新签名)和Android. 安装后,有三套工具:
- MP4Box,我将在本文中使用的多媒体打包器
- Gpac,本文中未使用的通用媒体管道编排器
- Bindings for Python and Node.Js,本文中也没有使用
您需要在系统上安装FFmpeg才能运行MP4Box. I used FFmpeg 6.
我将在所有场景中使用一组通用文件, and you can download these, the batch commands, and all output files here. As you can see in Figure 1, 一个编码阶梯中有三个文件, 以及英语和法语音频和字幕音轨. 字幕由罗曼·布奎提供, 自2007年以来GPAC的主要架构师之一,以及我在此过程中的技术联系人. 法语音频翻译是计算机生成的,并不是特别同步, but it is French, so it probably won’t care.
Figure 1. Source files for all projects
我将创建四组打包文件:
- hls -每梯级一个文件(MPEG-2传输流格式)
- DASH—One file per ladder rung (fragmented MP4 format; fMP4)
- cmaf -每梯级一个文件(fMP4)
- cmaf -每梯级一个文件,带有英语/法语音频和字幕(fMP4)
例1:hls -每梯级一个文件(MPEG-2传输流)
最初的项目是在分段传输流文件中创建HLS输出, HLS最常见的用例. 下面是命令字符串和解释:
MP4Box -dash 2000 -profile onDemand jan_1080p.mp4 jan_720p.mp4 jan_540p.mp4 jan_audio.mp4 jan.vtt -out hls.m3u8 --muxtype=ts
MP4Box
—Calls MP4Box–dash 2000
—Creates 2,000 ms segments–profile onDemand
—Creates a single .ts file for each media asset. Use -profile live for separate .ts files.- 梯子中所有媒体文件的列表(包括标题)
-out hls.m3u8 --muxtype=ts
-命名HLS清单文件并将其格式为 .ts files, not fMP4
注意,直到我升级到版本3,字幕才出现在VLC媒体播放器中.0.20. 如果你在这些过程中有任何问题, 一定要升级到GPAC的最新版本和VLC的最新版本(go2sm).com/vlc).
The outputs are (see Figure 2):
hls.m3u8
—Master manifesthls_n.m3u8
-每个媒体资产的清单文件.ts/vtt
-每个媒体资产的媒体文件
Figure 2. 由MP4Box创建的媒体和清单文件
将所有这些复制到你网站上的同一个文件夹中, and link to the master, 你就有了一个HLS的线人.
注意,媒体文件包含单词“破折号”, because architecturally, HLS由创建DASH输出的GPAC模块生成. 您可以通过帮助文件中记录的命令删除破折号指定, 但我决定在本教程中保持简单.
Moving on, Figure 3 显示主清单文件,您可以链接到该文件或单击以播放HLS演示文稿. As you can see, 母版包含文件细节,允许玩家在开始和回放时选择正确的文件. Typically, 播放从母版中的第一个文件开始,但可以根据可用带宽或兼容性切换到任何其他视频. So, 如果一个很旧的iPhone点击了这个链接, 如果不能播放1080p文件,它可能不得不跳转到540p文件.
Figure 3. 主清单文件标识媒体文件的位置和相关详细信息.
If you open any of the other .m3u8 files, 您将看到它们在每个媒体文件中调用2秒字节范围请求来播放演示文稿.
例2:dash -每梯级一个文件(fMP4)
现在,让我们从相同的源文件创建DASH输出. Here’s the command string:
MP4Box -dash 2000 jan_1080p.mp4 jan_720p. mp4 jan_540p.mp4 jan_audio.mp4 jan.vtt -out jan_DASH.mpd
MP4Box
—Calls program–dash 2000
-DASH输出,2秒字节范围请求- 所有媒体文件(包括标题)的列表
-out jan_DASH.mpd
—Labels the MPD file jan_DASH
MP4Box创建如下所示的文件 Figure 4. 你可以链接到警局文件, 哪个包含媒体文件中所有2秒片段的字节范围请求.
Figure 4. DASH output
Figure 5 显示字幕轨道和字幕播放的视频. 因为我只包含了一个副标题轨道,所以你只能看到这些.
Figure 5. 这是在VLC中播放的DASH演示.
示例3:cmaf -每梯级一个文件(fMP4)
CMAF演示包含一组音频, video, 以及在HLS和DASH上播放的标题文件和HLS和DASH的清单文件. 请注意,输出格式必须是碎片化的MPEG-4文件才能使两个标准都工作,并且不能是传输流.
Here’s the GPAC command:
MP4Box -dash 2000 jan_1080p.mp4 jan_720p.mp4 jan_540p.mp4 jan_audio.mp4 jan.vtt -out jan_CMF.mpd:dual
新命令执行以下操作:
jan_CMAF.mpd:dual
-强制CMAF输出与HLS和名称清单文件JAN_CMF
Figure 6 包含所有输出文件. 共享的媒体文件均为fMP4格式, 不能在已经很小且正在迅速缩小的传统HLS设备上运行的游戏. 主HLS清单是jan_CMF.M3u8,它链接到其他媒体清单文件中的字节范围请求. 单个MPD文件包含所有DASH链接.
Figure 6. CMAF输出包含一组内容文件以及DASH和HLS清单文件
同样,您可以使用配置文件实时开关为内容创建单独的分段fMP4文件. 如果您播放m3u8文件或MPD, you can load the captions file by clicking Subtitle > Sub Track and choosing the only available subtitle track.
示例4:cmaf -每梯级一个文件,带有英语/法语音频和字幕(fMP4)
我们的最后一个项目是告别练习, 就像前面的练习一样, 但我将添加法语音频和字幕轨道,并将标记两组字幕和音频轨道:
MP4Box -dash 2000 jan_540p.mp4 jan_1080p.mp4 jan_720p.mp4 jan_audio.mp4:#udta_name= " English ":#HLSMExt=DEFAULT=YES .mp4:#udta_name=“French” jan.vtt:#Language= en:#Representation= " English.vtt: #Language=fr:#Representation= " French " -out JanCMAF_ML.mpd:dual
Here are the new commands:
jan_audio.mp4: # udta_name = "英语":# HLSM Ext =默认= YES
-将音频文件标识为英语并使其成为默认音轨Jan_audio_fr.mp4:#udta_name=“French”—
将音频文件标识为法语jan.vtt: #语言= en: #表示=“英语”
-识别并标记字幕为英语jan_fr.vtt: #语言= fr: #表示=“法国”
-识别并标记字幕为法语
这会生成与中所示相同的文件 Figure 7,有一个额外的音频和字幕轨道. 在VLC中播放HLS文件启用了两个音轨,如图7所示. 法语轨道应该是一个相对准确的翻译, 虽然我没有花时间把口语和视频同步.
Figure 7. Properly labeled audio tracks
你可以看到字幕 Figure 8法国人出现在视频中. This is playing the DASH MPD file; you will see a very similar, but not identical, presentation in HLS.
Figure 8. 摇摆英语和法语字幕轨道在VLC
Summing Up
我发现在FFmpeg中为ABR分发包装介质可能具有挑战性, frustrating, 有时是完全不可能的. GPAC将最常见的用例简化为命令字符串,即使是新手也可以在几分钟内掌握.
Related Articles
任何时候你开始使用新的编解码器, 为了实现最佳性能/质量优化,您应该运行一些基本测试. In this article, 我将带您完成这些测试,同时使用包含Fraunhofer VVC编解码器的FFmpeg版本编码VVC.
21 Mar 2023
FFmpeg被设计为视频和音频录制的跨平台解决方案, conversion, 以及使用简单的静态命令行进行流式传输. 在命令字符串中使用变量和“for循环”简化了现有脚本的重用,并有助于自动化它们的操作. 虽然你不能在Windows命令窗口中使用这些脚本, 你可以在Windows上使用微软PowerShell,在Linux和Mac上使用Bash. 在本教程中,您将学习如何使用PowerShell和Bash创建和运行这样的脚本.
14 Mar 2023
而不是专注于随机的任务, 本教程将带您了解使用最新版本的FFmpeg进行编码的基础知识.
27 Mar 2022
CMAF has reached maturity. 下面是使用它的一种方法,使用AWS Elemental MediaConvert
20 Mar 2020
看看什么是自适应流, 主要技术提供者, 以及在选择自适应流媒体技术时应该考虑的因素
28 Apr 2011