![无需重新编码视频文件即可纠正宽高比](https://linux22.com/image/1448917/%E6%97%A0%E9%9C%80%E9%87%8D%E6%96%B0%E7%BC%96%E7%A0%81%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%E5%8D%B3%E5%8F%AF%E7%BA%A0%E6%AD%A3%E5%AE%BD%E9%AB%98%E6%AF%94.png)
我有一个具有以下属性的视频流:
Stream #0:0: Video: mpeg4 (Advanced Simple Profile) (XVID / 0x44495658), yuv420p, 720x416 [SAR 1:1 DAR 45:26], 1908 kb/s, 25 fps, 25 tbr, 25 tbn, 25 tbc
当我在 VLC 中运行它时,我必须按“A”将纵横比更改为“4:3”,以使视频以正确的纵横比显示。
查看视频事实,错误是 a) 实际视频在像素数据中被错误地拉伸,还是 b) 只是一些元数据值被错误设置?
如果是前者,我知道我可以重新编码视频并更改宽度和高度。但如果是后者,我应该运行什么 ffmpeg 命令来修复元数据,而无需重新编码视频本身?
答案1
样本长宽比 (SAR) 和显示长宽比 (DAR) 之间存在差异。如果您想将视频更改为以 4:3 显示,则需要更改图像中的实际像素(通过缩放像素并更改 SAR),或者在容器级别设置元数据标志,告诉外部媒体播放器将图像拉伸到所需的 DAR。
如果不应用视频滤镜,您将无法缩放像素并更改 SAR。如果您选择此方法,您将需要对文件进行转码 - 因为您无法在应用视频滤镜时“流复制”视频流。
要缩放图像并更改 SAR(转码时),请尝试:
ffmpeg -i <INPUT_FILE> -vf scale=720:540 -c:v <Video_Codec> <OUTPUT_FILE>
另一方面,如果您只想更改元数据标志并调整 DAR,您将能够流式复制视频。为此,请尝试:
ffmpeg -i <INPUT_FILE> -aspect 720:540 -c copy [OUTPUT_FILE]
答案2
改变特区无需重新编码也可以ffmpeg
使用,正如 Gyan 指出的.mp4
那样h264_metadata
这里:
ffmpeg -i in.mp4 -c copy -bsf:v "h264_metadata=sample_aspect_ratio=4/3" out.mp4
答案3
德尔加多的回答MP4Box 可以做到这一点是正确的,但该-par
选项并不像描述的那样工作。使用一个-out
参数(以免干扰您的原始文件):
mp4box source.mp4 -out target.mp4 -par stream-number=width:height
使用 时-par stream-number=width:height
,您定义像素宽高比 - 即设备宽高比除以存储宽高比的结果。(同样,您描述的是源像素的宽高比。)例如,假设您的 DVD 源为 720×480,正确的显示宽高比为 4:3。在这种情况下,您需要:
mp4box source.mp4 -out target.mp4 -par 1=8:9
因为 (4/3) / (720/480) = 8/9。
如果源代表真正的 SD NTSC 像素(在这种情况下,只有中央 704×480 像素应该映射到 4×3 屏幕,两侧有 8 个像素过扫描),则正确的命令将是:
mp4box source.mp4 -out target.mp4 -par 1=10:11
因为 (4/3) / (704/480) = 10/11 – 恰好是标准清晰度 NTSC 视频的参考像素宽高比。
对于问题中给出的情况,如果它确实是 4:3,则会产生非常奇怪的像素纵横比:(4/3)/(720/416) = 104/135。它的宽度为 720,这表明它是 DVD 源;它是 25 fps 的视频,这表明它是 PAL,但 PAR 小于 1,这表明它是 NTSC。我想它可能是 4:5(非常接近 104:135),但我不知道有什么可以产生该像素纵横比;也许先试试这个,然后如果它在水平方向上看起来仍然有点太拉伸,则尝试 3:4。当然,如果您确定它正好是 4:3,则只需使用 104:135。
答案4
使用此命令行来更改分辨率和显示纵横比。
ffmpeg -i "input file" -vf scale=$w:$h -aspect $w:$h "output file"
或者
ffmpeg -i "input file" -vf -vf scale=$w:$h -aspect x:y "output file"
$w
- 分辨率宽度
$h
- 分辨率高度
x
- 宽高比宽度
y
- 宽高比高度
笔记:
如果
-aspect x:y
不放置-vf scale=$w:$h
,则输出将仅改变显示纵横比。如果
-vf scale=$w:$h
不放置-aspect x:y
,则输出将仅改变分辨率。该命令
-vf scale=$w:-1
或scale=-1:$h
并不总是提供预期的输出,因此为了确保获得分辨率和纵横比的变化,您只需使用上述命令行即可。
** 我只尝试过输入.mkv和输出.mkv文件,因为这只是我目前正在处理的内容。您可以随意尝试处理其他文件类型。