使用 MPEG-DASH 技术让视频画质自动适应网速

本文介绍了如何使用 MPEG-DASH 技术封装视频,实现在网页上根据网络状况自动切换视频清晰度。内容包括环境准备、视频压制、分片生成、manifest 文件修改以及使用 shaka 播放器避免 dash.js 的潜在问题。
摘要由CSDN通过智能技术生成

MPEG-DASH(基于HTTP的动态自适应流,Dynamic Adaptive Streaming over HTTP)技术可以使播放器在播放过程中根据网速实时调节视频清晰度,起到降低缓冲时间、提升画质的效果。有关 DASH 的详细介绍请看维基百科

本文主要介绍将视频封装为 DASH 格式,并在网页上播放的方法。

1. 环境准备

要运行下文的大部分命令,您必须安装好 ffmpeg 和 x264,并且配置环境变量(Windows)等内容。或者,您也可以下载或编译出 ffmpeg 和 x264 的二进制文件,然后将下文命令中的 ffmpegx264 替换成完整路径。

为什么使用 ffmpeg,而不是 MP4Box?

在我的测试中,MP4Box 对帧率不同的视频支持状况不佳,会导致播放速度出错。

安装步骤

下面将介绍在 Ubuntu 18.04 中安装 ffmpeg 和 x264 的过程。本文编写时使用 ffmpeg 4.1.4 版本。x264 压制参数变化不大,但出现问题时建议尝试更新版本。同时,你也可以通过其他方式安装 ffmpeg 和 x264。

本文直接使用别人编译好的二进制。本文不对这些二进制文件的安全性负责。

(1) 添加软件源

运行命令

sudo add-apt-repository ppa:jonathonf/ffmpeg-4
sudo apt-get update

按提示操作。

(2) 安装软件
sudo apt install -y ffmpeg x264

2. 压制/准备视频

要实现画质切换,您需要将视频压制成不同清晰度。如果您喜欢,可以将音频也压制成不同的规格和码率。

注意点:按照本文的步骤,没有必要严格对齐 GOP。因为本文中会对不同清晰度的视频采用不同的帧率。

下面是压制命令。这条命令使用 ffmpeg 解码并改变视频帧率,然后通过管道将未压缩视频传给 x264 进行编码。

ffmpeg -i ${input} -an -r 60000/1001 -f yuv4mpegpipe -pix_fmt yuv420p - | x264 --crf ${crf} --demuxer y4m --preset veryslow -I ${i_frame} -r 4 -b 3 --me umh -i 1 --scenecut 60 -f 1:1 --qcomp 0.5 --psy-rd 0.3:0 --aq-mode 2 --aq-strength 0.8 --vf resize:3840,2160,,,, -o "${output_prefix}-2160p60.mp4" -

在上面的命令中:

  • ${input} 表示源文件名
  • -r 60000/1001 表示将视频帧率变为每秒 60000/1000 帧(约为 60,但是兼容性好于整数 60)
  • ${crf} 表示使用的 crf 值,您可以使用 22 左右的数值
  • ${i_frame} 表示最大关键帧间隔,单位是帧,不可过大,建议使用每秒帧率*2(舍入至最接近的整数即可)
  • --vf resize:3840,2160,,,, 会将输出视频缩放至指定的分辨率
  • -o "${output_prefix}-2160p60.mp4" 表示输出文件。

您也可以改用任何您喜欢的方式进行编码,但是需要注意兼容性。同时,也不要使关键帧间隔过大。

修改上面命令中的参数,压制出不同清晰度和帧率的视频。

3. 使用 ffmpeg 生成分片

假定压制了 5 个不同清晰度的视频,分别是

fate.2160p60.mp4
fate.1080p60.mp4
fate.720p60.mp4
fate.450p.mp4
fate.360p.mp4

同时,提取源文件中的音频(假定为 aac 编码。如果不是 aac 编码,您需要自行转换)

ffmpeg -i ${input} -vn -c copy fate.a.m4a

该命令会输出名为 fate.a.m4a 的音频流。

然后我们就可以使用 ffmpeg 生成分片了。

首先建立 fate 文件夹,用于存放生成的分片。文件夹的名称无要求,但是您需要修改后面的命令来确保将文件输出到您建立的文件夹中。

然后执行以下命令:

ffmpeg \
-i fate.2160p60.mp4 \
-i fate.1080p60.mp4 \
-i fate.720p60.mp4 \
-i fate.450p.mp4 \
-i fate.360p.mp4 \
-i fate.a.m4a \
-c copy \
-map 0 -map 1 -map 2 -map 3 -map 4 -map 5 \
-f dash \
-adaptation_sets "id=0,streams=v id=1,streams=a" \
fate/manifest.mpd

接下来 ffmpeg 会输出大量信息。完成后,我们可以在 fate 文件夹中发现分好的分片。

4. 分析并修改 manifest 文件,减少载入时间

打开 fate/manifest.mpd 文件(或者你指定的其他路径)。可以看到文件开头如下。

<?xml version="1.0" encoding="utf-8"?>
<MPD xmlns:xsi=
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值