FFmpeg

Leider wird der MPlayer/MEncoder seit ein paar Jahren nicht mehr aktiv weiter entwickelt, weil es zu wenig Leute im Team gibt.

allgemeines

Infos über einen Film auslesen:

# ffmpeg -i Film.mpg
# ffmpeg -i <rein>

Film im “RAW YUV420P“-Format in eine Datei schreiben:

# ffmpeg -i <rein> -o <raus>.yuv

aus der Video-Datei „a.yuv“ mit der Auflösung „720×576“ und der Audio-Datei „a.wav“ den MPEG-Film „a.mpg“ umwandeln:

# ffmpeg -i a.wav -s 720x576 -i a.yuv a.mpg

Film im “RAW YUV420P“-Format an eine Pipe übergeben:

# ffmpeg       -i <rein> -an -vcodec rawvideo -pix_fmt yuv420p -f matroska <raus>.mkv
# ffmpeg       -i <rein> -an -vcodec rawvideo -pix_fmt yuv420p -f rawvideo - | ...
# ffmpeg -r 25 -i <rein> -an -vcodec rawvideo -pix_fmt yuv420p -f rawvideo -v 0 -vsync 0 -r 25 - | ...
# ffmpeg -r 25 -i <rein> -an -vcodec rawvideo -pix_fmt yuv420p -f rawvideo -v 0 -vsync 0 -r 25 -s 720x320 - | ...
# ffmpeg -r 25 -i <rein> -an -vcodec rawvideo -pix_fmt yuv420p -f rawvideo -v 0 -vsync 0 -r 25 -s 704:432 -vf crop=704:432:08:72 - | ...

Audio und Video trennen

Manchmal ist es nötig die Audio- und Videospur getrennt zu bearbeiten.

Audiospur extrahieren

erste Tonspur aus dem Film extrahieren:

# ffmpeg -i <rein> -vn <raus>.wav
  • -vn die Videospur wird nicht benötigt

nicht nur die erste Tonspur extrahieren

Nummern der einzelnen Tonspuren ermitteln:

# ffmpeg -i <rein>
...
    Duration: 00:01:56.38, start: 0.287267, bitrate: 430530 kb/s
    Stream #0.0[0x1e0]: Video: mpeg2video (Main), yuv420p, 720x576 [PAR 64:45 DAR 16:9], 9800 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0.1[0x25]: Subtitle: dvdsub
    Stream #0.2[0x26]: Subtitle: dvdsub
    Stream #0.3[0x27]: Subtitle: dvdsub
    Stream #0.4[0x28]: Subtitle: dvdsub
    Stream #0.5[0x29]: Subtitle: dvdsub
    Stream #0.6[0x2a]: Subtitle: dvdsub
    Stream #0.7[0x2b]: Subtitle: dvdsub
    Stream #0.8[0x2c]: Subtitle: dvdsub
    Stream #0.9[0x2d]: Subtitle: dvdsub
    Stream #0.10[0x2e]: Subtitle: dvdsub
    Stream #0.11[0x2f]: Subtitle: dvdsub
    Stream #0.12[0x30]: Subtitle: dvdsub
    Stream #0.13[0x31]: Subtitle: dvdsub
    Stream #0.14[0x32]: Subtitle: dvdsub
    Stream #0.15[0x80]: Audio: ac3, 48000 Hz, 5.1, s16, 384 kb/s
    Stream #0.16[0x81]: Audio: ac3, 48000 Hz, 5.1, s16, 384 kb/s
    Stream #0.17[0x82]: Audio: ac3, 48000 Hz, 5.1, s16, 384 kb/s
    Stream #0.18[0x83]: Audio: ac3, 48000 Hz, stereo, s16, 192 kb/s
    Stream #0.19[0x84]: Audio: ac3, 48000 Hz, 5.1, s16, 384 kb/s

Hier sehen wir, dass die Tonspuren die Nummern von „0.15“ bis „0.19“ haben.

zweite Tonspur aus dem Film extrahieren:

# ffmpeg -i <rein> -vn -map 0.16 <raus>.wav
...
Stream mapping:
  Stream #0.16 -> #0.0
...

dritte Tonspur aus dem Film extrahieren:

# ffmpeg -i <rein> -vn -map 0.17 <raus>.wav
...
Stream mapping:
  Stream #0.17 -> #0.0
...

Tonspur transcodieren

Wie die Tonspur vom WAVE- in MP3-Format transcodiert wird, steht hier : von WAV zu MP3.

zum Beispiel so (nur stereo):

# lame -q 0 -V 3 tonspur.wav tonspur.mp3

5.1 Kanäle erhalten und in ein 5.1 AAC (M4A) übertragen:

# faac -I 5,6 -C 6 -q 160 -w -o tonspur.m4a tonspur.wav

Videospur extrahieren

# ffmpeg -i <rein> -an -vcodec copy film_stumm.mp4
  • -an ohne Ton
  • -vcodec copy die Videospur unverändert kopieren

Audio und Video wieder zu einem Film vereinen

# ffmpeg -i film_stumm.mp4 -i tonspur.mp3 -vcodec copy -async 10 -ab 128k <raus>.mp4
  • -vcodec copy (Videospur nicht verändern, nur kopieren)
  • -async 10 (Da die Tonspur jetzt etwas länger ist, muss hier angepasst werden)
  • -ab 128k (Bitrate der Tonspur)

eine kleine Kurzanleitung

Bei diesen Test's hatte der Audio-Codec “AAC“ einen verzerrten klang ergeben…

mpeg1/mp2/mpeg

# rm -f ffmpeg2pass-*.log
# ffmpeg -i <rein> -b 3000k -pass 1 -y <raus>.mpg
# ffmpeg -i <rein> -b 3000k -pass 2 -y <raus>.mpg
# rm -f ffmpeg2pass-*.log

mpeg2/mp2/mpeg

# rm -f ffmpeg2pass-*.log
# ffmpeg -i <rein> -b 3000k -vcodec mpeg2video -pass 1 -y <raus>.mpg
# ffmpeg -i <rein> -b 3000k -vcodec mpeg2video -pass 2 -y <raus>.mpg
# rm -f ffmpeg2pass-*.log

mpeg4/mp2 (ASP/DivX5)

# ffmpeg -i <rein> -vcodec mpeg4 -y <raus>.avi
# ffmpeg -i <rein> -vcodec mpeg4 -y <raus>.mkv

mpeg4/aac/mp4 (ASP/DivX5)

# ffmpeg -i <rein> -vcodec mpeg4 -y <raus>.mp4

mpeg4/mp3 (ASP/DivX5)

# ffmpeg -i <rein> -acodec libmp3lame -y <raus>.avi
# ffmpeg -i <rein> -acodec libmp3lame -y <raus>.mp4
# ffmpeg -i <rein> -acodec libmp3lame -y <raus>.mkv

mpeg4/mp2/avi (ASP/Xvid)

# ffmpeg -i <rein> -vcodec libxvid -y <raus>.avi

mpeg4/mp3/avi (ASP/Xvid)

# ffmpeg -i <rein> -vcodec libxvid -acodec libmp3lame -y <raus>.avi

mpeg4/mp2 (AVC)

Bei dem x264-Codec reicht der Parameter “-vcodec“ nicht mehr aus (wie bei den oben genannten), hier muss noch ein „Preset“ mit dem Parameter “-vpre“ angegeben werden.

# ffmpeg -i <rein> -vcodec libx264 -vpre max -y <raus>.avi
# ffmpeg -i <rein> -vcodec libx264 -vpre max -y <raus>.mkv

mpeg4/aac/mp4 (AVC)

# ffmpeg -i <rein> -vcodec libx264 -vpre max -y <raus>.mp4

mpeg4/aac/mkv (AVC)

# ffmpeg -i <rein> -vcodec libx264 -vpre max -acodec libfaac -y <raus>.mkv

mpeg4/aac/mp4 (AVC)

# ffmpeg -i <rein> -vcodec libx264 -vpre max -y <raus>.mp4

mpeg4/mp3 (AVC)

# ffmpeg -i <rein> -vcodec libx264 -vpre max -acodec libmp3lame -y <raus>.avi
# ffmpeg -i <rein> -vcodec libx264 -vpre max -acodec libmp3lame -y <raus>.mp4
# ffmpeg -i <rein> -vcodec libx264 -vpre max -acodec libmp3lame -y <raus>.mkv

AVC mit FFmpeg

2009-07-06

FFmpeg ist zwar das Original, von denen stammt die lavc ab, aber leider stirbt er bei großen Dateien.

Ich bin fast verrückt geworden als ich einen MPEG2-Film, der per DVB-T im HD-Format (1920×800) aufgenommen wurde, ins AVC-Format mit der Auflösung von 720×432 transcodieren wollte.

Egal welche Parameter ich gewählt habe und auf welche Weise ich es versucht hatte, FFmpeg brach immer irgendwo nach der Hälfte ab.

Erst mit dem MEncoder hab ich es ordentlich hin bekommen, der hat es direkt gemacht, aber auch, wenn er die Daten im YUV-Format an x264-Encoder übergeben hat.

FFmpeg mit libx264

Bei dem x264-Codec reicht der Parameter “-vcodec“ nicht mehr aus (wie bei den oben genannten), hier muss noch ein „Preset“ mit dem Parameter “-vpre“ angegeben werden.

Um zu sehen welche Codecs in der aktuellen Installation von FFmpeg unterstützt werden, gibt man folgendes ein:

# ffmpeg -formats
...
File formats:
 DE ac3             raw AC-3
 DE eac3            raw E-AC-3
 DE h264            raw H.264 video format
  E ipod            iPod H.264 MP4 format
 DE mp3             MPEG audio layer 3
...
Codecs:
 DEA    ac3             ATSC A/52A (AC-3)
 D A    atrac3          Atrac 3 (Adaptive TRansform Acoustic Coding 3)
 D A    eac3            ATSC A/52B (AC-3, E-AC-3)
 D V D  h264            H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
 D V D  h264_vdpau      H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (VDPAU acceleration)
  EA    libvorbis       libvorbis Vorbis
 D A    mp3             MP3 (MPEG audio layer 3)
 D A    mp3adu          ADU (Application Data Unit) MP3 (MPEG audio layer 3)
 D A    mp3on4          MP3onMP4
 DEVSDT mpeg4           MPEG-4 part 2
 DEVSD  msmpeg4         MPEG-4 part 2 Microsoft variant version 3
 DEVSD  msmpeg4v1       MPEG-4 part 2 Microsoft variant version 1
 DEVSD  msmpeg4v2       MPEG-4 part 2 Microsoft variant version 2
 DEA    vorbis          Vorbis
...

Hier haben die Buchstaben in der ersten Spalte die folgenden Bedeutungen:

  • E steht für Encoding
  • D steht für Decoding
  • V steht für Video
  • A für Audio

weitere Infos zu FFmpeg und libx264

hier wird sowohl Audio als auch Video mit einer festen Bitrate transcodiert:

# ffmpeg -i <rein> -vcodec libx264 -b 2048k -s 720x576 -acodec libmp3lame -ab 128k -ar 48000 -ac 2 -f matroska -y <raus>.mkv

hier wird auf höchste Qualität wert gelegt:

# ffmpeg -i <rein> -vcodec libx264 -b 2048k -s 720x576 -acodec libmp3lame -ab 128k -ar 48000 -ac 2 -f matroska -coder 1 -flags +loop -cmp +chroma -partitions +parti8x8+parti4x4+partp8x8+partb8x8 -me_method tesa -subq 10 -me_range 32 -g 250 -keyint_min 24 -sc_threshold 40 -i_qfactor 0.71 -b_strategy 2 -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -bf 4 -refs 16 -directpred 3 -trellis 2 -flags2 +bpyramid+wpred+mixed_refs+dct8x8+nofastpskip -y <raus>.mkv

Wem die Kommandozeilen zu lang sind, dem seien die presets ans Herz gelegt. Das FFmpeg-Team hat für unterschiedliche Anwendungsfälle vorbereitete Konfigurationen beigelegt, die sogenannten presets.

Es gibt in FFmpeg schon ein par vorbereitete Konfigurationen. In Ubuntu liegen die entsprechenden Dateien hier:

# ls -1 /usr/share/ffmpeg/*.ffpreset
/usr/share/ffmpeg/libx264-baseline.ffpreset
/usr/share/ffmpeg/libx264-default.ffpreset
/usr/share/ffmpeg/libx264-fastfirstpass.ffpreset
/usr/share/ffmpeg/libx264-hq.ffpreset
/usr/share/ffmpeg/libx264-ipod320.ffpreset
/usr/share/ffmpeg/libx264-ipod640.ffpreset
/usr/share/ffmpeg/libx264-lossless_fast.ffpreset
/usr/share/ffmpeg/libx264-lossless_max.ffpreset
/usr/share/ffmpeg/libx264-lossless_medium.ffpreset
/usr/share/ffmpeg/libx264-lossless_slower.ffpreset
/usr/share/ffmpeg/libx264-lossless_slow.ffpreset
/usr/share/ffmpeg/libx264-lossless_ultrafast.ffpreset
/usr/share/ffmpeg/libx264-main.ffpreset
/usr/share/ffmpeg/libx264-max.ffpreset
/usr/share/ffmpeg/libx264-normal.ffpreset
/usr/share/ffmpeg/libx264-slowfirstpass.ffpreset

Die Einstellungen aus der datei /usr/share/ffmpeg/libx264-max.ffpreset werden in folgendem Kommando angewendet:

# ffmpeg -i <rein> -vcodec libx264 -vpre max -y <raus>.mkv

oder

# ffmpeg -i <rein> -vcodec libx264 -vpre /usr/share/ffmpeg/libx264-max.ffpreset -y <raus>.mkv

Wichtig ist hierbei, dass -vcodec unmittelbar vor -vpre steht!

Die Video-Datei ist damit zwar recht klein, aber die Qualität lässt zu wünschen übrig. abhilfe schaft hier nur, das man die Datenrate für die Videospur erhöht.

Die Audiospur wurde auch in das Format „mp2, 22050 Hz, mono, s16, 64 kb/s“ transcodiert, das möchte man auch nicht unbedingt. Also sollte man vielleicht auch einen moderneren Audio-Codec angeben.

Am kompatibelsten von den moderneren Audio-Codecs ist der AC-3 (DVD- und Blu-Ray-Standard), MP3 ist recht verbreitet, Vorbis ist auch recht verbreitet und zudem noch absolut frei und AAC ist der am stärksten komprimierende Audiocodec.

Ich bevorzuge die Tonspur unverändert zu übernehmen, jedenfalls wenn sie im AC3-, MP3- oder AAC-Format vorliegt, leider ist das aber nicht immer der Fall.

Normalerweise versuche ich eine Videotonspur ins AAC-Format zu übersetzen.

# ffmpeg -i <rein> -vcodec libx264 -vpre max -b 2048k -s 720x576 -acodec copy -f matroska -y <raus>.mkv

Aus Kompatibilitätsgründen ist es für Videoarchive aber sinnvoll auch den AC-3 im Falle einer kompletten Transcodierung zu verwenden:

# ffmpeg -i <rein> -vcodec libx264 -vpre max -b 2048k -s 720x576 -acodec ac3 -ab 256k -ar 48000 -ac 2 -f matroska -y <raus>.mkv

Vorschläge um die Qualität zu erhöhen:

… Verwenden Sie in Ihrem FFmpeg Befehl den zusätzlichen Parameter -qns (Quantization Noise Shaping) mit dem Wert 2 oder maximal 3. Das Ändern des FFmpeg Parameters -direct_pred (direct prediction mode) kann ebenfalls zu einer leichten Verbesserung führen. Setzen Sie den Wert auf 2 (Temporal). Dieser Wert zeichnet in jedem Fall etwas schärfer mehr als der Wert 1 (Spatial). …

FFmpeg mit dem x264-Encoder

# ffmpeg -r 25 -i <rein> -v 0 -vcodec rawvideo -vsync 0 -an -r 25 -pix_fmt yuv420p -f rawvideo - | x264 --fps 25 --crf 16 -b 3 --vbv-maxrate 40000 --vbv-bufsize 30000 --level 4.1 --keyint 24 --b-pyramid --aud --colorprim bt709 --transfer bt709 --colormatrix bt709 --sar 1:1 -o <raus>.mkv - 720x576
 
Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht:GNU Free Documentation License 1.2
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki