Transcoding-Kommandos

Angenommen es trifft irgend eine 1920×1080 Quelle auf rtmp://live.ber.c3voc.de/stream/s2 auf, muss dieser Quellstream in die anderen Stream-Formate umgerechnet werden. In der Vergangenheit (SD) haben wir das alles auf live.ber gemacht – inzwischen (HD) gibt es dafür speedy und tweety. Die beiden erreicht man per VPN via speedy.lan.c3voc.de bzw. tweety.lan.c3voc.de. Im home von voc liegt für jeden Quellstream ein Skript transcoding_sX.sh das eine neue tmux Session mit einem Window pro Transcoding Kommando startet. Mehr als drei HD Quellstreams pro Rechner sind mit der aktuellen Konfiguration nicht möglich → Transcoding Prozesse entsprechend auf die Rechner verteilen.

ssh voc@speedy.lan.c3voc.de
tmux list-sessions
tmux attach-session -t s2
#or
tmux
./transcoding_s2.sh

Beispiel-Skript für Quelle s2

#!/bin/sh
TMUX_BIN=`command -v tmux`
# Only uncomment for Fritz
RAW_MASTER_URL=rtmp://live.ber.c3voc.de:1935/stream/s2_native_hd
SD_URL=rtmp://live.ber.c3voc.de:1935/stream/s2_native_sd
HD_URL=rtmp://live.ber.c3voc.de:1935/stream/s2_native_hd
METADATA='-metadata title="VOC Room 2"'
OPUS="while sleep 1; do ffmpeg -re -y -i $SD_URL -vn -c:a libopus -ac 2 -b:a 64k -vbr off -f ogg - | oggfwd live.ber.c3voc.de 8000 XXXX /s2_native.opus; done"
MP3="while sleep 1; do ffmpeg -re -i $SD_URL -vn -c:a libmp3lame -ac 2 -b:a 96k -y -f mp3 - | oggfwd -3 live.ber.c3voc.de 8000 XXXX /s2_native.mp3; done"
WEBM_SD="while sleep 1; do ffmpeg -re -y -i $SD_URL -aspect 16:9 -threads:0 0 -fflags +genpts -flags +global_header -c:v libvpx -g 75 -keyint_min 75 -deadline realtime -b:v 800k -ac 2 -maxrate:a 96k -c:v libvpx -c:a libvorbis -f webm - | /usr/local/bin/mse_webm_remuxer -cm 2000 - - | oggfwd -w live.ber.c3voc.de 8000 XXXX /s2_native_sd.webm; done"
WEBM_HD="while sleep 1; do ffmpeg -re -y -i $HD_URL -aspect 16:9 -threads:0 0 -fflags +genpts -flags +global_header -c:v libvpx -g 75 -keyint_min 75 -deadline realtime -b:v 2800k -ac 2 -maxrate:a 96k -c:v libvpx -c:a libvorbis -f webm - | /usr/local/bin/mse_webm_remuxer -cm 2000 - - | oggfwd -w live.ber.c3voc.de 8000 XXXX /s2_native_hd.webm; done"
H264_SD="while sleep 1; do ffmpeg -y -i $HD_URL -aspect 16:9 -threads:0 0 -c:v libx264 -filter_complex 'scale=720:576' -maxrate:v:0 800k -bufsize:v:0 8192k -crf:0 18 -pix_fmt:0 yuv420p -profile:v:0 main -g:v:0 25 -preset:v:0 veryfast -c:a copy $METADATA -y -f flv $SD_URL; done"
$TMUX_BIN new-window -n s2_native_sd "$H264_SD"
$TMUX_BIN new-window -n s2_webm_sd "$WEBM_SD"
$TMUX_BIN new-window -n s2_webm_hd "$WEBM_HD"
$TMUX_BIN new-window -n s2_mp3 "$MP3"
$TMUX_BIN new-window -n s2_opus "$OPUS"

Erklärung der einzelnen Zeilen

Angenommen es trifft irgend eine 1920×1080 Quelle auf rtmp://live.ber.c3voc.de/test/q1

Beispielkommando zum Testen einer Quelle:

ffmpeg -y -re -i http://cdn.media.ccc.de/events/camp2015/h264-hd/cccamp15-6799-en-de-How_to_Destroy_a_Laptop_with_Top_Secrets_hd.mp4 -c:v copy -c:a copy -f flv rtmp://live.ber.c3voc.de/test/q1

Quelle → MP4 HD

while true; do ffmpeg -y -i rtmp://localhost/test/q1 -aspect 16:9 -threads:0 0 -c:v libx264 -filter_complex 'yadif=mode=2, hqdn3d' -map 0:0 -maxrate:v:0 3000k -bufsize:v:0 8192k -crf:0 21 -pix_fmt:0 yuv420p -profile:v:0 main -g:v:0 25 -preset:v:0 veryfast -ac 1 -c:a libfdk_aac -b:a 96k -ar 44100 -map 0:1 -ac:a:2 2 -y -f flv rtmp://localhost/stream/q1_native_hd; sleep 1; done

MP4 HD → MP4 SD

while true; do ffmpeg -y -i rtmp://localhost/stream/q1_native_hd -aspect 16:9 -threads:0 0 -c:v libx264 -filter_complex 'scale=720:576' -maxrate:v:0 800k -bufsize:v:0 8192k -crf:0 18 -pix_fmt:0 yuv420p -profile:v:0 main -g:v:0 25 -preset:v:0 veryfast -c:a copy -y -f flv rtmp://localhost/stream/q1_native_sd; sleep 1; done

MP4 HD → WebM HD

while true; do ffmpeg -y -i rtmp://localhost/stream/q1_native_hd -aspect 16:9 -threads:0 0 -fflags +genpts -flags +global_header -map 0:v -c:v libvpx -g 75 -keyint_min 75 -deadline realtime -b:v 3000k -ac 1 -maxrate:a 96k -map 0:1 -c:a libvorbis -f webm pipe: | /usr/local/bin/mse_webm_remuxer -cm 2000 - - | oggfwd -w localhost 8000 "password" /q1_native_hd.webm; sleep 1; done

MP4 SD → WebM SD

while true; do ffmpeg -y -i rtmp://localhost/stream/q1_native_sd -aspect 16:9 -threads:0 0 -fflags +genpts -flags +global_header -map 0:v -c:v libvpx -g 75 -keyint_min 75 -deadline realtime -b:v 800k -ac 1 -maxrate:a 96k -map 0:1 -c:a libvorbis -f webm pipe: | /usr/local/bin/mse_webm_remuxer -cm 2000 - - | oggfwd -w localhost 8000 "password" /q1_native_sd.webm; sleep 1; done

MP4 SD → MP3

while true; do ffmpeg -y -i rtmp://localhost/stream/q1_native_sd -ac 1 -c:a libmp3lame -map 0:a -ac 1 -b:a 96k -y -f mp3 pipe: | oggfwd -3 localhost 8000 "password" /q1_native.mp3; sleep 1; done

MP4 SD → Opus

while true; do ffmpeg -y -i rtmp://localhost/stream/q1_native_sd -ac 1 -c:a libopus -map 0:a -b:a 64k -vbr off -f ogg pipe: | oggfwd localhost 8000 "password" /q1_native.opus; sleep 1; done