在本文中,我们将学习一些常见的命令,用于转换和操控媒体文件的特定特性。虽然我们尝试为所有过程显示等效操作,但并非所有操作都能在这两个应用中执行。
在许多情况下,我们展示的命令可以组合到单个命令行操作中,在实际使用时也是如此。例如,您可以同时在文件转换操作中设置输出文件的码率。在本文中,为方便起见,我们通常将这些操作显示为单独的命令。
转换是通过以下应用完成的:
显示屏特征
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
解复用 (separate) 音频和视频串流
Shaka Packager 在转换文件时需要解复 mux。使用媒体框架也需要满足此要求。
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),是一种自适应码率流式传输技术,也是基于 Web 标准的视频点播呈现方法。第二种是 HTTP Live Streaming (HLS),这是 Apple 的标准,适用于网络直播和视频点播。
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"
现在,我们希望已经很好地掌握了如何转换文件,接下来,我们可以在此基础上,学习媒体加密。