我正在尝试使用 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_pad_0 @ 00000130808eec80] 不接受负值。
[Parsed_pad_0 @ 00000130808eec80] 无法在 Parsed_pad_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 负值,导致错误