2012-05-31 1 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 (Sample Aspect Ratio) 태그가 붙어있어 플레이어가 재생할 때 디스플레이 종횡비를 찾을 수 있습니다. 이 SAR 값은 MKV로 인코딩 할 때 복사되지 않습니다. 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

여러 해상도의 비디오 스트림이 실제로 있습니까? 코덱이나 재생 소프트웨어에서 널리 지원되는 설정이 아닙니다. FFmpeg가 어떻게 파일의 구성을 보는지 알 수 있도록'ffprobe -show_streams input_mkv'의 출력을 게시 할 수 있습니까? – 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입니다.

setsar filter과 같이 각 프레임에 대한 자세한 정보를 보려면 showinfo filter을 살펴보아야 할 수도 있지만 프레임 별 변수가 없기 때문에 중도 변경이 어려울 수 있습니다.

+0

다음은 샘플입니다. http://db.tt/0AOs4x2f. 동영상이 일정 크기로 유지됩니다. 문제는 ffmpeg가 첫 번째 프레임을 기반으로 전체 비디오에 대해 SAR을 취하고 나머지 비디오 전체에 간단히 넣는다는 것입니다. 각 프레임의 데이터를 찾을 수있는 방법이 있습니까? –

+0

[ffmpeg 맨 페이지] (http://stuff.onse.fi/man?program=ffmpeg§ion=1)에는 필터 표현식에 대한 설명이 상당히 있습니다. – yitwail