当我使用 VLC 媒体播放器通过命令行传输视频文件时,我必须告诉我,我喜欢哪种“mux”:
vlc --network-caching=1000 -vvv <file> --sout '#http{mux=ts,dst=:8080}'
什么是多路复用器是什么意思?通过多路复用/复用视频数据可以做什么?
我正在流式传输的视频文件有H264(AVC)
视频流和AAC
音频编解码器。它以容器格式保存.mp4
。
多路复用器会用它做什么?它只是改变容器格式吗?
答案1
正如您所指出的,“视频“通常实际上既是音频又是视频。它们通常不会一起出现,而是作为单独的实体存在 - 在您的情况下是 H.266 和 AAC。
一个选择确实是在磁盘上有两个单独的文件,你可以独立播放它们 - 这通常是数字影院内容已分发。
它将为最终用户带来相同的体验,但会出现一些问题:
- 有两个文件,必须作为一个文件处理”实体“... 丢失其中一个,媒体就无法使用
- 音频/视频同步很容易失败,一个领先于另一个……除非你小心而明确地处理这个问题(例如:使用时间码)
为了解决这些问题,你可以将两个(或更多)流复用为一个流......输入“容器“。在这种情况下,该术语在某种程度上与“多路复用器“ 或者 ”复用器“。
有人可能会说,“复用器“是处理拆分或合并流的逻辑块(代码),而“容器格式“是为了存储或传输而准备和格式化数据的方式。
在更基本的电子层面上,多路复用器每次只会将一个信号发送到传输线上。
有一个装载不同的容器它们具有不同的特点和优点。容器的主要特点包括:
- 多流
- 多种音频流-例如:语言、音频描述、评论、频道(立体声与环绕声)等......
- 一个或多个视频流 - 例如:观点
- 字幕
- 元数据-例如:章节、场景、艺术家/曲目名称等...
- 音频/视频同步
- 索引——为了方便查找,这是一个令人惊讶的复杂话题!
但通常情况下,也可以存储任何容器中另一个流中的任意二进制数据。例如马特罗斯卡是一种非常开放的格式,几乎可以支持任何事物。
当您说您有一个.mp4
文件时,您可能实际上并不是指容器格式 - 通常,只要您可以让正确的应用程序来处理数据,该应用程序就会理解它正在查看的内容并进行相应的处理。
该方法仍然有效的原因是:
- 因为你使用的是 unix 系统,并且文件类型使用“魔法“——这表示使用哪个应用程序来处理它,而不是文件的扩展名。
- 因为您使用的是 Windows,所以
.mp4
识别使用哪个应用程序来处理文件 - VLC(例如)随后忽略扩展名,并正确确定实际上......它是一个 TS 文件。- 尝试重命名它
.ts
并看看会发生什么 - 这是 Windows 使用的文件扩展名和 VLC 使用更魔法-esque 技术来识别数据。
- 尝试重命名它
mux 是什么意思?mux/多路复用视频数据有什么作用?
希望我上面已经基本讲完了这一点。
您需要提供该参数的原因--sout '#http{mux=...}'
可能是因为 VLC 会在准备流式传输之前对文件进行解复用。某些容器格式不支持流式传输,或者根本不支持流式传输(例如:AVI),所以这是有道理的——你现在可以选择使用更合适的容器。传输流是一个很好的候选者,它被广泛理解,所以很多设备(例如电视)都能够处理它。
完整的流程可能看起来像这样:
多路复用器用它来做什么?
多路复用器将感兴趣的流从总体流中分离出来,并将它们输入到自己的解码和渲染管道中。
只是改变容器格式吗?
如果你指的是你的--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)
如果你想了解更多如何数据包含在内 - 例如:文件中包含哪些流,或者使用了哪些编解码器 - 那么您需要使用以下方法检查文件甚高频液晶,流处理器,FFmpeg或其他工具。例如,它有三个流:
- 视频 - 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 将允许媒体在该设备上解码。