如何将mov/mp4文件重新打包到具有多个音频流的HLS播放列表中



我正在尝试将包含一个视频流多个音频流频流。

我已经浏览了很多堆栈线程,并尝试了许多不同的方法,但我只能找到用不同音频创建不同HLS播放列表的答案。

我必须处理的示例场景:

  1. 我有一个mov文件,包含一个视频流和两个音频流
  2. 我需要从这个mov文件创建一个HLS播放列表,它将使用这一个视频流,但将这两个音频流编码为语言音轨(所以假设它是ENG和FRA(
  3. 这样准备好的HLS可以稍后在播放器中进行流式传输,并且最终用户在观看剪辑时可以在音轨之间切换

我所能实现的是创建多个hls播放列表,每个播放列表都有不同的音轨。

ffmpeg -i "file_name.mp4" 
-map 0:v -map 0:a -c:v copy -c:a copy -start_number 0 
-f hls 
-hls_time 10 
-hls_playlist_type vod 
-hls_list_size 0 
-master_pl_name master_playlist_name.m3u8 
-var_stream_map "v:0,agroup:groupname a:0,agroup:groupname,language:ENG a:1,agroup:groupname" file_name_%v_.m3u8

我最大的问题是,我很难理解-map-var_stream_map选项在我的情况下应该如何使用,或者它们是否应该在这种情况下使用。

ffmpeg -i命令对应转换为HLS的原始mov文件的结果示例。

Stream #0:0[0x1](eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080, 8786 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
Metadata:
handler_name    : Apple Video Media Handler
vendor_id       : [0][0][0][0]
timecode        : 00:00:56:05
Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 127 kb/s (default)
Metadata:
handler_name    : SoundHandler
vendor_id       : [0][0][0][0]
Stream #0:2[0x3](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 127 kb/s
Metadata:
handler_name    : SoundHandler
vendor_id       : [0][0][0][0]

我也查看了这篇博客文章,我想达到这个确切的效果,但用视频,而不是音频。

例如,-var_stream_map"v: 0,a:0v:1,a:0V:2,a:0";暗示在所有三个视频呈现中都使用由a:0表示的音频流。

stream_map看起来不错。然而,hls_muxer将不会创建有效的hls播放列表,因为它缺少来自输入流的编解码器和比特率信息,因为音频和视频流被复制(记住-c:v copy -c:a copy(并且没有被解析/重新编码。要添加这些,请使用-tag-b选项为HLS中的所有视频和音频流指定属性。

视频流示例:-tag:v:0 h264 -b:v:0 8786k

最新更新