web-dev-qa-db-ja.com

VLCメディアプレーヤーの「マルチプレクサ」オプションは何をしますか?

VLCメディアプレーヤーを使用してコマンドラインでビデオファイルをストリーミングする場合、どの種類の「マルチプレクサ」が好きかを伝える必要があります。

_vlc --network-caching=1000 -vvv <file> --sout '#http{mux=ts,dst=:8080}'
_

muxはどういう意味ですか?ビデオデータを多重化/多重化するとどうなりますか?

私がストリーミングしているビデオファイルには、H264(AVC)ビデオストリームとAACオーディオコーデックがあります。 _.mp4_コンテナ形式で保存されます。

マルチプレクサはそれで何をしていますか?コンテナのフォーマットを変更するだけですか?

2
jjulianf

ご存知のように、「video」は通常、実際にはオーディオとビデオの両方です。それらは通常一緒にはなりませんが、別々のエンティティとして存在します-あなたの場合はH.264とAACです。

1つのオプションは、実際には、ディスク上に2つの別々のファイルを用意し、それらを独立して再生することです。これは、多くの場合、 Digital Cinema コンテンツの配布方法です。

エンドユーザーにも同じエクスペリエンスが提供されますが、いくつかの問題が発生します。

  • 2つのファイルがあり、1つの "entity"として処理する必要があります...どちらか一方を失うと、メディアが使用できなくなります
  • オーディオ/ビデオの同期は簡単に失敗する可能性があり、一方が他方よりも進んでいます...慎重かつ明示的に対処しない限り(例: タイムコード を使用)

これらの問題に対処するために、2つ(またはそれ以上)のストリームを1つのストリームに多重化できます...「 コンテナ 」の概念を入力してください。このコンテキストでは、この用語は「Mux」または「 マルチプレクサ 」と同義です。

マルチプレクサ」はストリームの分割またはマージを処理する論理ブロック(コード)であり、「コンテナ形式」はデータの準備方法であり、ストレージまたは送信用にフォーマットされています。

より基本的な電子機器レベルでは、マルチプレクサは一度に1つの信号を伝送ラインに配置するだけです。

mux demux graphic

さまざまな機能と利点を持つ さまざまなコンテナのロード があります。コンテナの主な機能は次のとおりです。

  • 複数のストリーム
    • 複数のオーディオストリーム-例:言語、音声ガイド、解説、チャンネル(ステレオvsサラウンド)など...
    • 1つ以上のビデオストリーム-例:視点
    • 字幕
    • メタデータ-例:チャプター、シーン、アーティスト/トラック名など...
  • オーディオ/ビデオの同期
  • インデックス作成-シークを容易にするために、驚くほど複雑なトピックです!

ただし、多くの場合、コンテナ内の別のストリームにany任意のバイナリデータを格納することもできます。たとえば、 Matroska は、事実上すべてをサポートできる非常にオープンなフォーマットです。


.mp4ファイルがあると言うとき、実際にはコンテナ形式を参照していない可能性があります。通常、データを処理する正しいアプリケーションを取得できる限り、そのアプリケーションは何を見て処理しているかを理解します。それに応じてそれ。

これがまだ機能する理由は次のいずれかです。

  • UNIXシステムを使用していて、 ファイルタイプ は「 Magic 」を使用して識別されるため、これは使用するアプリケーションを示しますファイルの拡張子ではなく、それを処理します。
  • Windowsを使用しているため、.mp4は、ファイルの処理に使用するアプリケーションを識別します。たとえば、VLCはその後、拡張子を無視し、実際には...それがTSファイルであると正しく判断します。
    • 名前を.tsに変更して、何が起こるかを確認してください
    • これは、ファイル拡張子を使用するWindowsと、データを識別するために magic 風の手法を使用するVLCを組み合わせたものです。

マルチプレクサとはどういう意味ですか?ビデオデータを多重化/多重化するとどうなりますか?

うまくいけば、私はこれを上で大部分カバーしました。

--sout '#http{mux=...}'パラメーターを指定する必要がある理由は、VLCがストリーミングの準備をする前にファイルをデマルチプレクサするためである可能性があります。一部のコンテナ形式はストリーミングを適切にサポートしていないか、まったくサポートしていません(例: [〜#〜] avi [〜#〜] )ので、これは理にかなっています-これで、より適切なコンテナ。トランスポートストリームは良い候補であり、非常に多くのデバイス(テレビなど)がそれを処理できることはよく理解されています。

完全なパイプラインはおそらく次のようになります。

vlc to vlc pipeline

マルチプレクサはそれで何をしていますか?

マルチプレクサは、対象のストリームをストリーム全体から分離し、それらを独自のデコードおよびレンダリングパイプラインに供給します。

コンテナのフォーマットを変更するだけですか?

--sout '#http{mux=...}'パラメータを参照している場合は、yes(申し訳ありませんが、私の最初の間違いです)...上記のように、ファイルはフォーマットになります...しかし、そのフォーマットは必ずしもうまくストリーミングされるとは限りません。これにより、ストリーミングを容易にするためにコンテナを変更したり、特定のデバイスの機能セットを変更したりできます。

Flv-muxingまたはts-muxingのいずれかを使用でき、どちらの方法でも問題なくビデオがストリーミングされるのはなぜですか?

これにより、サーバーが元のファイルを読み取るために使用しているコンテナー形式ではなく、サーバーとクライアントの間でコンテナー形式が変更されるためです。

ファイル名をmp4からtsに変更できるのはなぜですか?

magic はファイルのデータinを調べて、それが何であるかを確認するため、Unixシステムでは、ファイル拡張子はユーザーが使用するためのヒントにすぎません。

ファイルの実際のコンテナ形式を確認するにはどうすればよいですか?

file ユーティリティを使用します-これは magic を使用してファイルを識別(フィンガープリント)し、それが最良の推測であることを示します。たとえば、このファイルは QuickTime コンテナを使用します。

$ file big_buck_bunny_720p_h264.mov
big_buck_bunny_720p_h264.mov: ISO Media, Apple QuickTime movie, Apple QuickTime (.MOV/QT)

howだけでなく、データが含まれていることを知りたい場合(たとえば、ファイルに含まれるストリームや使用されているコーデック)、 [を使用してファイルを検査する必要があります。 〜#〜] vlc [〜#〜]GStreamerFFmpeg 、または別のツール。たとえば、次の3つのストリームがあります。

  • ビデオ-h.264、1280x720
  • タイムコード情報
  • オーディオ-AAC、48 kHz、5.1サラウンド
$ 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

VLC経由でストリーミングするためにファイルを多重化する必要があるのはなぜですか?

これについてはすでに説明したと思いますが、明確にするために...これにより柔軟性が得られます。 demux/mux操作は(完全なデコードと比較した場合)かなり軽量であるため、当然のことながらこれを行うことは実際には問題ではありません。

AVIファイルをリマックスせずに提供しようとすると、クライアントでデコードしようとすると重大な問題が発生します(ほとんどの場合、まったく機能しません)。

同様に、トランスポートストリームをデマルチプレクサできるのみのデバイスをターゲットにしている場合、MP4からTSに再マルチプレクサすると、そのデバイス以外でメディアをデコードできます。

4
Attie