ffmpeg를 사용하여 1080 @ 50i-> 720 @ 50p를 변환하는 방법?


9

나는 50fps 비디오를 정말 좋아하지만 ffmpeg가 50fps로 변환하도록 만들 수는 없습니다.

720p 해상도는 절대적으로 괜찮습니다. 더 많은 FPS가 필요합니다.

50i는 적절한 플레이어에서 훨씬 매끄럽게 보입니다 (예 : 곰 플레이어는 비디오를 인터레이스 해제하고 50Hz에서 재생합니다. 25Hz 비디오와는 매우 큰 차이).

내 현재 명령 줄은 다음과 같습니다

ffmpeg -i 00010.MTS -threads 3 -filter:v yadif -s "1280x720" -r 50 -b:v 20M output.avi

자세한 비디오 정보는 다음과 같습니다. 소스 비디오는 Cannon HF10 AVCHD 캠코더에서 가져온 것입니다.

ffmpeg -i 00010.MTS -threads 3 -filter:v yadif -s "1280x720" -r 50 -b:v 20M output.avi
ffmpeg version N-37541-g670229e Copyright (c) 2000-2012 the FFmpeg developers
  built on Feb  3 2012 20:14:17 with gcc 4.6.2
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-ru
ntime-cpudetect --enable-avisynth --enable-bzlib --enable-frei0r --enable-libope
ncore-amrnb --enable-libopencore-amrwb --enable-libfreetype --enable-libgsm --en
able-libmp3lame --enable-libopenjpeg --enable-librtmp --enable-libschroedinger -
-enable-libspeex --enable-libtheora --enable-libvo-aacenc --enable-libvo-amrwben
c --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-
libxvid --enable-zlib
  libavutil      51. 37.100 / 51. 37.100
  libavcodec     54.  0.102 / 54.  0.102
  libavformat    54.  0.100 / 54.  0.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
[h264 @ 000000000033FA30] Increasing reorder buffer to 1
Input #0, mpegts, from '00010.MTS':
  Duration: 00:03:13.92, start: 0.482156, bitrate: 16304 kb/s
  Program 1
    Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), yuv420p, 1920x1
080 [SAR 1:1 DAR 16:9], 50 fps, 50 tbr, 90k tbn, 50 tbc
    Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, s16,
256 kb/s
File 'output.avi' already exists. Overwrite ? [y/N] y
w:1920 h:1080 pixfmt:yuv420p tb:1/1000000 sar:1/1 sws_param:
[yadif @ 0000000003CE95B0] mode:0 parity:-1 auto_enable:0
[scale @ 0000000003CE9550] w:1920 h:1080 fmt:yuv420p -> w:1280 h:720 fmt:yuv420p
 flags:0x4
Output #0, avi, to 'output.avi':
  Metadata:
    ISFT            : Lavf54.0.100
    Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 1280x720 [SAR 1:1 DA
R 16:9], q=2-31, 20000 kb/s, 50 tbn, 50 tbc
    Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 48000 Hz, stereo, s16, 128 kb
/s
Stream mapping:
  Stream #0:0 -> #0:0 (h264 -> mpeg4)
  Stream #0:1 -> #0:1 (ac3 -> libmp3lame)
Press [q] to stop, [?] for help
frame=   15 fps=  0 q=2.0 size=     945kB time=00:00:00.62 bitrate=12481.3kbits/
frame=   32 fps= 32 q=2.0 size=    2132kB time=00:00:01.30 bitrate=13435.2kbits/
frame=   51 fps= 34 q=2.0 size=    3372kB time=00:00:02.06 bitrate=13409.2kbits/
frame=   70 fps= 35 q=2.0 size=    4641kB time=00:00:02.82 bitrate=13482.8kbits/
frame=   76 fps= 35 q=2.0 Lsize=    5047kB time=00:00:03.06 bitrate=13511.9kbits

'만들 수 없다'는 무슨 뜻입니까? 오류가 발생합니까?
Just Jake

적절한 플레이어에서 50i만큼 매끄럽지 않고 25p처럼 보이는 파일을 생성합니다.
BarsMonster

@slhck 여기에 간다
BarsMonster

h.264를 다시 사용하는 대신 MPEG-4 Visual으로 인코딩 -vcodec libx264해야하는 특정 이유 (예 : ~
20MBit

잘 @slhck, 그냥 :-) 기본이야
BarsMonster

답변:



7

인터레이스 프로그레시브 콘텐츠가 각 프레임을 2 개의 필드로 분할하여 프레임 속도를 두 배로 늘리는 것처럼 일반적인 디인터레이싱 방법은 각 2 개의 필드를 1 개의 프레임으로 결합하여 속도를 2 씩 줄여서 50fps를 25fps로 만드는 것입니다. 물론 각 최종 프레임을 두 배로 늘릴 수는 있지만 아무런 이점이 없습니다.

먼저 -deinterlace를 사용하지 말고 yadif를 대신 사용하십시오 (이미 수행).

 - deinterlace This option is deprecated since the deinterlacing is very low quality. Use the yadif filter with -filter:v yadif. 

FFMPEG 문서 의 yadif 섹션 이 꽤 흥미로울 것입니다.

Deinterlace the input video ("yadif" means "yet another deinterlacing filter"). 
It accepts the optional parameters: mode:parity:auto. 

MODE specifies the interlacing mode to adopt, accepts one of the following values: 
‘0’
output 1 frame for each frame
‘1’
output 1 frame for each field 
‘2’
like 0 but skips spatial interlacing check 
‘3’
like 1 but skips spatial interlacing check 
Default value is 0. 

PARITY default value is -1.
AUTO default value is 0. 

기본 모드가 0 인 방법에 주목하십시오. 이는 FFMPEG가 2 개의 필드마다 1 개의 프레임을 출력하도록하여 fps를 절반으로 줄입니다. 나는 당신이 찾고있는 것이 MODE 1 : 필드 당 하나의 프레임 이라고 생각 합니다 . 이 선택적 매개 변수를 사용하는 방법을 잘 모르겠지만 아마도

-filter:v yadif 1:-1:0 -s "1280x720" -r 50 

적어도 50fps 출력을 제공하지만 불행히도 생성 된 2 개의 순차적 프레임은 매우 유사합니다. 원래의 50i 비디오 프레임을 단계별로 볼 때 빠른 동작에는 두 배 더 많은 '단계'가 있으며 훨씬 매끄 럽습니다.
BarsMonster

@BarsMonster 먼저, 어떤 형태의 보간으로 인해 GOM 플레이어가 무엇을하는지 알아 내려고합니다. 궁금합니다. 높은 FPS 정보를 포함하는 많은 인터레이스 컨텐츠가 있습니까? 결국 방송을 위해 25p를 50i로 변환해도 새로운 모션 정보가 생성되지 않습니다. 스트 레이스-인터레이스 컨텐츠가 필요합니다. 다음으로, GOM이 사용하는 디 인터 레이팅 기법을 발견 한 경우 (위키 백과 참조, 몇 개가 있음) FFMPEG의 -YADIF 방법 대신 AVISYNTH에서 프로세스의 일부로 사용할 수있는 필터를 찾아야합니다. .
mtone

1

documentation 에 따르면 이 -r옵션은 초당 출력 파일 프레임을 설정합니다. 예를 들어, 이것은 초당 50 프레임으로 출력을 설정합니다.

ffmpeg -i input.avi -r 50 output.avi

불행하게도, 생성 된 파일은 -r 25와 거의 동일합니다. 더 이상 매끄럽지 않습니다. 25p 비디오를 찍은 다음 프레임을 두 배로 늘린 것 같습니다.
BarsMonster

입력 프레임 속도도 지정해 보셨습니까?
Just Jake

3
그것은 흥분된다. 비디오 인터레이스를 제거하면 점진적인 디스플레이와 호환되도록 부드러운 동작을 희생합니다.
Jason

@Jason Well, 내 비디오 플레이어 (GOM 플레이어)는 50i 비디오를 인터레이스 해제하고 120Hz TFT 모니터에서 매끄럽게 (즉, 50Hz로) 보여줍니다. 비디오 리코더가 동일한 작업을 수행 할 수없고 부드러운 50Hz 출력을 생성 할 수없는 이유는 무엇입니까? 50i의 세부 사항은 적지 만 50Hz 출력을 얻을 수없는 이유는 무엇입니까?
BarsMonster

사용 된 디인터레이싱 필터에 따라 다릅니다. 분명히 GOM Player는 이것에서 훌륭한 일을합니다. FFmpeg가 인터레이스 비디오를 처리하는 방법에 대해 너무 많이 알지 마십시오. @BarsMonster
slhck

1

ffmpeg -i input.avi -deinterlace -filter:v yadif -s "1280x720" output.avi


1
불행히도, 그것은 여전히 ​​25fps 출력을 생성했습니다 ... 원본 파일은 훨씬 매끄 럽습니다 .... -r 50을 추가해도 도움이되지 않았습니다.
BarsMonster

0

이 명령은 나를 위해 일하고 있습니다 :

ffmpeg -i source_50i.MTS -aspect 1920:1080 -vf yadif=1,scale=1920:1080 -c:v libx264 -preset fast -profile:v high -crf 23 -ac 2 -strict experimental -c:a aac -b:a 96k -movflags +faststart -y result_50p.mp4

소스는 소니 캠코더 파일이었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.