我有一个mkv视频,它是多种分辨率记录的混合,例如我有宽屏16:9(1024x576)分辨率的前几秒,以及视频的其余部分,如果4:3(768x576)分辨率。我想缩小此视频3次,同时复制所有其他属性(音频编解码器,字幕等)。我使用ffmpeg -i <input_mkv> -vf scale=iw/2:-1 -acodec copy <output_mp4>
。此外,VLC将其分辨率检测为720x576。
问题是缩放后,分辨率不断变为4:3(360x288)。如何保持输入视频文件的动态宽高比,即16:9部分缩放到16:9,而4:3部分缩放到4:3?
更新
当切换分辨率时,播放器大小实际上会改变,至少在mplayer中。我想出了主要问题。似乎每个帧都标有样本纵横比(SAR),因此当播放器播放时,它可以找到显示宽高比。编码为MKV时,不会复制此SAR值。当编码为MPG时,它会被复制,我得到一个精确的副本,玩家切换大小,但没有MKV。
ffprobe -show_streams filename
的输出:
ffprobe version 0.10.3 Copyright (c) 2007-2012 the FFmpeg developers
built on May 9 2012 17:51:07 with gcc 4.7.0 20120505 (prerelease)
configuration: --prefix=/usr --enable-libmp3lame --enable-libvorbis --enable-libxvid --enable-libx264 --enable-libvpx --enable-libtheora --enable-libgsm --enable-libspeex --enable-postproc --enable-shared --enable-x11grab --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libschroedinger --enable-libopenjpeg --enable-librtmp --enable-libpulse --enable-gpl --enable-version3 --enable-runtime-cpudetect --disable-debug --disable-static
libavutil 51. 35.100 / 51. 35.100
libavcodec 53. 61.100 / 53. 61.100
libavformat 53. 32.100 / 53. 32.100
libavdevice 53. 4.100 / 53. 4.100
libavfilter 2. 61.100 / 2. 61.100
libswscale 2. 1.100 / 2. 1.100
libswresample 0. 6.100 / 0. 6.100
libpostproc 52. 0.100 / 52. 0.100
Input #0, matroska,webm, from 'sample.mkv':
Metadata:
title : Pan prstenu. Dve veze
Duration: 00:00:29.80, start: 0.000000, bitrate: 3124 kb/s
Stream #0:0(eng): Video: mpeg2video (Main), yuv420p, 720x576 [SAR 64:45 DAR 16:9], 15000 kb/s, 25 fps, 25 tbr, 1k tbn, 50 tbc (default)
Stream #0:1(cze): Audio: mp2, 48000 Hz, stereo, s16, 128 kb/s (default)
[STREAM]
index=0
codec_name=mpeg2video
codec_long_name=MPEG-2 video
codec_type=video
codec_time_base=1/50
codec_tag_string=[0][0][0][0]
codec_tag=0x0000
width=720
height=576
has_b_frames=1
sample_aspect_ratio=64:45
display_aspect_ratio=16:9
pix_fmt=yuv420p
level=8
timecode=16:35:19:10
id=N/A
r_frame_rate=25/1
avg_frame_rate=25/1
time_base=1/1000
start_time=0.000000
duration=N/A
nb_frames=N/A
TAG:language=eng
[/STREAM]
[STREAM]
index=1
codec_name=mp2
codec_long_name=MP2 (MPEG audio layer 2)
codec_type=audio
codec_time_base=1/48000
codec_tag_string=[0][0][0][0]
codec_tag=0x0000
sample_fmt=s16
sample_rate=48000
channels=2
bits_per_sample=0
id=N/A
r_frame_rate=0/0
avg_frame_rate=125/3
time_base=1/1000
start_time=0.000000
duration=N/A
nb_frames=N/A
TAG:language=cze
[/STREAM]
答案 0 :(得分:3)
FFmpeg视频过滤器有surprisingly rich set of logical functions用于构建复杂过滤器,您应该可以使用它们来保存文件中不断变化的SAR。尝试这样的事情:
ffmpeg ... -vf scale='if(gt(dar\, 4/3)\, 512) + ifnot(gt(dar\, 4/3)\, 384):-1' ...
根据需要用适当的值替换512
和384
。也就是说,我没有要测试的多SAR视频,所以YMMV。
您也可以查看showinfo
filter以获取有关每个帧的极其详细的信息,并可能获得setsar
filter,但缺少特定于帧的变量会表明难以在中途更改它。