Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| howto:ffmpeg [2020/12/06 16:22] – ffmpeg renamed to howto:ffmpeg andi | howto:ffmpeg [2026/07/26 22:17] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | = ffmpeg | + | # ffmpeg |
| Siehe auch [[transcoding]] für Realtime-Stream-Transcoding-Kommandos | Siehe auch [[transcoding]] für Realtime-Stream-Transcoding-Kommandos | ||
| - | == repo | + | ## repo |
| stretch | stretch | ||
| Line 14: | Line 14: | ||
| - | == compiling | + | ## compiling |
| < | < | ||
| - | === für Debian | + | ### für Debian |
| debian multimedia einbinden (falls noch nicht passiert) | debian multimedia einbinden (falls noch nicht passiert) | ||
| < | < | ||
| Line 36: | Line 36: | ||
| make install </ | make install </ | ||
| - | == audio channel mapping doku | + | ## HD-Master mit Loudnorm |
| - | + | ||
| - | https:// | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | == silent fix | + | |
| < | < | ||
| - | ffmpeg -ar 48000 -acodec pcm_s16le | + | ffmpeg -y \ |
| - | </ | + | -i / |
| + | -ss 1858.48 -t 3550.88 | ||
| + | -i /video/ | ||
| + | -filter_complex ' | ||
| + | [0:a:0] loudnorm=i=-16: | ||
| + | [1:a:0] loudnorm=i=-16: | ||
| + | | ||
| - | Oder " | + | [0:v:0] [norm-0-0] [1:v:0] [norm-1-0] [2:v:0] [norm-2-0] concat=n=3:v=1:a=1 [vd] [audio0_mix]; |
| - | + | [vd] yadif=mode=0:parity=0, hqdn3d | |
| - | < | + | ' -analyzeduration 20000000/ |
| - | ffmpeg | + | -map '[v]' |
| + | -map '[audio0_mix]' | ||
| + | -aspect 16:9 -movflags faststart -f mp4 / | ||
| </ | </ | ||
| - | $audiocodec z.B. mp2 bei Intros | ||
| - | == metadata fix | ||
| - | === map metadata and fix spezific entry | + | ### HD-Master mit Loudnorm, Pause rausschneiden |
| + | - Zeitstempel | ||
| + | - -t gibt Duration an, nicht Ende! | ||
| < | < | ||
| - | ffmpeg -i br0ken_licence/$file \ | + | ffmpeg |
| - | -map_metadata 0 \ | + | -i /video/ |
| - | -metadata: | + | -ss 1858.48 -t 3550.88 -i / |
| - | -c:a copy $file | + | -ss 1858.48 -t 3550.88 -i /video/fuse//XXX/YYY/ZZZ/uncut.ts |
| - | </ | + | -i /video/intros/ |
| + | -filter_complex ' | ||
| + | | ||
| + | [1:a:0] loudnorm=i=-16: | ||
| + | | ||
| + | [3:a:0] loudnorm=i=-16: | ||
| - | === copy metadata from another file | + | [0:v:0] [norm-0-0] [1:v:0] [norm-1-0] [2:v:0] [norm-2-0] [3:v:0] [norm-3-0] concat=n=4:v=1:a=1 [vd] [audio0_mix]; |
| - | + | [vd] yadif=mode=0: | |
| - | < | + | ' -analyzeduration 20000000/ |
| - | ffmpeg | + | -map ' |
| + | -map ' | ||
| + | -aspect 16:9 -movflags faststart -f mp4 / | ||
| </ | </ | ||
| - | == one input, multiple format outputs | + | ## encoding snippets |
| - | 1. h264/aac flv rtmp output | + | ### H264/ |
| - | 2. theora/ | + | |
| - | + | ||
| - | < | + | |
| - | ffmpeg -re -i 29c3-5266-de-en-proximax_telex_flashproxy_h264.mp4 -threads 0 -pix_fmt yuv420p -profile:v baseline -preset fast -tune zerolatency -c:v libx264 -strict -2 -c:a aac \ | + | |
| - | -f flv rtmp:// | + | |
| - | -map 0 -c:v libtheora -c:a libvorbis -f ogg - | oggfwd localhost 8000 … | + | |
| - | </ | + | |
| - | + | ||
| - | == Audiospur via Backup Audioaufnahme reparieren und in MP4 packen | + | |
| - | + | ||
| - | Sprache deu-backup im Tracker anlegen. | + | |
| - | Nochmal neu rausrendern lassen. | + | |
| - | + | ||
| - | einzelne Audiopuren vor oder nach Auphnic so umwandeln das Audio-Schnitt Tool wie z.B. Reaper was damit anfangen kann: | + | |
| - | + | ||
| - | ffmpeg -i 5100-hd-audio2-auphonic.m4a -vn -c:a copy -bsf:a aac_adtstoasc 5100-hd-audio2-auphonic-echt.m4a | + | |
| - | ffmpeg -i 5100-hd-audio2-auphonic.m4a -vn -c:a copy -bsf:a aac_adtstoasc 5100-hd-audio2-auphonic-echt.m4a | + | |
| - | + | ||
| - | + | ||
| - | Fertige Audiospur in Reaper rausrechnen, | + | |
| - | + | ||
| - | Audiospur wieder in Vortrag MP4 einpacken: | + | |
| - | + | ||
| - | < | + | |
| - | ffmpeg -threads 0 -i / | + | |
| - | </ | + | |
| - | + | ||
| - | Alte Version | + | |
| - | < | + | |
| - | ffmpeg -threads 0 -i 5100-hd.mp4 | + | |
| - | </ | + | |
| - | + | ||
| - | + | ||
| - | Anmerkung: Geht auch mit MTS Datei (Transportstream mit H264 Video) der so aus der Consumer-Kamera auf die SD Karte fällt. | + | |
| - | + | ||
| - | Siehe auch: https:// | + | |
| - | == Audiospur(en) und Videospur vertauscht | + | |
| - | < | + | |
| - | ffmpeg -i 5115-hd-broken.mp4 -map 0:v -map 0:a -c copy -map_metadata 0 5115-hd.mp4 | + | |
| - | </ | + | |
| - | + | ||
| - | == Translated Transcoding | + | |
| - | + | ||
| - | < | + | |
| - | ffmpeg -y -i rtmp:// | + | |
| - | </ | + | |
| - | == encoding snippets | + | |
| - | + | ||
| - | === H264/ | + | |
| < | < | ||
| Line 133: | Line 93: | ||
| -metadata title="< | -metadata title="< | ||
| -metadata album="< | -metadata album="< | ||
| - | -metadata copyright=" | + | -metadata copyright=" |
| < | < | ||
| </ | </ | ||
| Line 139: | Line 99: | ||
| **Videofilter: | **Videofilter: | ||
| - | === H264/AAC HQ | + | ### H264/AAC HQ |
| < | < | ||
| Line 146: | Line 106: | ||
| -c:a libfdk_aac -b:a 192k -aspect 16:9 -metadata title="< | -c:a libfdk_aac -b:a 192k -aspect 16:9 -metadata title="< | ||
| -metadata album="< | -metadata album="< | ||
| - | -metadata copyright=" | + | -metadata copyright=" |
| -f mp4 -movflags faststart < | -f mp4 -movflags faststart < | ||
| </ | </ | ||
| **Videofilter: | **Videofilter: | ||
| - | === WebM | + | ### WebM |
| < | < | ||
| Line 173: | Line 133: | ||
| -aspect | -aspect | ||
| - | === FullHD | + | ### FullHD |
| Die Bitraten sind für Konferenz-Content (wenig Bewegung) in SD 16:9 (1024x576) getestet. Für HD-Content (1920x1080) haben wir beide Bitraten auf -maxrate:0 5000k gesetzt. | Die Bitraten sind für Konferenz-Content (wenig Bewegung) in SD 16:9 (1024x576) getestet. Für HD-Content (1920x1080) haben wir beide Bitraten auf -maxrate:0 5000k gesetzt. | ||
| - | === WebCut LoRes MP4 | + | ### WebCut LoRes MP4 |
| Line 200: | Line 160: | ||
| </ | </ | ||
| - | === Pause rausschneiden | + | |
| + | ## one input, multiple format outputs | ||
| + | |||
| + | 1. h264/aac flv rtmp output | ||
| + | 2. theora/ | ||
| + | |||
| + | < | ||
| + | ffmpeg -re -i 29c3-5266-de-en-proximax_telex_flashproxy_h264.mp4 -threads 0 -pix_fmt yuv420p -profile:v baseline -preset fast -tune zerolatency -c:v libx264 -strict -2 -c:a aac \ | ||
| + | -f flv rtmp:// | ||
| + | -map 0 -c:v libtheora -c:a libvorbis -f ogg - | oggfwd localhost 8000 … | ||
| + | </ | ||
| + | |||
| + | |||
| + | ## Translated Transcoding | ||
| + | |||
| + | < | ||
| + | ffmpeg -y -i rtmp:// | ||
| + | </ | ||
| + | |||
| + | |||
| + | ## Audiospur via Backup Audioaufnahme reparieren und in MP4 packen | ||
| + | |||
| + | Sprache deu-backup im Tracker anlegen. | ||
| + | Nochmal neu rausrendern lassen. | ||
| + | |||
| + | einzelne Audiopuren vor oder nach Auphnic so umwandeln das Audio-Schnitt Tool wie z.B. Reaper was damit anfangen kann: | ||
| + | |||
| + | ffmpeg -i 5100-hd-audio2-auphonic.m4a -vn -c:a copy -bsf:a aac_adtstoasc 5100-hd-audio2-auphonic-echt.m4a | ||
| + | ffmpeg -i 5100-hd-audio2-auphonic.m4a -vn -c:a copy -bsf:a aac_adtstoasc 5100-hd-audio2-auphonic-echt.m4a | ||
| + | |||
| + | |||
| + | Fertige Audiospur in Reaper rausrechnen, | ||
| + | |||
| + | Audiospur wieder in Vortrag MP4 einpacken: | ||
| + | |||
| + | < | ||
| + | ffmpeg -threads 0 -i / | ||
| + | </ | ||
| + | |||
| + | Alte Version | ||
| + | < | ||
| + | ffmpeg -threads 0 -i 5100-hd.mp4 | ||
| + | </ | ||
| + | |||
| + | |||
| + | Anmerkung: Geht auch mit MTS Datei (Transportstream mit H264 Video) der so aus der Consumer-Kamera auf die SD Karte fällt. | ||
| + | |||
| + | Siehe auch: https:// | ||
| + | |||
| + | |||
| + | ## Audiospur(en) und Videospur vertauscht | ||
| + | < | ||
| + | ffmpeg -i 5115-hd-broken.mp4 -map 0:v -map 0:a -c copy -map_metadata 0 5115-hd.mp4 | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ## audio channel mapping / repair | ||
| + | |||
| + | https:// | ||
| + | |||
| + | |||
| + | ### mono mixdown | ||
| + | |||
| + | ffmpeg -i 27-hd-orig.mp4 -codec:v copy -map_metadata 0 -ac 1 -ab 128k 27-hd.mp4 | ||
| + | |||
| + | |||
| + | ### silent fix | ||
| + | < | ||
| + | ffmpeg -ar 48000 -acodec pcm_s16le -f s16le -ac 2 -i <( dd if=/ | ||
| + | </ | ||
| + | |||
| + | Oder " | ||
| + | |||
| + | < | ||
| + | ffmpeg -i not_silent/ | ||
| + | </ | ||
| + | $audiocodec z.B. mp2 bei Intros | ||
| + | |||
| + | |||
| + | ## metadata fix | ||
| + | |||
| + | ### map metadata and fix specific entry | ||
| + | |||
| + | < | ||
| + | ffmpeg -i br0ken_licence/ | ||
| + | -map_metadata 0 \ | ||
| + | -metadata: | ||
| + | -c:a copy $file | ||
| + | </ | ||
| + | |||
| + | ### copy metadata from another file | ||
| + | |||
| + | < | ||
| + | ffmpeg -i $metadata_source -i $video_source -map 1 -c copy -map_metadata 0 $output_file | ||
| + | </ | ||
| + | |||
| + | ### Pause rausschneiden | ||
| Pause von 3840s = 1h04m00s | Pause von 3840s = 1h04m00s | ||
| bis 4691s = 1h18m11s | bis 4691s = 1h18m11s | ||
| Line 214: | Line 272: | ||
| " -map ' | " -map ' | ||
| | | ||
| - | === HD-Master mit Loudnorm | ||
| - | < | ||
| - | ffmpeg -y \ | ||
| - | -i / | ||
| - | -ss 1858.48 -t 3550.88 -i / | ||
| - | -i / | ||
| - | -filter_complex ' | ||
| - | [0:a:0] loudnorm=i=-16: | ||
| - | [1:a:0] loudnorm=i=-16: | ||
| - | [2:a:0] loudnorm=i=-16: | ||
| - | [0:v:0] [norm-0-0] [1:v:0] [norm-1-0] [2:v:0] [norm-2-0] concat=n=3: | + | ### Icecast-Audio mit ffmpeg |
| - | [vd] yadif=mode=0: | + | |
| - | ' -analyzeduration 20000000/ | + | |
| - | -map ' | + | |
| - | -map ' | + | |
| - | -aspect 16:9 -movflags faststart -f mp4 / | + | |
| - | </ | + | |
| - | + | ||
| - | === HD-Master mit Loudnorm, Pause rausschneiden | + | |
| - | - Zeitstempel = *Sekunden.Frames* | + | |
| - | - -t gibt Duration an, nicht Ende! | + | |
| - | + | ||
| - | < | + | |
| - | ffmpeg -y \ | + | |
| - | -i / | + | |
| - | -ss 1858.48 -t 3550.88 -i / | + | |
| - | -ss 1858.48 -t 3550.88 -i / | + | |
| - | -i / | + | |
| - | -filter_complex ' | + | |
| - | [0:a:0] loudnorm=i=-16: | + | |
| - | [1:a:0] loudnorm=i=-16: | + | |
| - | [2:a:0] loudnorm=i=-16: | + | |
| - | [3:a:0] loudnorm=i=-16: | + | |
| - | + | ||
| - | [0:v:0] [norm-0-0] [1:v:0] [norm-1-0] [2:v:0] [norm-2-0] [3:v:0] [norm-3-0] concat=n=4: | + | |
| - | [vd] yadif=mode=0: | + | |
| - | ' -analyzeduration 20000000/ | + | |
| - | -map ' | + | |
| - | -map ' | + | |
| - | -aspect 16:9 -movflags faststart -f mp4 / | + | |
| - | </ | + | |
| - | === Icecast-Audio mit ffmpeg | + | |
| ffmpeg -re -i … -map 0:a -c:a mp3 -f mp3 \ | ffmpeg -re -i … -map 0:a -c:a mp3 -f mp3 \ | ||
| Line 266: | Line 283: | ||
| icecast:// | icecast:// | ||
| - | === Geschnittenes Camera MTS mit Backup Ton zu Final MP4 | + | ### Geschnittenes Camera MTS mit Backup Ton zu Final MP4 |
| ffmpeg -analyzeduration 20000000 -i video-cut.mov \ | ffmpeg -analyzeduration 20000000 -i video-cut.mov \ | ||
| Line 280: | Line 297: | ||
| -f mp4 -metadata title=< | -f mp4 -metadata title=< | ||
| - | == Poster Image + Audio zu Video | + | ## Poster Image + Audio zu Video |
| https:// | https:// | ||
| Line 309: | Line 326: | ||
| ffmpeg -t 60 -loop 1 -i 0-pause.png | ffmpeg -t 60 -loop 1 -i 0-pause.png | ||
| - | == Streamen von einer USB Webcam (720p no audio) | + | ## Streamen von einer USB Webcam (720p no audio) |
| < | < | ||
| ffmpeg2theora /dev/video1 -f video4linux2 -x 1280 -y 720 -F 30 -v 10 --pp fd --noaudio -o - | oggfwd <icecast ip> < | ffmpeg2theora /dev/video1 -f video4linux2 -x 1280 -y 720 -F 30 -v 10 --pp fd --noaudio -o - | oggfwd <icecast ip> < | ||
| </ | </ | ||
| - | == HLS streaming | + | ## HLS streaming |
| < | < | ||
| ffmpeg -i - -filter:v yadif -c:v dvvideo -c:a copy -f dv - | \ | ffmpeg -i - -filter:v yadif -c:v dvvideo -c:a copy -f dv - | \ | ||
| Line 332: | Line 349: | ||
| </ | </ | ||
| - | == Facebook Live-Streaming | + | ## Facebook Live-Streaming |
| Facebook will zwingend 720p, 30 fps und eine i-Frame-Intervall von 2 Sekunden bei max. 4000k Bitrate. Audio darf nur 44100KHz sein (Stereo ist aber erlaubt). | Facebook will zwingend 720p, 30 fps und eine i-Frame-Intervall von 2 Sekunden bei max. 4000k Bitrate. Audio darf nur 44100KHz sein (Stereo ist aber erlaubt). | ||
| Line 349: | Line 366: | ||
| - | == Periscope Live-Streaming | + | ## Periscope Live-Streaming |
| Periscope Producer will [[https:// | Periscope Producer will [[https:// | ||
| Line 357: | Line 374: | ||
| </ | </ | ||
| - | == ffmpeg h264 encoding | + | ## ffmpeg h264 encoding |
| < | < | ||
| Line 372: | Line 389: | ||
| </ | </ | ||
| - | == Timestamp Stream overlay | + | ## Timestamp Stream overlay |
| localtime ffmpeg newest standard | localtime ffmpeg newest standard | ||
| < | < | ||
| Line 384: | Line 401: | ||
| </ | </ | ||
| - | == Konvertiere externe Video-Dateien zu mpeg-Segmente die der Tracker versteht | + | ## Konvertiere externe Video-Dateien zu mpeg-Segmente die der Tracker versteht |
| In unserem [[https:// | In unserem [[https:// | ||
| - | == relaying a HLS stream to our cdn ( and fix most of the brokyness it comes with from " | + | ## relaying a HLS stream to our cdn ( and fix most of the brokyness it comes with from " |
| < | < | ||
| ffmpeg -headers ' | ffmpeg -headers ' | ||
| Line 399: | Line 416: | ||
| streamlink -l debug https:// | streamlink -l debug https:// | ||
| </ | </ | ||
| - | == HLS Streamdump als Backup, gleich in Schnipseln | + | ## HLS Streamdump als Backup, gleich in Schnipseln |
| (Natürlich ist das dann H.264 in TS statt MPEG2 in TS, aber das sollte trotzdem alles funktionieren) | (Natürlich ist das dann H.264 in TS statt MPEG2 in TS, aber das sollte trotzdem alles funktionieren) | ||
| Line 407: | Line 424: | ||
| </ | </ | ||
| - | == Blur eines Bildausschnitts (Rechteckiges Fenster der Größe $XSIZE und $YSIZE, mit Offset $XOFFSET und $YOFFSET, alles in Pixeln) | + | ## Blur eines Bildausschnitts (Rechteckiges Fenster der Größe $XSIZE und $YSIZE, mit Offset $XOFFSET und $YOFFSET, alles in Pixeln) |
| < | < | ||
| Line 413: | Line 430: | ||
| </ | </ | ||
| - | == Schwarze Box / Black Box über einen Bildausschnitt legen | + | ## Schwarze Box / Black Box über einen Bildausschnitt legen |
| 50 = Box-Breite, 40 = Box-Höhe, 5 = Box-X-Position, | 50 = Box-Breite, 40 = Box-Höhe, 5 = Box-X-Position, | ||
| Line 421: | Line 438: | ||
| </ | </ | ||
| - | == Filter konkatenieren, | + | ## Filter konkatenieren, |
| Box 1 (z.B. Laufschrift-Balken) | Box 1 (z.B. Laufschrift-Balken) | ||
| Line 433: | Line 450: | ||
| </ | </ | ||
| - | == RGB/YUV Blödsinn | + | ## RGB/YUV Blödsinn |
| Das ist alles sehr verwirrend, einfach beides probieren und das nehmen, was richtig aussieht. | Das ist alles sehr verwirrend, einfach beides probieren und das nehmen, was richtig aussieht. | ||
| Line 447: | Line 464: | ||
| </ | </ | ||
| - | == AV sync test using ffmpeg / ffplay | + | ## AV sync test using ffmpeg / ffplay |
| This might be useful to find A/V drifting behavior in the production chain. Simply use this as the generator. For use as a source for our streaming relay: | This might be useful to find A/V drifting behavior in the production chain. Simply use this as the generator. For use as a source for our streaming relay: | ||
| Line 467: | Line 484: | ||
| </ | </ | ||
| - | == ffmpeg only multiview | + | ## ffmpeg only multiview |
| < | < | ||
| #/bin/bash | #/bin/bash | ||
| Line 527: | Line 544: | ||
| exit | exit | ||
| </ | </ | ||
| - | == DASH encoding | + | ## DASH encoding |
| - | === VOD encoding | + | ### VOD encoding |
| um static files in mehreren bitraten/ | um static files in mehreren bitraten/ | ||
| Line 604: | Line 621: | ||
| </ | </ | ||
| - | === screen capture and stream | + | ### screen capture and stream |
| < | < | ||