VLC 媒体播放器中的“mux”选项有什么作用?

jju*_*anf 2 video vlc-media-player streaming multiplexing

当我使用 VLC 媒体播放器通过命令行流式传输视频文件时,我必须说明我更喜欢哪种“多路复用器”:

vlc --network-caching=1000 -vvv <file> --sout '#http{mux=ts,dst=:8080}'
Run Code Online (Sandbox Code Playgroud)

多路复用是什么意思?多路复用/多路复用视频数据有什么作用?

我正在流式传输的视频文件有一个H264(AVC)视频流和一个AAC音频编解码器。它以.mp4容器格式保存。

多路复用器用它做什么?它只是改变容器格式吗?

Att*_*tie 9

正如您所确定的,“视频”通常实际上是音频和视频。它们通常不会结合在一起,而是作为单独的实体存在 - 在您的情况下是 H.264 和 AAC。

一种选择确实是在磁盘上有两个单独的文件,您可以独立播放它们 - 这通常是数字电影内容的分发方式。

它将为最终用户提供相同的体验,但会存在许多问题:

  • 有两个文件,必须作为一个“实体”处理……丢了一个,媒体就不能用了
  • 音频/视频同步很容易失败,一个会领先另一个......除非你小心和明确地处理这个问题(例如:使用时间码

为了解决这些问题,您可以将两个(或多个)流复用为一个流......输入“容器”的概念。在这种情况下,该术语在某种程度上与“ Mux ”或“ Multiplexer ”同义。

有人可能会争辩说,“多路复用器”是处理拆分或合并流的逻辑块(代码),而“容器格式”是为存储或传输准备和格式化数据的方式。

在更基本的电子学层面,多路复用器一次只会将一个信号放在传输线上。

mux 解复用图形

有许多不同的容器,它们具有不同的功能和优势。容器的主要特性包括:

  • 多个流
    • 多个音频流 - 例如:语言、音频描述、评论、频道(立体声与环绕声)等...
    • 一个或多个视频流 - 例如:观点
    • 字幕
    • 元数据 - 例如:章节、场景、艺术家/曲目名称等...
  • 音视频同步
  • 索引 - 方便查找,一个令人惊讶的复杂主题!

通常但是,它也可以存储任何在容器内的另一流arbitary二进制数据。例如Matroska是一种令人难以置信的开放格式,几乎可以支持任何内容。


当你说你有一个.mp4文件时,你实际上可能不是指容器格式——通常,只要你能得到正确的应用程序来处理数据,该应用程序就会理解它在看什么并相应地处理它。

这仍然有效的原因是:

  • 因为您使用的是 unix 系统,并且文件类型是使用“ Magic ”标识的- 这表明使用哪个应用程序来处理它,而不是文件的扩展名。
  • 因为您使用的是 Windows,所以它.mp4标识了使用哪个应用程序来处理文件 - VLC(例如)随后会忽略扩展名,并正确确定实际上......它是一个 TS 文件。
    • 尝试重命名它.ts,看看会发生什么
    • 这是使用文件扩展名的 Windows 和使用更神奇的技术来识别数据的VLC 之间的混合。

多路复用是什么意思?多路复用/多路复用视频数据有什么作用?

希望我在上面已经大致介绍了这一点。

您需要提供--sout '#http{mux=...}'参数的原因可能是因为 VLC 会在准备流式传输之前对文件进行解复用。某些容器格式不支持或根本不支持流式传输(例如:AVI),因此这是有道理的 - 您现在可以选择使用更合适的容器。传输流是一个很好的候选者,它是众所周知的,因此许多设备(例如:电视)都能够处理它。

完整的管道可能如下所示:

vlc 到 vlc 管道

多路复用器用它做什么?

多路复用器将感兴趣的流从整个流中分离出来,并将它们馈送到自己的解码和渲染管道中。

它只是改变容器格式吗?

如果您指的是您的--sout '#http{mux=...}'参数,那么是的(抱歉,对于我最初的错误)...如上所述,该文件将采用某种格式...但该格式不一定能很好地传输。这将允许您更改容器以促进流式传输或特定设备的功能集。

为什么我可以使用 flv-muxing 或 ts-muxing 并且我的视频在流式传输时没有任何问题?

因为这会更改服务器和客户端之间的容器格式,而不是服务器用来读取原始文件的容器格式。

为什么我可以将文件名从 mp4 更改为 ts?

因为魔术着眼于数据文件来建立它是什么-在Unix系统上的文件扩展名是仅仅供人使用的提示。

如何检查文件的实际容器格式?

使用该file实用程序 - 它使用魔法来识别(指纹)文件并告诉您这是最佳猜测。例如,此文件使用QuickTime容器:

$ file big_buck_bunny_720p_h264.mov
big_buck_bunny_720p_h264.mov: ISO Media, Apple QuickTime movie, Apple QuickTime (.MOV/QT)
Run Code Online (Sandbox Code Playgroud)

如果您想了解的不仅仅是数据是如何包含的——例如:文件中有哪些流,或者使用了哪些编解码器——那么您需要使用VLCGStreamerFFmpeg或其他工具检查文件。例如它有三个流:

  • 视频 - 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
Run Code Online (Sandbox Code Playgroud)

为什么需要多路复用文件才能通过 VLC 进行流式传输?

我想我已经涵盖了这一点,但要清楚……这允许灵活性。demux / mux 操作相当轻量级(与完全解码相比),所以这样做当然不是问题。

如果您尝试提供 AVI 文件而不对其进行重新组合,则尝试在客户端对其进行解码会遇到重大问题(它很可能根本不起作用)。

同样,如果您的目标是只能解复用传输流的设备,那么从 MP4 重新复用到 TS 将允许在该设备上解码媒体。