媒体转化

德里克·赫尔曼
Derek Herman
Joe Medley
Joe Medley

在本文中,我们将了解一些用于转换和操控媒体文件特定特性的常用命令。虽然我们已尝试为所有过程显示等效的操作,但并非所有操作都可以在这两个应用中实现。

在许多情况下,我们展示的命令可能会合并到单个命令行操作中,这样就会实际使用。例如,没有什么可以阻止您在文件转换的同一操作中设置输出文件的比特率。在本文中,为清楚起见,我们通常将这些操作显示为单独的命令。

转换通过以下应用完成:

显示屏特征

Shaka Packager 和 FFmpeg 都可用于检查媒体文件的内容,然后显示流的特性。但是,两者都为同一媒体提供了不同的输出。

使用 Shaka Packager 的特性

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

使用 FFmpeg 的特性

ffmpeg -i glocken.mp4

输出如下所示:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'glocken.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.83.100
  Duration: 00:00:10.03, start: 0.000000, bitrate: 8063 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc), 1920x1080, 7939 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, 127 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
At least one output file must be specified

对音频和视频流进行多路复用(分离)

转换文件时,Shaka Packager 需要解复用。这也是使用媒体框架的必需项。

Shaka Packager 解复用

MP4

packager input=myvideo.mp4,stream=video,output=myvideo_video.mp4
packager input=myvideo.mp4,stream=audio,output=myvideo_audio.m4a

或者:

packager \
  input=myvideo.mp4,stream=video,output=myvideo_video.mp4 \
  input=myvideo.mp4,stream=audio,output=myvideo_audio.m4a

WebM

packager \
  input=myvideo.webm,stream=video,output=myvideo_video.webm \
  input=myvideo.webm,stream=audio,output=myvideo_audio.webm

FFmpeg 多路复用

MP4

ffmpeg -i myvideo.mp4 -vcodec copy -an myvideo_video.mp4
ffmpeg -i myvideo.mp4 -acodec copy -vn myvideo_audio.m4a

WebM

ffmpeg -i myvideo.webm -vcodec copy -an myvideo_video.webm
ffmpeg -i myvideo.webm -acodec copy -vn myvideo_audio.webm

混用(组合)音频和视频流

在某些情况下,您需要将音频和视频重新组合到单个容器中。尤其是在不使用媒体框架的情况下。这是 FFmpeg 可以很好地处理的功能,而 Shaka Packager 目前不支持此功能。

ffmpeg -i myvideo_video.webm -i myvideo_audio.webm -c copy myvideo.webm

更改特性

比特率

对于 FFmpeg,我们可以在转换为 .mp4.webm 时执行此操作。

ffmpeg -i myvideo.mov -b:v 350K myvideo.mp4
ffmpeg -i myvideo.mov -vf setsar=1:1 -b:v 350K myvideo.webm

尺寸(分辨率)

ffmpeg -i myvideo.webm -s 1920x1080 myvideo_1920x1080.webm

文件类型

Shaka Packager 无法处理 .mov 文件,因此无法用于转换该格式的文件。

.mov.mp4

ffmpeg -i myvideo.mov myvideo.mp4

.mov.webm

ffmpeg -i myvideo.mov myvideo.webm

同步音频和视频

为确保音频和视频在播放过程中保持同步,请插入关键帧。

ffmpeg -i myvideo.mp4 -keyint_min 150 -g 150 -f webm -vf setsar=1:1 out.webm

MP4/H.264

ffmpeg -i myvideo.mp4 -c:v libx264 -c:a copy myvideo.mp4

MP4 的音频

ffmpeg -i myvideo.mp4 -c:v copy -c:a aac myvideo.mp4

WebM/VP9

ffmpeg -i myvideo.webm -v:c libvpx-vp9 -v:a copy myvideo.webm

WebM 的音频

ffmpeg -i myvideo.webm -v:c copy -v:a libvorbis myvideo.webm
ffmpeg -i myvideo.webm -v:c copy -v:a libopus myvideo.webm

视频点播和直播

我们将在本文中介绍两种类型的流式传输协议。第一种是基于 HTTP 的动态自适应流式传输 (DASH),是一种自适应比特率流式传输技术,也是基于网络标准的点播视频呈现方法。第二种是 HTTP Live Streaming (HLS),这是 Apple 针对 Web 的直播和视频点播推出的标准

DASH/MPD

此示例基于音频和视频流生成媒体呈现说明 (MPD) 输出文件。

packager \
  input=myvideo.mp4,stream=audio,output=myvideo_audio.mp4 \
  input=myvideo.mp4,stream=video,output=myvideo_video.mp4 \
  --mpd_output myvideo_vod.mpd

HLS

这些示例会根据音频和视频流生成一个 M3U8 输出文件,该文件是一个 UTF-8 编码的多媒体播放列表。

ffmpeg -i myvideo.mp4 -c:a copy -b:v 8M -c:v copy -f hls \
  -hls_time 10 -hls_list_size 0 myvideo.m3u8

或者:

packager \
  'input=myvideo.mp4,stream=video,segment_template=output$Number$.ts,playlist_name=video_playlist.m3u8' \
  'input=myvideo.mp4,stream=audio,segment_template=output_audio$Number$.ts,playlist_name=audio_playlist.m3u8,hls_group_id=audio,hls_name=ENGLISH' \
  --hls_master_playlist_output="master_playlist.m3u8"

现在我们已经充分掌握了如何转换文件的方法,接下来,我们可以基于我们在本文中学到的知识,继续了解媒体加密