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容器格式保存。
多路复用器用它做什么?它只是改变容器格式吗?
正如您所确定的,“视频”通常实际上是音频和视频。它们通常不会结合在一起,而是作为单独的实体存在 - 在您的情况下是 H.264 和 AAC。
一种选择确实是在磁盘上有两个单独的文件,您可以独立播放它们 - 这通常是数字电影内容的分发方式。
它将为最终用户提供相同的体验,但会存在许多问题:
为了解决这些问题,您可以将两个(或多个)流复用为一个流......输入“容器”的概念。在这种情况下,该术语在某种程度上与“ Mux ”或“ Multiplexer ”同义。
有人可能会争辩说,“多路复用器”是处理拆分或合并流的逻辑块(代码),而“容器格式”是为存储或传输准备和格式化数据的方式。
在更基本的电子学层面,多路复用器一次只会将一个信号放在传输线上。
有许多不同的容器,它们具有不同的功能和优势。容器的主要特性包括:
通常但是,它也可以存储任何在容器内的另一流arbitary二进制数据。例如Matroska是一种令人难以置信的开放格式,几乎可以支持任何内容。
当你说你有一个.mp4文件时,你实际上可能不是指容器格式——通常,只要你能得到正确的应用程序来处理数据,该应用程序就会理解它在看什么并相应地处理它。
这仍然有效的原因是:
.mp4标识了使用哪个应用程序来处理文件 - VLC(例如)随后会忽略扩展名,并正确确定实际上......它是一个 TS 文件。
.ts,看看会发生什么多路复用是什么意思?多路复用/多路复用视频数据有什么作用?
希望我在上面已经大致介绍了这一点。
您需要提供--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)
Run Code Online (Sandbox Code Playgroud)
如果您想了解的不仅仅是数据是如何包含的——例如:文件中有哪些流,或者使用了哪些编解码器——那么您需要使用VLC、GStreamer、FFmpeg或其他工具检查文件。例如它有三个流:
$ 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 将允许在该设备上解码媒体。