ffmpeg:使用包含1个音频和3个视频的单个程序输出mpegts


2

我正在尝试使用以下链的等效物制作模拟的实时HLS / DASH服务器:

tsplay -loop multi_resolution.ts | shaka_packager | nginx

问题是创建文件“multi_resolution.ts”:它需要包含一个带有1个音频和3个视频PID的程序,分别为720p,480p和360p。为什么?因为这是shaka_packager需要它的方式。

我想我对如何将转码后的流映射到输出文件感到困惑。在这里,我一直在努力的非工作命令:

ffmpeg -i "big_buck_bunny_1080p.mov" -threads 16 \
    -c:a aac -ac 2 -b:a:0 128k \
    -c:v libx264 -pix_fmt yuv420p -profile:v high -level 4.0 -preset veryslow -tune film \
        -vsync cfr -x264-params "nal-hrd=cbr" \
        -b:v:1 5000k -minrate 2000k -maxrate 2000k -bufsize 4000k -g 30 -s 1280x720 \
    -c:v libx264 -pix_fmt yuv420p -profile:v high -level 4.0 -preset veryslow -tune film \
        -vsync cfr -x264-params "nal-hrd=cbr" \
        -b:v:2 1500k -minrate 1000k -maxrate 1000k -bufsize 2000k -g 30 -s 854x480 \
    -c:v libx264 -pix_fmt yuv420p -profile:v high -level 4.0 -preset veryslow -tune film \
        -vsync cfr -x264-params "nal-hrd=cbr" \
        -b:v:3 500k -minrate 500k -maxrate 500k -bufsize 1000k -g 30 -s 640x360 \
    -program program_num=1:title=multi_p30:st=0:st=1:st=2:st=3 \
    -f mpegts "big_buck_bunny_720_480_360.ts"

我单独测试了每个编码,它们看起来很好。我怀疑问题出在我的流管理/映射上。

救命?

Answers:


2

为了在输出中插入多个流,需要明确映射每个输入流。编码选项本身不会在输出中创建流分配。有自动流选择的问题,这里不适用,但你可以在https://ffmpeg.org/ffmpeg.html#Stream-selection上阅读它。

所以,

ffmpeg -i "big_buck_bunny_1080p.mov" -threads 16 \
    -map 0:a -map 0:v -map 0:v -map 0:v \
    -c:a aac -ac 2 -b:a 128k \
    -s:v:0 1280x720 -s:v:1 854x480-s:v:2 640x360 \
    -g 30 -c:v libx264 -pix_fmt yuv420p -profile:v high -level 4.0 -preset veryslow -tune film \
    -vsync cfr -x264-params "nal-hrd=cbr" \
    -b:v:0 5000k -minrate:v:0 2000k -maxrate:v:0 2000k -bufsize:v:0 4000k \
    -b:v:1 1500k -minrate:v:1 1000k -maxrate:v:1 1000k -bufsize:v:1 2000k \
    -b:v:2 500k -minrate:v:2 500k -maxrate:v:2 500k -bufsize:v:2 1000k \
    -program program_num=1:title=multi_p30:st=0:st=1:st=2:st=3 \
    -f mpegts "big_buck_bunny_720_480_360.ts"

啊,所以我在开始时创建映射,然后用不同的内容覆盖它。但是,我仍然需要对不同的分辨率进行3种编码,而不仅仅是不同的比特率。而我的“:n”跟在-c:v之后,而不是-b:v,对吧?
BobC

大小,编解码器,比特率都是每个流的选项,所以对于每个输出流,该选项应该用键设置-option:stream_type:index
Gyan

我再次感到困惑:假设我想添加一个文本叠加层。我可以在映射之前将其应用于单个视频流,以便后续的3个输出编码中的每一个都包含它吗?或者必须在映射后应用于3个视频流中的每一个?
BobC

-vf是短期的-filter:v,以便一个-vf-filter:v参数将被应用到所有的输出视频流。如果您想为每个流应用不同的叠加表达式,那么您将添加-filter:v:0 filters0 -filter:v:1 filters1-filter:v:2 filters2。在单个输出文件中,选项的顺序无关紧要,因此映射可以在过滤器之前或之后或比特率。
Gyan

另外,请参阅我的回答superuser.com/q/1219784/114058
Gyan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.