无需重新编码视频文件即可纠正宽高比

无需重新编码视频文件即可纠正宽高比

我有一个具有以下属性的视频流:

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:-1scale=-1:$h并不总是提供预期的输出,因此为了确保获得分辨率和纵横比的变化,您只需使用上述命令行即可。

** 我只尝试过输入.mkv输出.mkv文件,因为这只是我目前正在处理的内容。您可以随意尝试处理其他文件类型。

相关内容