32个版本
0.2.21 | 2024年7月27日 |
---|---|
0.2.16 | 2024年3月31日 |
0.2.14 | 2024年2月18日 |
0.2.12 | 2023年12月25日 |
0.1.1 | 2022年3月19日 |
54 在 视频
每月322次下载
130KB
801 行
dash-mpd-cli
用于从DASH MPD文件下载媒体内容的命令行应用程序,用于电视内容点播回放和视频流媒体服务。
DASH(动态自适应流HTTP),也称为MPEG-DASH,是一种用于在网络上进行媒体流传输的技术,常用于视频点播(VOD)和“回放/快进电视”服务。媒体呈现描述(MPD)是一个XML文档,列出了组成流媒体服务的资源(描述或“播放列表”)。DASH客户端使用描述来确定请求哪些资源以执行内容的自适应流传输。DASH MPD描述可以与使用不同编解码器(包括H264、HEVC、AV1、AAC、VP9、MP4A、MP3)和容器(MP4、WebM、Matroska、AVI)的内容一起使用。在 howvideo.works 上有关于自适应比特率视频流的良好解释。
此命令行应用程序允许您将流媒体视频或音频下载到本地设备。这涉及选择最适合的编码(在比特率、编解码器等方面),使用HTTP或HTTPS请求获取内容片段,并将音频和视频片段混合在一起。还支持下载字幕(主要是WebVTT、TTML、SRT、tx3g和SMIL格式,以及一些对wvtt格式的支持)。
此应用程序基于 dash-mpd 软件包。它适用于使用DASH自适应流(MPD描述)的流,目前不支持HLS流(m3u8描述)。
📖 您可能对用户手册感兴趣。
特性
以下特性得到支持
-
多周期 内容。如果格式兼容(相同的分辨率、编解码器、比特率等),并且未提供
--no-period-concatenation
命令行选项,则将不同流中的媒体保存在单个媒体容器中,否则在单独的媒体容器中。 -
应用程序可以下载通过HTTP、HTTPS和HTTP/2可用的内容。网络带宽可以被限制(请参阅命令行参数
--limit-rate
)。 -
支持通过命令行参数
--proxy
使用SOCKS和HTTP代理。以下环境变量也可以用来在系统级别指定代理:用于HTTP连接的HTTP_PROXY
或http_proxy
,用于HTTPS连接的HTTPS_PROXY
或https_proxy
,以及用于所有连接类型的ALL_PROXY
或all_proxy
。可以使用命令行参数--no-proxy
禁用系统代理。 -
支持HTTP基本认证(请参阅命令行参数
--auth-username
和--auth-password
)以及Bearer认证(请参阅命令行参数--auth-bearer
)。此认证信息将被发送到承载DASHManifest的服务器,以及承载媒体片段的服务器(后者通常是CDN)。 -
字幕:支持下载WebVTT、TTML、SRT、tx3g和SMIL流,以及一些对wvtt格式的支持。我们支持作为完整文件发布的字幕以及作为媒体片段提供的分段字幕。
-
应用程序可以从Linux、Windows和MacOS上的Firefox、Chromium、Chrome、ChromeBeta、Safari和Edge浏览器中读取cookie,归功于bench_scraper库。请参阅命令行参数
--cookies-from-browser
。支持多个配置文件的多配置文件浏览器将对其所有配置文件进行cookie抓取。 -
支持解密使用内容保护(DRM 🗝️)的媒体流。这需要安装命令行应用
mp4decrypt
或shaka-packager
。mp4decrypt可从Bento4套件获取(常见平台上的二进制文件可用),而shaka-packager二进制文件由Google提供(可在其GitHub页面的发布部分找到)。请参阅命令行参数--key
指定解密密钥(如果对不同的媒体流使用不同的密钥,可以使用多次)。请参阅命令行参数--decryption-application
指定要使用的解密应用。Shaka packager能够解密更多类型的媒体流(特别是WebM容器和更多加密格式),而mp4decrypt主要与MPEG Common Encryption一起使用。 -
支持根据音频语言、视频流的质量、水平和垂直分辨率以及角色注解(例如,使用
main
而不是alternate
角色)来选择下载流。 -
在下载前支持重写MPDManifest,例如,通过替换某些片段的URL,或者根据不同的标准(如它们起源的CDN或DAI服务器、内容语言)删除某些周期。重写指令由用户提供的XSLT样式表指定,该样式表应用于MPDManifest的XML(请参阅命令行参数
--xslt-stylesheet
)。还提供了一种方便的基于XPath规范删除元素的形式(请参阅命令行参数--drop-elements
)。此功能依赖于xsltproc命令行工具。 -
支持XLink元素(仅限于actuate=onLoad语义),包括解析为零。
-
所有形式的片段索引信息:SegmentBase@indexRange,SegmentTimeline,SegmentTemplate@duration,SegmentTemplate@index,SegmentList。
-
mkvmerge、ffmpeg、VLC或MP4Box支持的所有类型的媒体容器(这包括ISO-BMFF / CMAF / MP4,Matroska,WebM,MPEG-2 TS,AVI),以及这些应用程序支持的所有编解码器。
-
流媒体服务器上可用的所有视频分辨率,包括1080p和4K内容。
-
实际上,所有真实流媒体服务和点播电视使用的功能。我们的测试套件包括由HbbTV和DASH行业论坛等行业协会发布的测试流,包括使用不同发布软件的多种DASH流,包括Netflix和其他服务使用的GPAC,Amazon MediaTailor,Google的Shaka打包器,Microsoft的Azure媒体服务,以及统一流媒体。测试内容由Akamai和各种电信提供商等不同的CDN提供。
以下目前不支持
-
直播流(动态MPD表示),用于直播/OTT电视实际上并不支持。这是因为我们没有实现仅在有媒体片段可用时才下载媒体片段所需的时钟相关节流。然而,一些媒体源发布“伪直播”流,其中所有媒体片段实际上都可用;它们只是在直播完成后不更新表示。我们可以使用
--enable-live-streams
命令行参数下载这些流。您也可能在结合使用--sleep-requests
命令行参数的情况下取得一些成功。VLC应用程序是观看直播流的更好选择。 -
具有actuate=onRequest语义的XLink元素。
-
HLS流(m3u8表示)。
在Docker容器中安全运行
该应用程序,以及它用于复用媒体流、提取/转换字幕流和为受DRM感染的流解密的外部辅助应用程序,都作为预构建容器提供,这可能是运行它最简单、最安全的方式。容器包含最小化的Alpine Linux安装,可以在任何可以运行Linux容器的宿主上运行(使用Linux上的Podman或Docker,Windows和MacOS)。它可在GitHub容器注册库中找到:ghcr.io
。
[!TIP] 与在您的机器上本地运行相比,在容器中运行的优势是什么?
非常安全,因为容器无法修改您的宿主机器,除了将下载的媒体写入您指定的目录。当运行从互联网下载的随机软件时,这是一个非常好的主意!
无需安装容器中已存在的各种辅助应用程序(ffmpeg,mkvmerge,mp4decrypt,shaka-packager,MP4Box,xsltproc)。
自动运行最新版本的dash-mpd-cli和各种辅助应用程序(容器运行时将自动为您拉取最新版本)。
Podman和Docker还允许您设置分配给容器的各种资源限制(CPU数量,内存);请参阅它们的相应文档。
与在虚拟机上运行软件不同,在容器中运行几乎没有性能损失。这并不完全正确:如果您在aarch64(“苹果硅”)Mac上运行容器,Podman将为您设置一个虚拟机。在Windows上,Podman将为您设置一个低开销的WSL2虚拟机。
我推荐安装Podman,因为它完全是免费软件,而Docker部分是商业软件。Podman还能够在没有特殊权限的情况下运行容器“rootless”,这对安全性有利。
要使用podman运行容器
podman machine start (optional step, only required on Windows and MacOS)
podman run --rm -v .:/content ghcr.io/emarsden/dash-mpd-cli -v <MPD-URL> -o foo.mp4
首次运行时,这将从GitHub容器注册表ghcr.io检索容器镜像(约220 MB),并将其保存到您的本地磁盘以供以后使用。如果您不再需要该镜像,可以使用podman image rm
和podman images
显示的镜像ID来删除它(有关详细信息,请参阅用户手册)。
📁 您当前的工作目录(.
)将作为/content
挂载到容器中,这将是容器中的工作目录。这意味着一个没有指定根目录的输出文件,如foo.mp4
,将保存到主机的当前工作目录。
在Linux/AMD64上,还可以使用gVisor容器运行时runsc运行容器,它使用沙箱来进一步提高安全性(强隔离,防止提权)。这需要安装runsc并以root用户运行(runsc目前不支持无root操作)。
sudo apt install runsc
sudo podman --runtime=runsc run --rm -v .:/content ghcr.io/emarsden/dash-mpd-cli -v <MPD-URL> -o foo.mp4
容器镜像是一个多架构
清单,目前为以下平台构建
- linux/amd64
- linux/arm64
- linux/armv7(应在树莓派上运行)
- linux/riscv64
- linux/ppc64le
安装
如果您更喜欢以传统方式在计算机上安装软件及其依赖项,您可以下载预构建的二进制文件或自行构建。
二进制发行版
可在GitHub上找到,适用于AMD64上的GNU/Linux(与Musl Libc静态链接以避免glibc版本问题),AMD64上的Microsoft Windows和aarch64上的MacOS(“Apple Silicon”)。这些是在GitHub持续集成基础设施上自动构建的。
您还可以使用已安装的Rust开发环境从源代码构建。
cargo install dash-mpd-cli
这将二进制文件安装到安装根目录的bin
目录,这通常是$HOME/.cargo/bin
。
您还应该安装以下依赖项
-
如果要将文件下载到Matroska容器格式(
.mkv
文件扩展名),请从MkvToolnix套件中安装mkvmerge命令行工具。mkvmerge用作子进程进行复用(组合)音频和视频流。如果未安装在标准位置(不在您的PATH中),请参阅--mkvmerge-location
命令行参数。 -
下载到MP4容器格式时,需要ffmpeg或vlc,也用于复用音频和视频流(如果这些安装在非标准位置,请参阅
--ffmpeg-location
和--vlc-location
命令行参数)。有关不同容器类型的复用应用程序的首选,请参阅--muxer-preference
命令行参数。 -
如果您想测试对wvtt格式字幕的初步支持,请从GPAC项目中安装MP4Box命令行工具。如果已安装,MP4Box将用于将wvtt流转换为更广泛认可的SRT格式。如果ffmpeg和vlc不可用,MP4Box还可以用作备选方案,用于将音频和视频流复用到MP4容器中。如果此工具安装在不标准位置,请参阅
--mp4box-location
命令行参数。 -
如果您需要获取加密内容,可以使用来自 Bento4 套件 的 mp4decrypt 命令行应用程序。对于常见的平台,有可用的 二进制文件。如果安装在不标准的路径,请参阅
--mp4decrypt-location
命令行参数。 -
对于一些 mp4decrypt 应用程序无法解密的流类型(例如 WebM 容器中的内容),您应该安装由 Google 开发的 Shaka 打包器应用程序。要指定解密应用程序的选择,请参阅
--decryption-application
命令行选项,如果安装在不标准的路径,请参阅--shaka-packager-location
命令行参数。 -
libxslt 中的 xsltproc 命令行实用工具,用于 MPD 重写功能(
--drop-elements
和--xslt-stylesheet
命令行选项)。
此软件包已在以下 平台 上进行了测试
-
我们的预构建容器镜像已在 Linux 和 Windows 上使用 Podman 进行了测试
-
AMD64 (x86-64) 和 Aarch64 架构上的 Linux
-
AMD64 和 Aarch64(“Apple Silicon”)架构上的 MacOS
-
AMD64 上的 Microsoft Windows 10 和 Windows 11
-
通过 termux 在 Aarch64 上的 Android 12(您需要安装 rust、binutils 和 ffmpeg 软件包,以及可选的 mkvtoolnix、vlc 和 gpac 软件包)。您需要通过使用
--no-default-features
编译来禁用cookies
功能。 -
FreeBSD/AMD64 和 OpenBSD/AMD64。您需要禁用
cookies
功能。我们依赖的一些外部应用程序(例如 mp4decrypt、Shaka 打包器)在 OpenBSD 上的支持很差。
用法
请参阅 📖 用户手册。
复用
基础库 dash-mpd-rs
有两种方法将音频和视频流复用在一起。如果启用库功能 libav
(这不是默认配置),则复用支持由 ffmpeg 的 libav 库提供,通过 ac_ffmpeg
软件包。否则,复用通过调用外部复用器,mkvmerge(来自 MkvToolnix 套件)、ffmpeg、vlc 或 MP4Box 作为子进程来实现。请注意,这些命令行应用程序实现了一些检查和解决方案来修复在野外存在的一些无效输入流。当使用 libav 作为库时,其中一些解决方案在此处实现,但并非全部,因此默认配置下的下载支持通常更稳健(使用外部应用程序作为子进程)。目前,libav
功能仅在 Linux 上工作。
外部复用器的选择取决于提供给 --output
或 -o
(如果您没有明确指定输出路径,它将是 .mp4
)的路径的文件扩展名
.mkv
:首先调用 mkvmerge,然后如果失败,调用 ffmpeg,最后尝试 MP4Box.mp4
:首先调用 ffmpeg,然后如果失败,调用 vlc,最后尝试 MP4Box.webm
:首先调用 vlc,然后如果失败,调用 ffmpeg- 其他:尝试 ffmpeg,它支持许多容器格式,然后尝试 MP4Box
您可以使用 --muxer-preference
命令行选项指定复用应用程序的优先级顺序。例如,--muxer-preference avi:vlc,ffmpeg
表示对于 AVI 媒体容器,将首先尝试外部复用器 vlc,如果失败,则尝试 ffmpeg。此命令行选项可以多次使用,为不同类型的容器指定选项。
类似工具
能够从DASH媒体描述文件中下载内容的类似命令行工具
-
yt-dlp<MPD-URL>
-
N_m3u8DL-RE <MPD-URL>
-
streamlink-o/tmp/输出.mp4<MPD-URL>最差的
-
ffmpeg-i<MPD-URL> -视频编解码器复制/tmp/输出.mp4
-
vlc<MPD-URL>
-
gst-启动-1.0playbin uri=<MPD-URL>
然而,dash-mpd-cli(此应用程序)能够下载其他应用程序无法工作的某些流的内容
- 使用xHE-AAC编解码器的流目前不受ffmpeg、streamlink、vlc和gstreamer支持
- 多周期媒体描述文件中的流
- 使用XLink元素的流
构建
$ sudo apt install protobuf-compiler
$ git clone https://github.com/emarsden/dash-mpd-cli
$ cd dash-mpd-cli
$ cargo build --release
$ target/release/dash-mpd-cli --help
应用程序还可以在Linux上使用musl-libc目标进行静态构建。首先在你的系统上安装MUSL C标准库。将linux-musl添加到你的Rust工具链中,然后为相关目标重新构建
$ sudo apt install musl-dev
$ rustup target add x86_64-unknown-linux-musl
$ cargo build --release --target x86_64-unknown-linux-musl
静态musl-libc构建与OpenSSL不兼容,因此我们在dash-mpd crate中禁用默认功能,并使用rustls支持(Rust TLS堆栈)构建。你可能会遇到rustls无法连接(例如握手错误)的情况,而系统上的其他应用程序可以连接。这些行为差异通常是由于根证书集的不同配置造成的。如果你更喜欢使用机器的本地TLS堆栈,请在Cargo.toml
中将两个rustls-tls
实例替换为native-tls
,然后重新构建。
为什么?
此应用程序核心的dash-mpd-rs库的开发是为了让作者在健身房时能够观看由公共媒体广播公司制作的新闻节目。该节目以DASH流的形式发布在广播公司的“重放”服务上,但健身房的网络服务有时很差。第一世界的问题!
[!警告] 作者既不是道德警察也不是律师,但请注意,分发你没有制作的媒体内容,可能会根据发布许可而侵犯知识产权法。此外,在某些国家,绕过DRM可能被禁止。
许可证
本项目采用MIT许可证。更多信息,请参阅LICENSE-MIT
文件。
依赖关系
~25–67MB
~1M SLoC