我正在尝试将包含一个视频流和多个音频流频流。
我已经浏览了很多堆栈线程,并尝试了许多不同的方法,但我只能找到用不同音频创建不同HLS播放列表的答案。
我必须处理的示例场景:
- 我有一个mov文件,包含一个视频流和两个音频流
- 我需要从这个mov文件创建一个HLS播放列表,它将使用这一个视频流,但将这两个音频流编码为语言音轨(所以假设它是ENG和FRA(
- 这样准备好的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