Wie konvertiere ich 1080 @ 50i -> 720 @ 50p mit ffmpeg?


9

Ich mag 50fps-Videos wirklich, aber ich kann ffmpeg nicht dazu bringen, sie für mich in 50fps zu konvertieren.

720p Auflösung ist absolut in Ordnung für mich, brauche nur mehr FPS.

50i sieht in richtigen Playern einfach viel flüssiger aus (zum Beispiel Gter Player deinterlaces Video und spielt es mit 50 Hz ab. Sehr großer Unterschied zu 25 Hz Video.) ...

Meine aktuelle Befehlszeile lautet:

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

Hier finden Sie weitere Videodetails. Das Quellvideo stammt vom Cannon HF10 AVCHD-Camcoder.

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

Was meinst du mit "kann nicht machen"? Gibt es Ihnen Fehler?
Nur Jake

Es erzeugt eine Datei, die wie 25p aussieht und im richtigen Player nicht so flüssig wie 50i ist.
BarsMonster

@slhck Hier geht es
BarsMonster

Ein bestimmter Grund für die Codierung in MPEG-4 Visual anstelle der erneuten Verwendung von h.264 (z -vcodec libx264. B. Nicht, dass es bei ~ 20 MBit / s so wichtig sein sollte, aber dennoch.
slhck

@slhck gut, es ist nur Standard :-)
BarsMonster

Antworten:



7

Genau wie das Interlacing von progressivem Inhalt jeden Frame in zwei Felder unterteilt und so die Framerate verdoppelt, besteht die übliche Methode des Deinterlacing darin, jeweils zwei Felder zu einem Frame zu kombinieren, wodurch die Rate um 2 verringert wird und 50 in 25 fps umgewandelt werden. Sie können natürlich jeden letzten Frame verdoppeln, aber das bietet keinen Vorteil.

Erstens können wir lesen, nicht -deinterlace und stattdessen yadif zu verwenden (was Sie bereits tun):

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

Sie werden wahrscheinlich den yadif-Abschnitt der FFMPEG-Dokumentation ziemlich interessant finden:

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. 

Beachten Sie, dass der Standard-MODUS 0 ist, wodurch FFMPEG angewiesen wird, 1 Frame für jeweils 2 Felder auszugeben, wodurch die fps halbiert werden. Ich denke, was Sie suchen, ist MODE 1: ein Frame pro Feld . Ich bin mir nicht sicher, wie ich diese optionalen Parameter verwenden soll, aber vielleicht so etwas

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

Zumindest gibt es eine Ausgabe von 50 fps, aber leider sind 2 erzeugte sequentielle Frames sehr ähnlich ... Wenn ich das ursprüngliche 50i-Video Frame für Frame schritt, sehe ich wirklich, dass Zeitraffer zweimal mehr "Schritte" und viel flüssiger sind.
BarsMonster

@BarsMonster Zuerst würde ich versuchen herauszufinden, was der GOM-Player tut, falls dies auf irgendeine Form der Interpolation zurückzuführen ist. Ich bin neugierig - gibt es so viele Interlaced-Inhalte, die High-FPS-Informationen enthalten? (Schließlich werden durch die Konvertierung eines 25p in 50i für die Übertragung keine neuen Bewegungsinformationen erstellt. Sie benötigen Inhalte, die sich nur auf Interlaced beziehen.) Wenn Sie eine von GOM verwendete Deinterlacting-Technik finden (siehe Wikipedia, es gibt einige), sollten Sie versuchen, einen Filter dafür zu finden, der in AVISYNTH als Teil des Prozesses verwendet werden kann, anstatt die -YADIF-Methode von FFMPEG zu verwenden .
Ton

1

Gemäß der Dokumentation , die -rSet Option , um die Ausgabedatei Frames pro Sekunde. Dies setzt beispielsweise die Ausgabe auf 50 Bilder pro Sekunde:

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

Leider ist die erzeugte Datei ungefähr die gleiche wie für -r 25. Und sie ist nicht mehr glatt. Es sieht so aus, als hätte es nur ein 25p-Video aufgenommen und es dann gerahmt.
BarsMonster

Haben Sie versucht, auch die Eingangsframerate anzugeben?
Nur Jake

3
Das ist erschöpft. Wenn Sie ein Video deinterlazieren, opfern Sie eine gleichmäßige Bewegung, um mit progressiven Anzeigen kompatibel zu sein.
Jason

@Jason Nun, mein Videoplayer (GOM Player) deinterlaces 50i-Video und zeigt es reibungslos (dh bei 50 Hz) auf meinem 120-Hz-TFT-Monitor, was offensichtlich progressiv ist. Warum kann ein Videorecoder nicht dasselbe tun und eine reibungslose 50-Hz-Ausgabe erzeugen? Ich verstehe, dass 50i weniger kleine Details enthält, aber warum kann ich nicht mit einer 50-Hz-Ausgabe rechnen?
BarsMonster

Dies hängt vom verwendeten Deinterlacing-Filter ab. Offensichtlich macht GOM Player hier einen guten Job. Ich weiß allerdings nicht viel darüber, wie FFmpeg mit Interlaced-Videos umgeht. @BarsMonster
slhck

1

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


1
Leider hat es immer noch nur 25 fps ausgegeben ... Die Originaldatei ist viel flüssiger ... Selbst das Hinzufügen von -r 50 hat nicht geholfen.
BarsMonster

0

Dieser Befehl funktioniert für mich:

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

Die Quelle war eine Sony-Camcorder-Datei.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.