媒体应用基础知识

Derek Herman
Derek Herman
Joe Medley
Joe Medley

处理媒体内容通常需要更改媒体文件的特性,例如比特率或分辨率。找到简单易用的入门方式可能很难。在本页中,您将了解所用工具以及如何快速安装这些工具。

首先,我们将介绍两个常见命令行媒体实用程序(Shaka PackagerFFmpeg)的基本用法,然后帮助您快速安装这些工具。为什么要介绍两种应用?虽然这两种工具本身都非常强大且实用,但都无法提供为 Web 准备媒体所需的全部功能。我们还创建了媒体转换媒体加密页面,其中介绍了与这两款应用相关的更多常见操作。

这些应用并不是执行文件操作任务的唯一选项,但它们是两种最常用且功能最强大的应用。其他选项包括 GUI 应用 MiroHandBrakeVLC。您还可以使用 ZencoderAmazon Elastic EncoderGoogle Transcoder API 等编码/转码服务。

Shaka Packager 是一个免费的媒体打包 SDK。如果您在网站上使用媒体播放器,则可以使用 Shaka Packager 来准备文件。它支持对两种最常见的视频流式传输协议进行转换:基于 HTTP 的动态自适应流式传输 (DASH) 或 HTTP Live Streaming (HLS)。Shaka Packager 支持关键安全功能:通用加密和 Widevine 数字版权管理 (DRM)。它还可以处理直播和视频点播。

尽管软件包上注明了此实用程序仅适用于 C++ 开发者,但实际上它也适用于其他开发者。您既可以将其用作构建媒体软件的库,也可以将其用作准备媒体文件以在 Web 上播放的命令行实用程序。在本例中,我们需要使用后一种功能。事实上,对于 Web 媒体创作者来说,Shaka Packager 是唯一一种无需花费高昂的商业应用费用即可执行某些任务的方式。

以下是 Shaka Packager 命令的基本模式:

packager stream_descriptor [stream_descriptor-2 [stream_descriptor-n]] [flags]

输入 packager -help 时,您看到的结果并非如此。此示例更易于推理,这反映了 Shaka 打包工具文档中的示例。请注意,该模式中包含多个 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

查找媒体文件基础知识中所述的特征,并注意以下几点。全高清的高度和宽度正确无误,音频和视频编解码器是其容器类型的首选编解码器,音频为 AAC,视频为 H264。另请注意,系统会使用数字来标识数据流。这些方法对于分别处理音频和视频的操作非常有用。

请注意,上述输出不显示比特率。尽管缺少一些信息,但此输出更易于阅读,因此我们会尽可能使用它。当我们需要 Shaka Packager 无法获取的信息(例如比特率)时,就会使用 FFmpeg。

FFmpeg

FFmpeg 也是一款用于录制、转换和流式传输媒体文件的免费应用。其功能不比 Shaka Packager 的功能好也不比 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,因为这样可以节省大量时间。此外,我们还提供了相关说明,帮助您快速完成设置。

  1. 首先,在计算机上的某个位置创建一个名为 media-tools 的新目录;您可以使用任何名称,但请注意,以下说明假定您使用 media-tools 作为目录名称。

  2. media-tools 中创建 dockermedia 目录。这样,您的 media 目录就不会出现在构建上下文中。这一点非常重要,因为我们计划对 media 中存储的文件执行操作,其中一些文件可能非常大。如果您日后重新构建映像(可能是为了更改已安装的版本),直接将 Dockerfile 放入 media-tools 会减慢映像构建速度。

  3. 创建 /media-tools/docker/Dockerfile,并添加以下 build 说明:

    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"]
    
  4. 构建映像:

    docker build -t media-tools ./docker
    
  5. 将映像作为交互式 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 -versionpackager --version 来检查 FFmpeg 和 Shaka Packager 的版本,以验证所有操作是否成功。输出应如下所示:

/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,接下来可以继续学习基本概念,下一个主题是媒体流式传输基础知识