Wie Sie festgestellt haben, handelt es sich bei einem " Video " normalerweise um sowohl Audio als auch Video. Sie kommen normalerweise nicht zusammen, sondern existieren als separate Einheiten - in Ihrem Fall H.264 und AAC.
Eine Option besteht in der Tat darin, zwei separate Dateien auf der Festplatte zu haben, die Sie unabhängig voneinander abspielen können. Auf diese Weise werden Digital Cinema- Inhalte häufig verteilt.
Es wird dieselbe Erfahrung für den Endbenutzer erzeugen, aber es wird eine Reihe von Problemen geben:
- Es gibt zwei Dateien, die als eine " Entität " behandelt werden müssen. Verliere die eine oder die andere und das Medium ist unbrauchbar
- Das Audio / Video - Synchronisation kann leicht fehlschlagen, mit einem vor dem anderen bekommen ... es sei denn, Sie mit, dass carefuly und explizit beschäftigen (zB: mit Zeitcodes )
Um diese Probleme zu beheben, können Sie die zwei (oder mehr) Streams in einen Stream multiplexen ... Geben Sie das Konzept eines " Containers " ein. In diesem Zusammenhang ist der Begriff etwas synonym mit einem " Mux " oder " Multiplexer ".
Man könnte argumentieren, dass der " Multiplexer " der logische Block (Code) ist, der sich mit dem Aufteilen oder Zusammenführen der Streams befasst, während das " Containerformat " die Art und Weise ist, in der die Daten für die Speicherung oder Übertragung vorbereitet und formatiert werden.
Auf einer grundlegenderen Elektronikebene legt ein Multiplexer einfach jeweils ein Signal auf einer Übertragungsleitung an.
Es gibt verschiedene Container, die unterschiedliche Merkmale und Vorteile aufweisen. Hauptmerkmale eines Containers sind:
- Mehrere Streams
- Mehrere Audioströme - zB: Sprachen, beschriebenes Audio, Kommentar, Kanäle (Stereo vs Surround) usw.
- Ein oder mehrere Videostreams - z. B. Blickwinkel
- Untertitel
- Metadaten - zB: Kapitel, Szene, Name des Interpreten / Tracks usw.
- Audio / Video-Synchronisation
- Indexierung - um das Suchen zu erleichtern, ein überraschend komplexes Thema!
Häufig ist es jedoch auch möglich, beliebige binäre Daten in einem anderen Stream innerhalb des Containers zu speichern . Zum Beispiel ist Matroska ein unglaublich offenes Format, das praktisch alles unterstützen kann.
Wenn Sie sagen, dass Sie über eine .mp4
Datei verfügen, beziehen Sie sich möglicherweise nicht wirklich auf das Containerformat. Wenn Sie also die richtige Anwendung für den Umgang mit den Daten erhalten, wird diese Anwendung verstehen, worum es sich handelt, und sie entsprechend verarbeiten.
Der Grund, warum das immer noch funktioniert, ist entweder:
- Da Sie ein Unix-System verwenden und der Dateityp mit " Magic " identifiziert wird, zeigt dies an, welche Anwendung verwendet werden soll, nicht die Dateierweiterung.
- Da Sie Windows verwenden, gibt
.mp4
die Anwendung an, welche Anwendung für die Verarbeitung der Datei verwendet werden soll. VLC (zum Beispiel) ignoriert anschließend die Erweiterung und stellt richtig fest, dass es sich tatsächlich um eine TS-Datei handelt.- Benennen Sie es um
.ts
und sehen Sie, was passiert - Dies ist eine Mischung aus Windows, das Dateierweiterungen verwendet, und VLC, das eine magischere Methode zum Identifizieren von Daten verwendet.
- Benennen Sie es um
Was bedeutet Mux? Was geschieht durch Multiplexen / Multiplexen der Videodaten?
Hoffentlich habe ich das oben ausführlich behandelt.
Der Grund für die Angabe des --sout '#http'
Parameters ist wahrscheinlich, dass VLC die Datei demuxt, bevor sie für das Streaming vorbereitet wird. Einige Containerformate unterstützen das Streaming nicht gut oder überhaupt nicht (z. B. AVI ). Daher ist dies sinnvoll - Sie haben jetzt die Möglichkeit, einen geeigneteren Container zu verwenden. Transport Stream ist ein guter Kandidat, und es ist gut verstanden, dass viele Geräte (z. B. Fernseher) damit umgehen können.
Die vollständige Pipeline sieht wahrscheinlich so aus:
Was macht der Multiplexer damit?
Der Multiplexer trennt die interessanten Ströme vom Gesamtstrom und führt sie in ihre eigenen Dekodier- und Renderpipelines ein.
Ändert es nur das Containerformat?
Wenn Sie sich auf Ihren --sout '#http'
Parameter beziehen, dann ja (Entschuldigung für meinen ursprünglichen Fehler) ... Wie oben erwähnt, wird die Datei in einem Format vorliegen ... aber dieses Format ist nicht unbedingt gut. Dadurch können Sie den Container ändern, um das Streaming oder den Funktionssatz eines bestimmten Geräts zu erleichtern.
Warum kann ich entweder flv-muxing oder ts-muxing verwenden und mein Video wird in beiden Fällen problemlos gestreamt?
Da dies das Containerformat zwischen Server und Client ändert, nicht das Containerformat, das der Server zum Lesen der Originaldatei verwendet.
Warum kann ich den Dateinamen von mp4 in ts ändern?
Da Magic die Daten in der Datei überprüft, um festzustellen, was es ist - auf Unix-Systemen ist die Dateierweiterung lediglich ein Hinweis für die Benutzer.
Wie kann ich das tatsächliche Containerformat der Datei überprüfen?
Verwenden Sie das file
Dienstprogramm - dieses Programm verwendet Magie, um die Datei zu identifizieren (Fingerabdruck), und sagt Ihnen, dass dies die beste Annahme ist. Diese Datei verwendet beispielsweise den QuickTime- Container:
$ file big_buck_bunny_720p_h264.mov big_buck_bunny_720p_h264.mov: ISO Media, Apple QuickTime movie, Apple QuickTime (.MOV/QT)
Wenn Sie nicht nur wissen möchten, wie die Daten enthalten sind, z. B. welche Datenströme in der Datei enthalten sind oder welche Codecs verwendet werden, müssen Sie die Datei mit VLC, GStreamer, FFmpeg oder einem anderen Tool überprüfen . Zum Beispiel hat es drei Streams:
- Video - h.264, 1280x720
- Timecode-Informationen
- Audio - AAC, 48 kHz, 5.1 Surround
$ ffprobe big_buck_bunny_720p_h264.mov ffprobe version 2.8.14-0ubuntu0.16.04.1 Copyright (c) 2007-2018 the FFmpeg developers ---8<--- snip --->8--- Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'big_buck_bunny_720p_h264.mov': Metadata: major_brand : qt minor_version : 537199360 compatible_brands: qt creation_time : 2008-05-27 18:36:22 timecode : 00:00:00:00 Duration: 00:09:56.46, start: 0.000000, bitrate: 5589 kb/s Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720, 5146 kb/s, 2 4 fps, 24 tbr, 2400 tbn, 4800 tbc (default) Metadata: creation_time : 2008-05-27 18:36:22 handler_name : Apple Alias Data Handler encoder : H.264 Stream #0:1(eng): Data: none (tmcd / 0x64636D74) (default) Metadata: creation_time : 2008-05-27 18:36:22 handler_name : Apple Alias Data Handler timecode : 00:00:00:00 Stream #0:2(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 437 kb/s (default) Metadata: creation_time : 2008-05-27 18:36:22 handler_name : Apple Alias Data Handler
Warum muss die Datei multiplext werden, um über VLC gestreamt zu werden?
Ich denke, ich habe das bereits behandelt, aber um nur klar zu sein ... das erlaubt Flexibilität. Die Demux / Mux-Operationen sind relativ leicht (im Vergleich zur vollständigen Decodierung), daher ist dies natürlich kein Problem.
Wenn Sie versuchen würden, eine AVI-Datei bereitzustellen, ohne sie zu remuxen, hätten Sie erhebliche Probleme beim Dekodieren beim Client (dies würde höchstwahrscheinlich überhaupt nicht funktionieren).
Wenn Sie auf ein Gerät abzielen, das nur einen Transport-Stream demuxieren kann, können bei Remuxing von MP4 auf TS die Datenträger außerhalb dieses Geräts decodiert werden.