Leider wird der MPlayer/MEncoder seit ein paar Jahren nicht mehr aktiv weiter entwickelt, weil es zu wenig Leute im Team gibt.
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 - | ...
Manchmal ist es nötig die Audio- und Videospur getrennt zu bearbeiten.
erste Tonspur aus dem Film extrahieren:
# ffmpeg -i <rein> -vn <raus>.wav
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 ...
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
# ffmpeg -i <rein> -an -vcodec copy film_stumm.mp4
# ffmpeg -i film_stumm.mp4 -i tonspur.mp3 -vcodec copy -async 10 -ab 128k <raus>.mp4
Bei diesen Test's hatte der Audio-Codec “AAC“ einen verzerrten klang ergeben…
# 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
# 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
# ffmpeg -i <rein> -vcodec mpeg4 -y <raus>.avi # ffmpeg -i <rein> -vcodec mpeg4 -y <raus>.mkv
# ffmpeg -i <rein> -vcodec mpeg4 -y <raus>.mp4
# ffmpeg -i <rein> -acodec libmp3lame -y <raus>.avi # ffmpeg -i <rein> -acodec libmp3lame -y <raus>.mp4 # ffmpeg -i <rein> -acodec libmp3lame -y <raus>.mkv
# ffmpeg -i <rein> -vcodec libxvid -y <raus>.avi
# ffmpeg -i <rein> -vcodec libxvid -acodec libmp3lame -y <raus>.avi
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
# ffmpeg -i <rein> -vcodec libx264 -vpre max -y <raus>.mp4
# ffmpeg -i <rein> -vcodec libx264 -vpre max -acodec libfaac -y <raus>.mkv
# ffmpeg -i <rein> -vcodec libx264 -vpre max -y <raus>.mp4
# 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
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.
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:
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 -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