ffmpeg

Siehe auch Transcoding-Kommandos für Realtime-Stream-Transcoding-Kommandos

repo

stretch

echo "deb http://pkg.c3voc.de/ stretch main" > /etc/apt/sources.list.d/voc.list
curl https://pkg.c3voc.de/repo.key | apt-key add -
apt-get update
apt-get install ffmpeg

compiling

apt-get build-dep ffmpeg yasm libmp3lame-dev libx264-dev libvpx-dev libvorbis-dev libopus-dev

für Debian

debian multimedia einbinden (falls noch nicht passiert)

deb http://www.deb-multimedia.org wheezy main non-free
apt-get update
apt-get install deb-multimedia-keyring

zusätzliche libs einbinden

apt-get install libass-dev libfaac-dev libfdk-aac-dev libopus-dev

Auschecken

git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg

Configuren

./configure --extra-libs="-ldl" --enable-gpl --enable-libass --enable-libfdk-aac \
--enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis \
--enable-libvpx --enable-libx264 --enable-nonfree --enable-libfaac

Bauen / Installieren

make
make install

HD-Master mit Loudnorm

ffmpeg -y \
-i /video/intros/XXX/intro.ts -analyzeduration 20000000 \
-ss 1858.48 -t 3550.88 -i /video/fuse//XXX/YYY/ZZZ/uncut.ts -analyzeduration 20000000 \
-i /video/intros/XXX/outro.ts \
-filter_complex '
[0:a:0] loudnorm=i=-16:print_format=summary [norm-0-0];
[1:a:0] loudnorm=i=-16:print_format=summary [norm-1-0];
[2:a:0] loudnorm=i=-16:print_format=summary [norm-2-0];
[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 [v]
' -analyzeduration 20000000/
-map '[v]' -c:v:0 libx264 -pix_fmt yuv420p -crf:0 23 -profile:0 high -level:0 4.1
-map '[audio0_mix]' -c:a:0 aac -b:a:0 192k -ar:a:0 48000 \
-aspect 16:9 -movflags faststart -f mp4 /video/tmp/XXX/ZZZ-hd.mp4

HD-Master mit Loudnorm, Pause rausschneiden

- Zeitstempel = Sekunden.Frames - -t gibt Duration an, nicht Ende!

ffmpeg -y \
-i /video/intros/XXX/intro.ts -analyzeduration 20000000 \
-ss 1858.48 -t 3550.88 -i /video/fuse//XXX/YYY/ZZZ/uncut.ts -analyzeduration 20000000 \
-ss 1858.48 -t 3550.88 -i /video/fuse//XXX/YYY/ZZZ/uncut.ts -analyzeduration 20000000 \
-i /video/intros/XXX/outro.ts \
-filter_complex '
[0:a:0] loudnorm=i=-16:print_format=summary [norm-0-0];
[1:a:0] loudnorm=i=-16:print_format=summary [norm-1-0];
[2:a:0] loudnorm=i=-16:print_format=summary [norm-2-0];
[3:a:0] loudnorm=i=-16:print_format=summary [norm-3-0];
[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:parity=0, hqdn3d [v]
' -analyzeduration 20000000/
-map '[v]' -c:v:0 libx264 -pix_fmt yuv420p -crf:0 23 -profile:0 high -level:0 4.1
-map '[audio0_mix]' -c:a:0 aac -b:a:0 192k -ar:a:0 48000 \
-aspect 16:9 -movflags faststart -f mp4 /video/tmp/XXX/ZZZ-hd.mp4

encoding snippets

H264/AAC/Stereo

ffmpeg -v warning -i <input> -vf <videofilter> \
-c:v:0 libx264 -pix_fmt yuv420p -bufsize:0 8192k -maxrate:0 2000k -crf:v 23 \
-profile:v high -level:v 4.1 \
-map 0:1 \
-c:a:0 libfdk_aac -b:a:0 128k -ac:a:0 2 -ar:a:0 48000 \
-metadata:s:a:0 language=eng \
-aspect 16:9 -f mp4 \
-metadata title="<title>" \
-metadata album="<album>" \
-metadata copyright="Licensed to the public under http://creativecommons.org/licenses/by-sa/3.0/" \
<output-file-name>

Videofilter: hqdn3d for denoising, yadif for deinterlacing. If both, combine them with a comma.

H264/AAC HQ

ffmpeg -v warning -i <input> -vf <videofilter> \
-c:v libx264 -pix_fmt yuv420p -crf:v 14 -profile:v high -level:v 4.2 \
-c:a libfdk_aac -b:a 192k -aspect 16:9 -metadata title="<title>" \
-metadata album="<album>" \
-metadata copyright="Licensed to the public under http://creativecommons.org/licenses/by-sa/3.0/" \
-f mp4 -movflags faststart <output-file-name>

Videofilter: hqdn3d for denoising, yadif for deinterlacing. If both, combine them with a comma.

WebM

#!/bin/bash
target=$(basename ${1%.*}).webm
passlog=/tmp/${target%.*}-webm-1st-pass
if [ ! -e $passlog-0.log ]; then
ffmpeg -threads 8 -analyzeduration 40000000 -probesize 100000000 -i $1 \
-c:v libvpx -g:0 120 -b:v 1200k -qmin:0 11 -qmax:0 51 \
-minrate:0 100k -maxrate:0 5000k \
-pass 1 -passlogfile $passlog \
-c:a libvorbis -b:a 96k -ac:a 2 -ar:a 48000 -metadata:s:a language=de \
-aspect 16:9 -f webm $target
fi
ffmpeg -y -threads 8 -analyzeduration 40000000 -probesize 100000000 -i $1 \
-c:v libvpx -pass 2 -passlogfile $passlog \
-g 120 -b:v 1200k -qmin 11 -qmax 51 -minrate 100k -maxrate 5000k \
-c:a libvorbis -b:a 96k -ac:a 2 -ar:a 48000 \
-aspect 16:9 -f webm $target

FullHD

Die Bitraten sind für Konferenz-Content (wenig Bewegung) in SD 16:9 (1024×576) getestet. Für HD-Content (1920×1080) haben wir beide Bitraten auf -maxrate:0 5000k gesetzt.

WebCut LoRes MP4

Tuningmöglichkeiten:

libx264 statt h264

-preset:v fast

-b:v ist die Videobitrate, kann bei Bedarf erhöht werden

ffmpeg -analyzeduration 20000000 -i uncut.XXX \
-vf scale=160:-1 -pix_fmt yuv420p \
-c:v h264 -c:a mp3 -b:a 32k -b:v 70k \
-aspect 16:9 -f mp4 webcut.mp4

Alternative Möglichkeit mit weniger Bild, gibt Files mit ca. 20 MB/h, encodet ca. 5 Minuten auf schneller Hardware:

ffmpeg -i /video/fuse/...../101/uncut.ts -vf fps=1 -s 480x270 \
-pix_fmt yuv420p -map 0 -c:v libx264 -preset ultrafast -bf:0 0 -crf 29 \
-c:a mp3 -b:a 32k -ar:a 22050 -f mp4 -movflags faststart \
/video/tmp/..../cut-101-proxy.mp4

one input, multiple format outputs

h264/aac flv rtmp output

theora/vorbis ogg output

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://localhost:1935/stream/saal1 \
-map 0 -c:v libtheora -c:a libvorbis -f ogg - | oggfwd localhost 8000 …

Translated Transcoding

ffmpeg -y -i rtmp://live.lan.c3voc.de/stream/mastermaster -aspect 16:9 -threads:0 0 -c:v libx264 -filter_complex '[0:v] yadif, scale=1920:1080 [v]; [0:a:0] pan=stereo|c0=FL [native]' -map '[native]' -map '[v]' -maxrate:v:0 2800k -bufsize:v:0 8192k -crf:0 18 -pix_fmt:0 yuv420p -profile:v:0 main -g:v:0 25 -preset:v:0 veryfast -ac 1 -y -f flv rtmp://live.lan.c3voc.de/push/master_translated_hd

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, z.B. als Flac

Audiospur wieder in Vortrag MP4 einpacken:

ffmpeg -threads 0 -i /video/encoded/fossgis16/5100-hd-primary-audio-only.mp4 -i 5100-audio-fixed.flac -map 0:0 -map 1:0 -map_metadata 0 -c:v copy -c:a:0 libfdk_aac -vbr 4 -ar:a:0 48000 -metadata:s:a:0 language=deu 5100-hd-fixed2.mp4

Alte Version

ffmpeg -threads 0 -i 5100-hd.mp4 -i 5100-audio-fixed.flac -map 0:0 -map 1:0 -map_metadata 1 5100-hd-fixed.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://trac.ffmpeg.org/wiki/AudioChannelManipulation

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://trac.ffmpeg.org/wiki/AudioChannelManipulation

silent fix

ffmpeg -ar 48000 -acodec pcm_s16le -f s16le -ac 2 -i <( dd if=/dev/zero ) -y -i not_silent/$file -t 10.0 -c:v copy $file;

Oder “schöner” und ohne knacken:

ffmpeg -i not_silent/$file -filter_complex "aevalsrc=c=2c:s=48000:0|0 [a]" -map 0:v -c:v copy -map "[a]" -c:a $audiocodec -shortest $outputfile

$audiocodec z.B. mp2 bei Intros

metadata fix

map metadata and fix spezific entry

ffmpeg -i br0ken_licence/$file \
-map_metadata 0 \
-metadata:s:a:0 LICENSE="Licensed to the public under https://creativecommons.org/licenses/by/2.0/de/ - http://media.ccc.de" \
-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 = 1h04m00sbis 4691s = 1h18m11s

ffmpeg -i 50-hd-camonly.mp4 -filter_complex " \
[0:v]trim=duration=3840[v1]; \
[0:v]trim=start=4691,setpts=PTS-STARTPTS[v2]; \
[v1][v2]concat=v=1:a=0[v]; \
[0:a]atrim=duration=3840[a1]; \
[0:a]atrim=start=4691,asetpts=PTS-STARTPTS[a2]; \
[a1][a2]concat=v=0:a=1[a] \
" -map '[v]' -c:v:0 libx264 -pix_fmt yuv420p -bufsize:0 8192k -crf:0 20 -minrate:0 100k -maxrate:0 5000k -profile:0 main -level:0 4.0 -threads 8 -map '[a]' -c:a:0 libfdk_aac -b:a:0 192k -ac:a:0 1 -ar:a:0 48000 -aspect 16:9 -f mp4 50-hd-camonly-cut.mp4

Icecast-Audio mit ffmpeg

ffmpeg -re -i … -map 0:a -c:a mp3 -f mp3 \
-ice_public 1 -content_type audio/mpeg \
-ice_description "Livestream aus der Pommesbude" \
-ice_url "http://www.pommesbude.de/" \
-ice_name "Pommesbude" \
-ice_genre "Geräusch" \
icecast://source:…@live.ber.c3voc.de:8000/foo.mp3

Geschnittenes Camera MTS mit Backup Ton zu Final MP4

ffmpeg -analyzeduration 20000000 -i video-cut.mov \
-filter_complex '
[0:a] pan=1c|c0=c0, loudnorm=i=-16:print_format=summary [audio0_mix] ;
[0:a] pan=1c|c0=c1, loudnorm=i=-16:print_format=summary [audio1_mix] ;
[0:v:0] yadif=mode=0:parity=0, hqdn3d [v]' \
-analyzeduration 20000000 \
-map '[v]' -c:v:0 libx264 -pix_fmt yuv420p -crf:0 23 -profile:0 high -level:0 4.1 \
-map '[audio0_mix]' -c:a:0 aac -b:a:0 128k -ar:a:0 48000 \
-map '[audio1_mix]' -c:a:1 aac -b:a:1 128k -ar:a:1 48000 \
-aspect 16:9 -movflags faststart \
-f mp4 -metadata title=<TITEL> -metadata:s:a:0 language=deu -metadata:s:a:1 language=backup encoded/video.mp4

Poster Image + Audio zu Video

https://trac.ffmpeg.org/wiki/Create%20a%20video%20slideshow%20from%20images#Addingaudio

ffmpeg -loop 1 -i 132.png -i 132.flac \
-c:v libx264 -tune stillimage \
-c:a libfdk_aac -b:a 192k \
-pix_fmt yuv420p -shortest -map 0:v -map 1:a \
-t 5 132-Foobar.mp4

ffmpeg -loop 1 -i 132.png \
-filter_complex "aevalsrc=c=2:s=48000:0|0 [a]" \
-map 0:v -c:v libx264 -tune stillimage \
-map "[a]" -c:a libfdk_aac -b:a 192k \
-t 5 -pix_fmt yuv420p 132.mp4

for i in $(ls *.png); do ffmpeg -i $i -ar 48000 -ac 1 -f s16le -i /dev/zero -ar 48000 -ac 1 -f s16le -i /dev/zero -map 0:v -c:v mpeg2video -q:v 0 -aspect 16:9 -t 5 -map 1:0 -map 2:0 -shortest -f mpegts ${i%.png}.ts; done

Loop ein PNG ohne Audio:

ffmpeg -t 60 -loop 1 -i 0-pause.png -c:v libx264 -tune stillimage -pix_fmt yuv420p -shortest -map 0:v -f mpegts pause.ts

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> <port> <pw> /<mountpoint>

HLS streaming

ffmpeg -i - -filter:v yadif -c:v dvvideo -c:a copy -f dv - | \
tee \
>(ffmpeg -i - -c:v libx264 -threads 2 -tune zerolatency -c:a aac -strict -2 -f hls -hls_time 30.0 /usr/share/nginx/html/hls/${NAME}.m3u8 ) \
| ffmpeg2theora --title "GPN13 - ${FULLNAME}" - --speedlevel 2 -c 1 -v 3 -f dv -o - | oggfwd 127.0.0.1 8000 ppR973IRgg /${NAME}

modifikation zur default-nginx-config

set $no_cache "";
if ($request_uri ~* \.pls$) {
set $no_cache "1";
}
proxy_no_cache $no_cache;
proxy_cache_bypass $no_cache;

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).

Workflow: Der Page-Administrator muss euch eine URL und einen Streamkey zuwerfen. Er muss den Stream zuvor als “Contiguous Stream” Stream marktiert haben. Wir brauchen die nicht-SSL-Variante, da FFMPEG sich aktuell an rmtps verschluckt. Ihr startet den Stream wie im Beispiel unten. Nach ein paar Sekunden sieht der Page-Administrator den Stream und kann Live gehen.

ffmpeg -re -i $1 -framerate 25 -r 30 -ar 44100 -s 1280:720 -c:a aac -b:a 90k -movflags +faststart -preset medium -crf 17 -tune zerolatency -profile:v baseline -maxrate 2000k -vcodec libx264 -bufsize 200000k -g 60 -max_muxing_queue_size 1024 -f flv "rtmps://live-api-s.facebook.com:443/rtmp/$2"

### DEPRECATED ###
(hat letztens nicht mehr funktioniert)
ffmpeg -threads 8 -re -i QUELLE -r 30 -vf scale=-1:720 -c:v libx264 -x264-params keyint=60 -crf 23 -preset slow -b:v 3000k -minrate 2000k -maxrate 4000k -bufsize 500k -c:a aac -ar 44100 -ac 1 -f flv "rtmp://live-api.facebook.com/rtmp/STREAMKEY"

Periscope Live-Streaming

Periscope Producer will laut Anleitung zwingend 720p (stellt sich raus: sollen sogar nur 540p sein), 30 fps und eine i-Frame-Intervall von 3 Sekunden (2 sind besser und gehen auch) bei max. 4000k Bitrate. Audio darf nur 44100KHz sein (Stereo ist aber erlaubt).

ffmpeg -threads 8 -re -i QUELLE -r 30 -vf scale=-1:540 -c:v libx264 -x264-params keyint=90 -crf 23 -preset slow -b:v 2500k -minrate 2000k -maxrate 4000k -bufsize 500k -c:a aac -ar 44100 -ac 1 -f flv "rtmp://de.pscp.tv:80/x/<StreamKey>"

ffmpeg h264 encoding

ffmpeg -y -v warning -nostdin -threads 4 -analyzeduration 20000000 \
-i /video/31c3/encoded//10-h264-hd.mp4 -filter_complex "[0:0] hqdn3d,drawbox=0:0:720:1:black [vd]" \
-map "[vd]" -c:v:0 libx264 -bufsize:0 8192k -minrate:0 100k -maxrate:0 2000k -crf:0 18 -profile:0 main \
-map 0:1 -c:a:0 libfaac -b:a:0 128k -ac:a:0 2 -ar:a:0 48000 -metadata:s:a:0 language=deu \
-map 0:2 -c:a:1 libfaac -b:a:1 128k -ac:a:1 2 -ar:a:1 48000 -metadata:s:a:1 language=eng -aspect 16:9 -f mp4 \
-metadata artist=VOC-Personal -metadata author=VOC-Personal -metadata title=HD-Multilang-Test \
-metadata album="Playground-Projekt im Tracker" -metadata genre=testrecording \
-metadata description="Ein toller HD-Recording-Test mit zweisprachigem Audio und so." \
-metadata copyright="Licensed to the public under the do-whatever-you-like license (testing purposes only)" \
/video/31c3/tmp//10-h264-sd.mp4

Timestamp Stream overlay

localtime ffmpeg newest standard

-vf drawtext="fontfile=arial.ttf:fontsize=14:fontcolor=white:box=1:boxcolor=black@0.9:x=08:y=466:text=’%%{localtime\: %%m/%%d/%%Y %%I.%%M.%%S %%p}'"

strftime ffmpeg deprecated standard

-vf drawtext="expansion=strftime:fontfile=arial.ttf:fontsize=14:fontcolor=white:box=1:boxcolor=black@0.9:x=08:y=466:text=’%%m\/%%d\/%%Y %%I\:%%M\:%%S \%%p'"

Konvertiere externe Video-Dateien zu mpeg-Segmente die der Tracker versteht

In unserem scripts-Repositorie gibt es ein Skript cam2seg.sh welches alle Dateien in einem Ordner in Segmente konvertiert, welche der Tracker verstehen kann. Das Skript bitte einmal ohne Argmuente aufrufen für weitere Instruktionen: sh cam2seg.sh.

relaying a HLS stream to our cdn ( and fix most of the brokyness it comes with from "professional" CDNs )

ffmpeg -headers 'User-Agent: bar'$'\r\n' -i http://yourBrokenCDN.com/stupidfilename.m3u8 -c:v copy -c:a aac -ar 44100 -ab 128k -ac 2 -strict -2 -bsf:a aac_adtstoasc -f flv rtmp://localhost:1935/test/q1

Falls youtube und ähnliche Quellen verwendet werden sollen, deren m3u8 URLs nicht direkt auffindbar sind kann man sich Streamlink zur Hilfe nehmen. Bei youtube sieht das dann in etwa so aus:

streamlink -l debug https://www.youtube.com/watch?v=DeQkjJ9JJTI 720p --player="ffmpeg -c copy -bsf:a aac_adtstoasc -f flv rtmp://127.0.0.1:1935/live/irgendwas -i"

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)

for ((;;)) ; do ffmpeg -f applehttp -i http://cdn.c3voc.de/hls/s2_native_hd.m3u8 -c copy -f segment -segment_format mpegts -segment_time 180 -strftime 1 emf16-saalb-%Y-%m-%d_%H-%M-%S-$$.ts ; sleep 2; done

Blur eines Bildausschnitts (Rechteckiges Fenster der Größe $XSIZE und $YSIZE, mit Offset $XOFFSET und $YOFFSET, alles in Pixeln)

ffmpeg -i INPUT.MOV -filter_complex "[0:v]crop=$XSIZE:$YSIZE:$XOFFSET:$YOFFSET,boxblur=3[fg];[0:v][fg]overlay=$XOFFSET:$YOFFSET[v]" -map "[v]" -map 0:a -c:v libx264 -c:a copy -movflags +faststart BLURRED_OUTPUT.MOV

Schwarze Box / Black Box über einen Bildausschnitt legen

50 = Box-Breite, 40 = Box-Höhe, 5 = Box-X-Position, 4 = Box-Y-Position

ffmpeg -i INPUT.MOV -vf "color=black:50x40 [over]; [in][over] overlay=5:4 [out]" OUTPUT.MOV

Filter konkatenieren, hier: 2 Schwarze Boxen / Black Boxes über einen Bildausschnitt legen

Box 1 (z.B. Laufschrift-Balken)640 = Box1-Breite, 20 = Box1-Höhe, 0 = Box1-X-Position, 330 = Box1-Y-Position

Box2 (z.B. Senderlogo rechts unten)150 = Box2-Breite, 60 = Box2-Höhe, 485 = Box2-X-Position, 272 = Box2-Y2-Position

ffmpeg -i INPUT.MOV -vf "color=black:640x20 [over]; [in][over] overlay=0:330 [out1], color=black:150x60 [over]; [out1][over] overlay=485:272 [out2]" OUTPUT.MOV

RGB/YUV Blödsinn

Das ist alles sehr verwirrend, einfach beides probieren und das nehmen, was richtig aussieht.

RGB als YUV interpretieren:

-filter:v 'format=rgb24,mergeplanes=0x000102:yuv444p'

YUV als RGB interpretieren:

-filter:v 'format=yuv444p,mergeplanes=0x000102:gbrp'

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:

ffmpeg -re -f lavfi -i 'testsrc=s=1920x1080:n=3[out0];sine=beep_factor=1:f=1000[out1]' -c:v libx264 -c:a aac -f flv rtmp://[endpoint]

For use with voctomix:

ffmpeg -re -f lavfi -i 'testsrc=s=1920x1080:n=3[out0];sine=beep_factor=1:f=1000[out1]' \
-pix_fmt yuv420p -c:v rawvideo -c:a pcm_s16le -f matroska tcp://localhost:10000

To check how this looks locally without any chain involved using ffplay (good for tweaking/reference checking):

ffplay -f lavfi -i 'testsrc=s=1920x1080:n=3[out0];sine=beep_factor=1:f=1000[out1]'

ffmpeg only multiview

#/bin/bash
o='rtmp://127.0.0.1/stream/loudness'
for i in s{1,2,3,4,5,6,41,42}
do
if [[ ! -e /tmp/fifo${i} ]];
then
mkfifo /tmp/fifo${i};
fi
ffmpeg -hide_banner -v warning -y \
-i "http://cdn.c3voc.de/${i}_native_sd.webm" \
-filter_complex "nullsrc=size=640x840 [base];
[0:v] scale=640:360, fps=15 [scaled];
[0:a] ebur128=video=1:meter=18:size=640x480 [ebur][a1];
[ebur] fps=15 [v1];
[a1] aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo [audio];
[base][v1] overlay=shortest=1 [tmp1];
[tmp1][scaled] overlay=shortest=1:y=480 [ov];
[ov] drawtext=fontcolor=white:x=200:y=50:fontsize=128:fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf:text=${i} [out]" \
-map "[out]" -c:v rawvideo -pix_fmt yuv420p \
-map "[audio]" -c:a pcm_s16le \
-f matroska "/tmp/fifo${i}" &
#echo $! > /tmp/fifo${i}.pid
done
ffmpeg -hide_banner -v warning -y -fflags +genpts -flags +global_header \
-thread_queue_size 1024 -i /tmp/fifos1 \
-thread_queue_size 1024 -i /tmp/fifos2 \
-thread_queue_size 1024 -i /tmp/fifos3 \
-thread_queue_size 1024 -i /tmp/fifos4 \
-thread_queue_size 1024 -i /tmp/fifos5 \
-thread_queue_size 1024 -i /tmp/fifos6 \
-thread_queue_size 1024 -i /tmp/fifos41 \
-thread_queue_size 1024 -i /tmp/fifos42 \
-filter_complex "
[0:a][1:a][2:a][3:a][4:a][5:a][6:a][7:a] amix=inputs=8 [audio];
nullsrc=size=2560x1680 [base];
[base][0:v] overlay=shortest=1 [tmp1];
[tmp1][1:v] overlay=shortest=1:x=640 [tmp2];
[tmp2][2:v] overlay=shortest=1:x=1280 [tmp3];
[tmp3][3:v] overlay=shortest=1:x=1920 [tmp4];
[tmp4][4:v] overlay=shortest=1:x=0:y=840 [tmp5];
[tmp5][5:v] overlay=shortest=1:x=640:y=840 [tmp6];
[tmp6][6:v] overlay=shortest=1:x=1280:y=840 [tmp7];
[tmp7][7:v] overlay=shortest=1:x=1920:y=840, fps=15 [out]" \
-map "[out]" -s 1280x800 \
-c:v libx264 \
-maxrate:v:0 2000k -bufsize:v:0 8192k -crf:0 21 \
-pix_fmt:0 yuv420p -profile:v:0 main -g:v:0 15 \
-preset:v:0 veryfast \
-map "[audio]" \
-c:a aac -b:a 96k -ar 44100 \
-y -f flv ${o}
killall ffmpeg
exit

DASH encoding

VOD encoding

um static files in mehreren bitraten/aufloesungen nach DASH zu konvertieren.

ffmpeg -hide_banner -i thms-11-deu-Global_Warming_Sucks_hd.mp4 \
-fflags +genpts \
-filter_complex '
[0:v:0] scale=720:trunc(ow/a/2)*2, drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf:fontsize=34:fontcolor=white:x=08:y=08:box=1:boxcolor=black@0.5:text\=MID_150k_%{frame_num} [mid];
[0:v:0] scale=320:trunc(ow/a/2)*2, drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf:fontsize=14:fontcolor=white:x=08:y=08:box=1:boxcolor=black@0.5:text\=LOW_700k_%{frame_num} [low];
[0:v:0] scale=1280:720, drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf:fontsize=14:fontcolor=white:x=08:y=08:box=1:boxcolor=black@0.5:text\=720p_1500k_%{frame_num} [720p];
[0:v:0] drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf:fontsize=14:fontcolor=white:x=08:y=08:box=1:boxcolor=black@0.5:text\=1080p_4000k_%{frame_num} [hd]
' \
-map '[hd]' \
-metadata:s:v:0 title="1080p" \
-c:v:0 libx264 \
-preset:v veryfast \
-profile:v main \
-pix_fmt yuv420p \
-flags +cgop \
-threads:v 0 \
-aspect 16:9 \
-r:v:0 25 \
-g:v:0 75 \
-crf:v:0 21 \
-maxrate:v:0 4M \
-minrate:v:0 2M \
-bufsize:v:0 18M \
-map '[mid]' \
-metadata:s:v:1 title="MID" \
-c:v:1 libx264 \
-maxrate:v:1 700k \
-minrate:v:1 500k \
-crf:v:1 18 \
-bufsize:v:1 3600k \
-pix_fmt:v:1 yuv420p \
-profile:v:1 main \
-g:v:1 75 \
-flags:v:1 +cgop \
-preset:v:1 veryfast \
-r:v:1 25 \
-map '[low]' \
-metadata:s:v:2 title="LOW" \
-c:v:2 libx264 \
-maxrate:v:2 150k \
-minrate:v:2 100k \
-crf:v:2 18 \
-bufsize:v:2 3600k \
-pix_fmt:v:2 yuv420p \
-profile:v:2 main \
-g:v:2 75 \
-flags:v:2 +cgop \
-preset:v:2 veryfast \
-r:v:2 25 \
-map '[720p]' \
-metadata:s:v:3 title="720p" \
-c:v:3 libx264 \
-preset:v:3 veryfast \
-profile:v:3 main \
-pix_fmt:v:3 yuv420p \
-flags:v:3 +cgop \
-aspect:v:3 16:9 \
-r:v:3 25 \
-g:v:3 75 \
-crf:v:3 21 \
-maxrate:v:3 1500k \
-minrate:v:3 1000k \
-bufsize:v:3 18M \
-map '0:a' \
-metadata:s:a:0 language="Native" \
-c:a aac -b:a 96k -ar 48000 -ac 1 \
-adaptation_sets "id=0,streams=v id=1,streams=a" \
-seg_duration 30 -streaming 1 \
-hls_playlist true -use_template 1 -use_timeline 1 -f dash dash/klima1/stream.mpd

screen capture and stream

ffmpeg -vaapi_device /dev/dri/renderD128 -f x11grab -video_size 1920x1080 -framerate 25 -i :0+100,200 \
-f pulse -ac 2 -i default \
-c:a aac -b:a 128k -ar:a 48000 \
-vf 'hwupload,scale_vaapi=format=nv12' -c:v h264_vaapi -qp 24 \
-f flv rtmp://ingest.c3voc.de/xxx/xtest
ffmpeg -vaapi_device /dev/dri/renderD128 -f x11grab -video_size 1920x1080 -framerate 25 -i :0+100,200 \
-f pulse -ac 2 -i alsa_output.pci-0000_00_1f.3.analog-stereo.monitor \
-c:a aac -b:a 128k -ar:a 48000 \
-vf 'hwupload,scale_vaapi=format=nv12' -c:v h264_vaapi -qp 24 \
-f flv rtmp://ingest.c3voc.de/xxx/xtest
ffmpeg -vaapi_device /dev/dri/renderD128 -f x11grab -video_size 2560x1440 -framerate 25 -i :0 \
-f pulse -ac 2 -i alsa_output.pci-0000_00_1f.3.analog-stereo.monitor \
-c:a aac -b:a 128k -ar:a 48000 \
-vf 'hwupload,scale_vaapi=w=1920:h=1080:format=nv12' -c:v h264_vaapi -qp 24 \
-f flv rtmp://ingest.c3voc.de/xxx/xtest
ffmpeg -device /dev/dri/card0 -f kmsgrab -i - \
-vf 'hwmap=derive_device=vaapi,scale_vaapi=w=1920:h=1080:format=nv12' -c:v h264_vaapi -qp 24 \
-f flv rtmp://ingest.c3voc.de/xxx/xtest