Jak przekonwertować 1080 @ 50i -> 720 @ 50p za pomocą ffmpeg?


9

Naprawdę lubię wideo 50 FPS, ale nie mogę przekonwertować go na 50 FPS.

Rozdzielczość 720p jest dla mnie absolutnie w porządku, po prostu potrzebuję więcej FPS.

50i po prostu wygląda znacznie płynniej w odpowiednich odtwarzaczach (na przykład GOM Player usuwa przeplot wideo i odtwarza go przy 50 Hz. Bardzo duża różnica w stosunku do wideo 25 Hz.) ...

Mój obecny wiersz poleceń to:

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

Oto więcej szczegółów wideo. Źródło wideo pochodzi z kamery 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

Co masz na myśli mówiąc „nie można zrobić”? Czy to daje błędy?
Tylko Jake

W odpowiednim odtwarzaczu tworzy plik, który wygląda jak 25p, a nie tak gładki jak 50i.
BarsMonster,

@slhck Proszę bardzo
BarsMonster

Jakikolwiek konkretny powód kodowania do MPEG-4 Visual zamiast ponownego użycia h.264 (np. -vcodec libx264? Nie to, że powinno to mieć tak duże znaczenie przy ~ 20 MBit / s, ale nadal.
slhck

@slhck cóż, to jest po prostu domyślne :-)
BarsMonster

Odpowiedzi:



7

Podobnie jak przeplatanie progresywnej treści dzieli każdą ramkę na 2 pola, podwajając w ten sposób liczbę klatek, powszechną metodą usuwania przeplotu jest łączenie każdego z 2 pól w 1 ramkę, co zmniejsza szybkość o 2, a zatem przyjmuje 50 do 25 klatek na sekundę. Możesz oczywiście podwoić każdą ostatnią klatkę, ale to nie daje żadnych korzyści.

Po pierwsze, możemy przeczytać, aby nie używać opcji -deinterlace i yadif (co już robisz):

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

Prawdopodobnie interesująca będzie sekcja yadif dokumentacji FFMPEG:

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. 

Zauważ, że domyślnym TRYBEM jest 0, co instruuje FFMPEG, aby wysyła 1 ramkę dla każdego 2 pól, zmniejszając w ten sposób fps o połowę. Myślę, że szukasz TRYB 1: jedna klatka na pole . Nie jestem zbyt pewien, jak korzystać z tych opcjonalnych parametrów, ale może coś w tym rodzaju

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

Przynajmniej daje to 50 klatek na sekundę, ale niestety 2 generowane sekwencyjne klatki są bardzo podobne ... Podczas gdy kroczę oryginalną klatkę wideo 50i klatka po klatce, naprawdę widzę, że szybki ruch ma dwa razy więcej „kroków” i jest znacznie płynniejszy.
BarsMonster,

@BarsMonster Najpierw spróbuję dowiedzieć się, co robi odtwarzacz GOM, na wypadek, gdyby wynikało to z jakiejś formy interpolacji. Jestem ciekawy - czy jest tyle treści z przeplotem, które zawierają informacje o wysokiej fps? (W końcu konwersja 25p na 50i do nadawania nie tworzy żadnych nowych informacji o ruchu - potrzebujesz treści wprost z przeplotem). Następnie, jeśli znajdziesz technikę deinterlacting, której używa GOM (patrz wikipedia, jest ich sporo), powinieneś spróbować znaleźć dla niej filtr, który może być użyty w AVISYNTH jako część procesu, zamiast używać metody -YADIF FFMPEG .
mtone

1

Zgodnie z dokumentacją , -ropcja określa plik wyjściowy klatek na sekundę. Na przykład ustawia to wydajność na 50 klatek na sekundę:

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

Niestety, utworzony plik jest mniej więcej taki sam jak dla -r 25. I nie jest już gładki. Wygląda na to, że po prostu wziął film w 25p, a następnie go wrobił.
BarsMonster,

Czy próbowałeś również określić wejściową liczbę klatek na sekundę?
Tylko Jake

3
To jest excetted. Podczas usuwania przeplotu wideo poświęcasz płynny ruch dla zgodności z progresywnymi wyświetlaczami.
Jason

@Jason Cóż, mój odtwarzacz wideo (GOM Player) usuwa przeplot wideo 50i i pokazuje go płynnie (tj. Przy 50 Hz) na moim monitorze TFT 120 Hz, co jest oczywiście progresywne. Dlaczego rekoder wideo nie może zrobić tego samego i zapewnić płynnego wyjścia 50 Hz? Rozumiem, że 50i ma mniej małych szczegółów, ale dlaczego nie mogę oczekiwać, że uzyskam wyjście 50 Hz?
BarsMonster,

Zależy to od zastosowanego filtra usuwania przeplotu. Oczywiście GOM Player robi w tym dobrą robotę. Nie wiem jednak zbyt wiele o tym, jak FFmpeg obsługuje wideo z przeplotem. @BarsMonster
slhck

1

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


1
Niestety, nadal generował zaledwie 25 fps ... Oryginalny plik jest o wiele płynniejszy ... Nawet dodanie -r 50 nie pomogło.
BarsMonster

0

To polecenie działa dla mnie:

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

Źródłem był plik kamery Sony.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.