使用媒体通常需要更改媒体文件的特性,例如比特率或分辨率。想找到一种简单直接的上手方式 可能会令人望而生畏在本页中,您将了解所使用的工具以及如何快速安装这些工具。
我们首先介绍两种常用的命令行媒体实用程序(Shaka Packager 和 FFmpeg)的基本用法,然后帮助大家快速安装这些工具。为什么要涵盖两种应用?虽然两者本身都强大且有用,但它们都无法满足为 Web 准备媒体所需的一切。我们还创建了媒体转换和媒体加密页面,显示了这两种应用的许多更为常见的操作。
这些应用并不是可用于文件处理任务的唯一选项,但它们是最常见的两种,也是功能最强大的应用。其他选项包括 GUI 应用 Miro、HandBrake 和 VLC。此外,还有编码/转码服务,例如 Zencoder、Amazon Elastic Encoder 和 Google Transcoder API。
Shaka 打包器
Shaka Packager 是一个免费的媒体打包 SDK。如果您在网站上使用媒体播放器,则需要使用 Shaka Packager 准备文件。它支持对两种最常见的视频流式传输协议进行转换:基于 HTTP 的动态自适应流式传输 (DASH) 或 HTTP 实时流式传输 (HLS)。Shaka Packager 支持关键安全功能:通用加密和 Widevine 数字版权管理 (DRM)。还可以处理直播和视频点播。
尽管软件包上会有说明,但此实用程序不仅适用于 C++ 开发者。它既可用作构建媒体软件的库,也可用作为网页播放准备媒体文件的命令行实用程序。后一种容量在这方面对我们很有用。事实上,对于网站媒体创作者来说,Shaka Packager 是在不花钱购买昂贵商业应用的情况下完成某些任务的唯一方法。
以下是 Shaka Packager 命令的基本模式:
packager stream_descriptor [stream_descriptor-2 [stream_descriptor-n]] [flags]
输入 packager -help
后,实际结果并不十分理想。此示例更易于推断,这反映了 Shaka Packager 文档中的示例。请注意,模式中有多个 stream_descriptor
项。虽然我们未显示此模块,但您可以通过单个命令分别操纵文件的视频和音频流。
将此基本模式与显示文件特征的简单用法进行比较。在本示例中,我们排队了等效部分。
packager stream_descriptor [stream_descriptor-n] [flags]
packager input=glocken.mp4 --dump_stream_info
该命令会输出以下内容:
File "glocken.mp4":
Found 2 stream(s).
Stream [0] type: Video
codec_string: avc1.640028
time_scale: 30000
duration: 300300 (10.0 seconds)
is_encrypted: false
codec: H264
width: 1920
height: 1080
pixel_aspect_ratio: 1:1
trick_play_factor: 0
nalu_length_size: 4
Stream [1] type: Audio
codec_string: mp4a.40.2
time_scale: 48000
duration: 481280 (10.0 seconds)
is_encrypted: false
codec: AAC
sample_bits: 16
num_channels: 2
sampling_frequency: 48000
language: eng
seek_preroll_ns: 20833
查找媒体文件基础知识中讨论的特性,并注意以下几点。高度和宽度对于全高清是正确的,音频和视频编解码器是其容器类型的首选编解码器(对于音频编解码器和 H264 编解码器)是其容器类型的首选编解码器。另请注意,流用数字进行标识。它们对于单独处理音频和视频的操作非常有用。
请注意,上面的输出未显示比特率。尽管此输出缺少内容,但更易于阅读,因此我们会尽可能使用它。当我们需要 Shaka Packager 无法获取的信息(如比特率)时,可以使用 FFmpeg。
FFmpeg
FFmpeg 也是一款用于录制、转换和流式传输媒体文件的免费应用。它的功能与 Shaka Packager 的差不多。 只是两者有所不同。
FFmpeg 命令的基本模式如下所示:
ffmpeg [GeneralOptions] [InputFileOptions] -i input [OutputFileOptions] output
与 Shaka Packager 一样,此应用可以处理多个流。它的一些选项用于多个位置,并根据它们在命令中的位置以不同的方式处理文件输出。在查看 Stack Overflow 上的 FFmpeg 问题和类似网站时,请注意这一点。
我们再次将基本模式与显示文件特性的示例进行比较。
ffmpeg [GeneralOptions] [InputFileOptions] -i input [OutputFileOptions] output
ffmpeg -i glocken.mp4
除了我们请求的信息之外,此命令还会输出错误消息,如以下示例所示。这是因为从技术上讲,这是不正确的 FFmpeg 用法。我们之所以使用它,是因为它显示了我们所关心的信息。
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'glocken.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.17.100
Duration: 00:01:47.53, start: 0.000000, bitrate: 10715 kb/s
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc), 1920x1080, 10579 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : SoundHandler
At least one output file must be specified
使用 Docker 安装应用
如果您打算按照我们的说明操作并试用我们的命令,可以手动安装所需的工具,也可以采用简单的方法并使用 Docker。我们建议使用 Docker,因为这将为您节省大量时间除此之外,我们还提供了相关说明,帮助您快速完成设置。
首先,在计算机上的某处创建一个名为
media-tools
的新目录;您可以使用自己喜欢的任何名称,但请注意,以下说明假定您使用media-tools
作为目录名称。在
media-tools
内创建docker
和media
目录。这会使media
目录脱离构建上下文。这一点很重要,因为media
是存储我们计划执行操作的文件的位置,其中一些文件可能非常大。如果您在不断重新构建映像时,将Dockerfile
直接放在media-tools
中会减慢映像的构建速度 - 可能会更改安装的版本。创建
/media-tools/docker/Dockerfile
,并添加以下构建说明:FROM google/shaka-packager:release-v2.4.3 as packager FROM jrottenberg/ffmpeg:4.3.2-alpine38 COPY --from=packager /usr/bin /usr/bin ENTRYPOINT ["sh"]
构建映像:
docker build -t media-tools ./docker
将映像作为交互式 shell 运行。在 Linux 上:
docker run -w /media -v ${PWD}/media:/media -it --rm media-tools /media #
在 Windows 上:
docker run -w /media -v %cd%/media:/media -it --rm media-tools /media #
运行映像时,您可以检查 FFmpeg 和 Shaka Packager 的版本,通过运行 ffmpeg -version
和 packager --version
来验证是否一切顺利。输出应如下所示:
/media # ffmpeg -version
ffmpeg version 4.3.2 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 6.4.0 (Alpine 6.4.0)
configuration: --disable-debug --disable-doc --disable-ffplay --enable-shared --enable-avresample --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-gpl --enable-libass --enable-fontconfig --enable-libfreetype --enable-libvidstab --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libxcb --enable-libx265 --enable-libxvid --enable-libx264 --enable-nonfree --enable-openssl --enable-libfdk_aac --enable-postproc --enable-small --enable-version3 --enable-libbluray --enable-libzmq --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-libopenjpeg --enable-libkvazaar --enable-libaom --extra-libs=-lpthread --enable-libsrt --enable-libaribb24 --extra-cflags=-I/opt/ffmpeg/include --extra-ldflags=-L/opt/ffmpeg/lib
libavutil 56. 51.100 / 56. 51.100
libavcodec 58. 91.100 / 58. 91.100
libavformat 58. 45.100 / 58. 45.100
libavdevice 58. 10.100 / 58. 10.100
libavfilter 7. 85.100 / 7. 85.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 7.100 / 5. 7.100
libswresample 3. 7.100 / 3. 7.100
libpostproc 55. 7.100 / 55. 7.100
/media # packager --version
packager version v2.4.3-dd9870075f-release
现在,您已尝试过使用 Shaka Packager 和 FFmpeg,您可以继续学习基本概念,继续学习媒体流式传输基础知识。