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

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

我正在尝试使用以下链的等效项创建一个模拟实时 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"

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

帮助?

答案1

为了在输出中插入多个流,每个输入流都需要明确映射。编码选项本身不会在输出中创建流分配。存在自动流选择的问题,这不适用于此处,但您可以在以下位置阅读有关内容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"

相关内容