如何在ffmpeg中使用pad的aspect参数?

如何在ffmpeg中使用pad的aspect参数?

我正在尝试使用 ffmpeg 将来自许多来源的大量文件转换为 426x240 的标准格式,参数如下:

-y -i input.mov -ac 2 -ab 96k -ar 44100 -vcodec libx264 -pix_fmt yuv420p -preset medium -threads 0 -level 1.3 -max_muxing_queue_size 1024 -b:v 438k -r 30000/1001 -s 426x240 output.mp4

尽管这个命令在我使用的 ffmpeg 的旧版本(很多年前)中有效,但在我使用的新版本(4.2.3)中,视频被拉伸为 16:9。在尝试修复它时,我发现了这个回答使用参数:-vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:-1:-1:color=black"。这似乎有效,但我担心我会将结果缩放两次,一次缩放到 1280:720,然后缩小到 426:240。为了防止这种情况,我在 pad 中找到了方面参数文档,但是当我尝试使用它时出现以下错误:

[Parsed_pa​​d_0 @ 00000130808eec80] 不接受负值。
[Parsed_pa​​d_0 @ 00000130808eec80] 无法在 Parsed_pa​​d_0 上配置输入垫
重新初始化过滤器时出错!
无法将帧注入过滤器网络:参数无效
处理流 #0:0 的解码数据时出错

导致此错误的参数(尽管我尝试过多个版本):

-y -i input.mov -ac 2 -ab 96k -ar 44100 -filter:v "pad=x=-1:y=-1:color=black:aspect=16\:9" -vcodec libx264 -pix_fmt yuv420p -preset medium -threads 0 -level 1.3 -max_muxing_queue_size 1024 -b:v 438k -r 30000/1001 -s 426x240 output.mp4

有人可以提供一个如何使用 pad 过滤器的aspect 参数的工作示例吗?

额外细节:

  • 该视频来自 iPhone X。该视频是用手机纵向拍摄的。使用 ffprobe 分析该视频时,显示旋转了 90 度。
  • 我无法更新到最新版本,因为较新版本依赖于 MFPlat.DLL,而我的工作环境中没有该 DLL。吉安没有这个问题。

答案1

理想情况下,方面值应指定为X/Y;避免:,因为它是过滤图中的语法元素。

您的特定视频集的样本宽高比无效。在 pad 前插入 setsar=1。


然而,最简单的解决方案如下

添加

-vf "scale=426:240:force_original_aspect_ratio=decrease,pad=426:240:-1:-1:color=black"

并删除-s 426x240

答案2

恕我直言,子功能 pad:aspect 从宽度开始起作用,因此:

ffmpeg -hide_banner -i "输入 1.mp4" -filter:v "scale='if(gte(dar,16/9),426,-2)':'if(gte(dar,16/9),-2,240)', pad=426:240:'if(gte(dar,16/9),-1,(ow-iw)/2)':'if(gte(dar,16/9),-1,0)'" "输出.mkv"

如果大于 16/9 则“scale=426:-2, pad=426:240:-1:-1”否则“scale=-2:240, pad=426:240:(ow-iw)/2:0”

编辑添加:

例如:宽度=16,高度=7

pad=aspect=16/9 将从宽度评估高度,pad=9-7=2,正值

如果宽度=16,高度=12

这将评估 pad=9-12=-3 负值,导致错误

相关内容