Serverseitiges aufsplitten von einem Videostream in mehrere mit unterschiedlichen Tonspuren


Ich habe in den letzten Tagen einen Livestream betreut, der simultanübersetzt wurde. Anfangs hatten wir zwei Rechner hier stehen, die jeweils das selbe Bild aber mit unterschiedlichen Audiospuren zu Youtube gestreamed haben. Also 2x Audio Interface, 2x Rechner, 2x Capture card, 2x Bildschirm und Streamstatus die ich im Blick haben musste, sowie eine Internetleitung die 2 Streams gleichzeitig rausschicken kann (wir sind immerhin in Deutschland… :( ). Ich dachte mir: Das muss doch besser gehen!

Achtung, Work in progress!

Mir war bekannt, dass SRS eine recht stabile streaming Server Software ist, ich nutze den Docker Container meist um schnell mal einen Testserver aufzusetzen, um z.B. Encodereinstellungen oder Audiosync zu testen. Die Software kann aber weitaus mehr.

Unter Anderem kann man in der config Datei ffmpeg transcoder definieren.

listen              1935;
max_connections     1000;
srs_log_tank        console;
daemon              off;
vhost __defaultVhost__ {
    transcode live/translated {
        enabled     on;
        ffmpeg      ./objs/ffmpeg/bin/ffmpeg;
        engine de {
            enabled         on;
            vcodec          copy;
            acodec          libfdk_aac;
            abitrate        160;
            asample_rate    48000;
            achannels       2;
            aparams {
                af          pan=stereo|c0=FL|c1=FL;
            }
            output          rtmp://rtmp-youtube.example/live/stream-deutsch;
        }
        engine en {
            enabled         on;
            vcodec          copy;
            acodec          libfdk_aac;
            abitrate        160;
            asample_rate    48000;
            achannels       2;
            aparams {
                af          pan=stereo|c0=FR|c1=FR;
            }
            output          rtmp://rtmp-youtube.example/live/stream-englisch;
        }
    }
}

Die beiden engine’s transcodieren den Stream und leiten ihn weiter. In meinem Fall geht es nur um Sprache, also reichte mir eine Monospur vollkommen aus für den Stream, daher hab ich einfach auf dem linken Kanal die deutsche Spur und auf dem rechten Kanal die englische Spur angenommen. Die beiden engines kopieren den Videocodec einfach, also braucht es serverseitig keine starke CPU / GPU um die streams zu encoden, das einzige was ffmpeg ändert ist der Audiocodec. Mit dem Audio Filter (af) “pan”, kann man Audiokanäle mischen und verändern. In dem Fall sage ich, dass ich ein Kanallayout “stereo” haben will, bei dem in der ersten engine c0 und c1 jeweils “FL” (FrontLeft) bekommen sollen und in der zweiten engine bekommen c0 und c1 jeweils “FR”. Im output definiere ich dann noch den jeweiligen Zielstream und sobald ich dann zu meinem Server streame rtmp://live.example.com/live/translated starten die beiden ffmpeg prozesse und schicken den Stream weiter zu Youtube mit aufgetrennten Audiokanälen.

OBS kann mit erweiterten Einstellungen auch mehr als eine Audiospur streamen, das muss ich nochmal testen, dann wäre es auch möglich zwei Stereospuren aufzusplitten.