我在 FFMpeg 中得到了以下命令:
ffmpeg -i file_input.mp4 -filter_complex split=2[i1][i2];[i1]scale=trunc(oh*a/2)*2:480[o1];[i2]scale=trunc(oh*a/2)*2:640[o2] -map [o1] -map 0:a -pix_fmt yuv420p -vcodec libx264 file_out_1.mp4 -map [o2] -map 0:a -pix_fmt yuv420p -vcodec libx264 file_out_2.mp4
此命令的作用是将我的源文件分成两部分,将视频缩放为两种不同的格式,然后使用编解码器重新编码视频流x264
。到目前为止一切顺利。
现在请注意-map 0:a
标志。如果我从两个流中的任何一个中删除它,则生成的输出文件将完全没有音频。这让我怀疑过滤器是否scale
会自动从花束中删除音频,或者是其他原因。
如果我稍微将命令改为这样,并尝试从结果 [o1] 或 [o2] 中获取音频流,但仍然无法获得声音:
ffmpeg -i eFront_sample.mp4 -filter_complex split=2[i1][i2];[i1]scale=trunc(oh*a/2)*2:480[o1];[i2]scale=trunc(oh*a/2)*2:640[o2] -map [o1]:a -pix_fmt yuv420p -vcodec libx264 file_out_1.mp4 -map [o2]:a -pix_fmt yuv420p -vcodec libx264 file_out_2.mp4
我在这里遗漏了什么?
提前致谢。
答案1
蒸汽选择
默认情况下,每个流类型将选择一个流。如果您使用-map
此默认流选择行为将被禁用。
但是,通常建议明确定义过滤器输入和输出,而不是依赖默认值,以避免意外的流选择问题。
规模
trunc(oh*a/2)*2
您可能只需使用 即可。-2
摘自比例视频过滤器文档:
如果其中一个值为 -n 且 n > 1,则缩放过滤器还将使用一个值来保持输入图像的纵横比,该值是根据另一个指定维度计算得出的。但此后,它将确保计算出的维度可以被 n 整除,并在必要时调整该值。
x264 要求在输出 yuv420p 时宽度和高度可以被 2 整除,因此它-2
会假设您声明的值是可以接受的来处理这个问题。
例子
您的结果命令可能看起来像这样:
ffmpeg -i input.mp4 -filter_complex \
"[0:v]split=2[i1][i2]; \
[i1]scale=-2:480,format=yuv420p[o1]; \
[i2]scale=-2:640,format=yuv420p[o2]" \
-map "[o1]" -map 0:a -c:v libx264 output1.mp4 \
-map "[o2]" -map 0:a -c:v libx264 output2.mp4