ffmpeg: H264@MPEGTS in Smooth Streaming verpacken

ffmpeg: H264@MPEGTS in Smooth Streaming verpacken

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.

verwandte Informationen