
Ich habe einen (ziemlich großen) Satz von Dateien, das ist allesH264in einem (nMPEG TSContainer. Aus Zeitgründen muss ich diesen Inhalt in Smooth Streaming umpacken, ohne ihn zu transkodieren (die Transkodierung würde zu lange dauern).
Ich habe versucht, herauszufinden, wie das mit ffmpeg geht, da es zwei verschiedene Muxer zu geben scheint, die dieser Aufgabe gewachsen sein könnten. Ich habe sowohl den Muxer „Smoothstreaming“ als auch den Muxer „ismv“ ausprobiert, aber mit beiden habe ich Probleme.
ffmpeg -i input.mpg -codec copy -f smoothstreaming ss_out
Dabei erhalte ich folgende Fehlermeldung:
ffmpeg Version N-79695-g675cfb2 Copyright (c) 2000-2016 die FFmpeg-Entwickler erstellt mit gcc 5.3.1 (Debian 5.3.1-14) 20160409 Aufbau: libavutil 55.23.100 / 55.23.100 libavcodec 57.38.100 / 57.38.100 libavformat 57.35.100 / 57.35.100 libavdevice 57.0.101 / 57.0.101 libavfilter 6.44.100 / 6.44.100 libswscale 4.1.100 / 4.1.100 libswresample 2.0.101 / 2.0.101 Eingabe Nr. 0, mpegts, aus „input.mpg“: Dauer: 01:28:41.98, Beginn: 2.040000, Bitrate: 2500 kb/s Programm 1 Stream Nr. 0:0[0x1e1]: Video: h264 (Haupt) ([27][0][0][0] / 0x001B), yuv420p, 720x576 [SAR 16:11 DAR 20:11], 25 fps, 25 tbr, 90k tbn Stream #0:1[0x1e2](eng): Audio: mp2 ([4][0][0][0] / 0x0004), 48000 Hz, Stereo, s16p, 192 kb/s [Smoothstreaming @ 0x2616340] Die Verwendung von AVStream.codec zum Übergeben von Codec-Parametern an Multiplexer ist veraltet, verwenden Sie stattdessen AVStream.codecpar. Letzte Nachricht 1 Mal wiederholt [smoothstreaming @ 0x2616340] Keine Bitrate für Stream 0 festgelegt Ausgabe Nr. 0, Smoothstreaming, an „ss_out“: Metadaten: Encoder: Lavf57.35.100 Stream Nr. 0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 720x576 [SAR 16:11 DAR 20:11], q=2-31, 25 fps, 25 tbr, 50 tbn Stream #0:1 (eng): Audio: mp2 (i[0][0][0] / 0x0069), 48000 Hz, Stereo, 192 kb/s Stream-Mapping: Stream #0:0 -> #0:0 (Kopie) Stream #0:1 -> #0:1 (Kopie) Header für Ausgabedatei Nr. 0 konnte nicht geschrieben werden (falsche Codec-Parameter?): Ungültiges Argument
Außerdem habe ich versucht, es mit ffmpeg in ismv zu packen:
ffmpeg -i input.mpg -c copy -movflags isml+frag_keyframe -f ismv ss_out.ismv
Dies funktioniert soweit gut, aber dann brauche ich das Tool ismindex, um die Manifestdateien zu erstellen, was jedoch fehlschlägt:
ismindex -n ss_out ss_out.ismv
Unable to read the MFRA atom in ss_out.ismv (mfra size mismatch)
Mache ich etwas falsch oder stimmt möglicherweise etwas mit meiner Eingabedatei nicht?
Antwort1
Von den zwei möglichen Lösungen, die ich in meiner Frage zu haben glaubte, können beide funktionieren, führen aber zu unterschiedlichen Endergebnissen.
ISMV-Multiplexer + ISMIndex
Was ich brauchte, war ein Satz serverseitiger Dateien (.ism, .ismc, .ismv). Um dies zu erreichen, habe ich die folgenden 2 Dinge getan:
ffmpeg -i input.mpg -c:v copy -c:a aac -b:a 192k -movflags frag_keyframe -f ismv ss_out.ismv
Der obige Befehl kopiert die Videostreams, ohne sie zu transkodieren, transkodiert das Audio in AAC (obwohl sowohl ffmpeg als auch ismindex anscheinend nichts gegen MP2-Audio haben) und verpackt es in eine .ismv-Datei.
ismindex -n ss_out ss_out.ismv
Das Tool ismindex kann dann die benötigten .ism- und .ismc-Dateien erstellen.
Die Dateien, die ich daraus erhalten habe, konnten mit Media Services über IIS gestreamt werden.
Smoothstreaming-Multiplexer
Ich habe am Ende auch den „Smoothstreaming“-Muxer zum Laufen gebracht. Der Trick war, dass er ebenfalls eine .ismv-Datei als Eingabe benötigte. Also habe ich zuerst denselben ffmpeg-Befehl wie oben ausgeführt, danach konnte ich ffmpeg erneut verwenden, um es mit dem „Smoothstreaming“-Muxer neu zu verpacken.
Das Problem, das ich mit dieser Lösung hatte, ist jedoch, dass sie die Dateien erzeugt, die ein herkömmlicher Webserver für reibungsloses Streaming benötigt. Daher werden die Videofragmente aufgeteilt und die Metadaten pro Block bereitgestellt. Dies wird normalerweise alles vom Streaming-Server erledigt.