2012-05-31 89 views
1

我有一個mkv視頻,它是多種分辨率錄製的混合,例如,我有寬屏16:9(1024x576)分辨率的前幾秒,如果是4:3(768x576)分辨率,則視頻的其餘部分。我想縮小這個視頻3倍,同時複製所有其他屬性(音頻編解碼器,字幕等)。我使用ffmpeg -i <input_mkv> -vf scale=iw/2:-1 -acodec copy <output_mp4>。此外,VLC將其分辨率檢測爲720x576。使用ffmpeg縮放視頻時保持精確的高寬比

問題是,縮放後,分辨率不斷變成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] 
+1

你真的有一個多個分辨率的視頻流嗎?這不是編解碼器或播放軟件廣泛支持的設置。你可以發佈'ffprobe -show_streams input_mkv'的輸出,以便我們瞭解FFmpeg如何看待文件的組織結構? – blahdiblah

+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' ... 

更換512384用適當的值是必要的。也就是說,我沒有多SAR視頻來測試,所以YMMV。

您也可以查看showinfo filter以獲取有關每個幀的詳細信息,並且可能需要setsar filter,儘管沒有特定於幀的變量會導致難以在中途改變它。

+0

下面是一個示例:http://db.tt/0AOs4x2f。這不起作用,視頻保持它的大小不變。我認爲問題在於ffmpeg會根據第一幀對整個視頻進行SAR處理,然後將其放入整個剩餘視頻中。有沒有一種方法可以讓它在每一幀中查找數據? –

+0

[ffmpeg手冊頁](http://stuff.onse.fi/man?program=ffmpeg§ion=1)對過濾器表達式有相當完整的描述。 – yitwail

相關問題