ffmpeg: Videolivestream mit Live-Audiostream
Es gibt durchaus im Audiobusiness häufiger den Anwendungsfall, dass man auf Videoplattformen den Live-Audio-Stream mit einem Standard-Footage weiterverbreiten möchte. Das geht mit ffmpeg relativ simpel. Hier ein Beispiel unter Debian 11, das sehr generisch ist. Der Aufbau ist immer der selbe:
- unter STREAM_URL wird der Streamingserver eingetragen, z.B. von YouTube,
- unter SOURCE1 das Video oder Bild, das als Loop laufen soll,
- unter SOURCE2 der Audiostream und
- unter KEY der Streamingkey für die Plattform (Authentifizierungskey).
- threads sollte je nach CPU Kernanzahl gesetzt werden
Bild Stream Beispiel
1 2 3 4 5 6 7 8 9 10 11 12 13 | #! /bin/bash STREAM_URL= "rtmp://..." SOURCE1= "/var/www/htdocs/mixcloud-video.jpg" SOURCE2= "https://stream.url/stream" KEY= "" ffmpeg \ -loop 1 -i "$SOURCE1" -i "$SOURCE2" \ -c: v libx264 -tune stillimage -pix_fmt yuv420p \ -b:a 192k -threads 4 -preset fast -bufsize 2048k \ -f flv "$STREAM_URL/$KEY" |
Video Stream Beispiel
1 2 3 4 5 6 7 8 9 10 11 12 13 | #! /bin/bash STREAM_URL= "rtmp://..." SOURCE1= "/var/www/htdocs/mixcloud-video.mp4" SOURCE2= "https://stream.url/stream" KEY= "" ffmpeg \ -re -stream_loop -1 -i "$SOURCE1" -i "$SOURCE2" \ -c: v libx264 -tune stillimage -pix_fmt yuv420p \ -b:a 192k -threads 4 -preset fast -bufsize 2048k \ -f flv "$STREAM_URL/$KEY" |
Minimale Videosource Anlieferung
Wer einen RTMP Audiostream generieren möchte mit minimaler Anforderung, sollte sich zunächst von Wikimedia das 1×1 Pixel große PNG runterladen und dann folgende Settings verwenden:
1 2 3 4 5 6 7 8 9 10 11 12 | #! /bin/bash STREAM_URL= "rtmp://..." SOURCE1= "/var/www/htdocs/1x1.png" SOURCE2= "https://stream.url/stream" KEY= "" ffmpeg \ -loop 1 -i "$SOURCE1" -i "$SOURCE2" \ -c: v h264 -pix_fmt yuv420p -tune stillimage -profile: v baseline -crf 24 -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" \ -b:a 96k -threads 4 -preset fast -bufsize 1024k \ -f flv "$STREAM_URL/$KEY" |
Service
Damit der ffmpeg Aufruf im Hintergrund sauber weiterläuft einfach unter /etc/system/systemd/ einen Service anlegen, z.B. ffmpeg-mixcloud.service:
1 2 3 4 5 6 7 8 9 10 11 12 13 | [Unit] Description=mixcloudstream After=network.target remote-fs.target nss-lookup.target [Service] User=root Restart=on-failure RestartSec=30 ExecStart= /root/mixcloudstream .sh KillSignal=SIGTERM [Install] WantedBy=multi-user.target |
Hier gilt es darauf zu achten, dass unter ExecStart der richtige Pfad zum Skript oben hinterlegt ist.