使用FFmpeg生成HLS视频
准备
1. 准备高质量音视频源文件。
2. 编译安装必要的软件
a. ffmpeg
b. nginx
3. 测试环境配置
修改nginx中的nginx.conf配置文件,当前以阿里云预装的CentOS为例:
修改命令:
vim /etc/nginx/conf.d/default.conf
直接编辑该文件,加入如下配置:
#音频路径
location /audios{
alias /share/www/audios;
}
#视频路径
location /videos{
alias /share/www/videos;
}
修改MIME 类型命令:
vim /etc/nginx/mime.types
加入如下内容(主要是为了测试方便,这样就可以在浏览器中直接使用):
application/x-mpegURL m3u8;
video/MP2T ts;
4. 生成HLS视频硬件配置
硬件A:
Mac Mini CPU: 2.3GHz i5;
内存:8G 1333MHz DDR3;
OS: OSX 10.10.3
硬件B:
阿里云服务器 CPU: 4 core Xeon(R) CPU E5-2630 0 @ 2.30GHz
内存:4G
OS: CentOS 6.4
5. 视频文件资源
格式:H.264 1280 x 720 AAC, 48Khz 立体声(L R)
FPS:23.98
数据大小:1.5GB
数据码流:1780kbit/s
视频码流:1648kbit/s
音频码流:128kbit/s
横纵比: 16:9
6. 确定码流标准
参见《如何选择HLS视频码流》
7. 分片工具
分片会产生一定数量的填充数据,并不是所有的数据都是视频流内容。填充百分比:5% - 45%之间。(主要看分片程序的优化),本文所做视频是为了完成HLS应用DEMO开发所准备,因此不考虑分段程序等相关优化问题,目前选择使用FFmpeg来处理视频分段并产生播放列表。大家也可以使用苹果公司提供的相关HLS工具(这个工具的针对视频分片进行了优化)
命令行参数配置
1. 64Kbps音频编码
根据苹果有关HLS音频规定,不能使用音频流峰值超过64kbps的流,因此目前使用音频流为56kbps
命令如下:
ffmpeg -i The.Interview.2014.BluRay.720p.x264.AAC-PHD.mp4 -vn \
-b:a 56000 \
-hls_time 10 \
-hls_list_size 0 \
-hls_allow_cache 1 \
-hls_base_url http://127.0.0.1:8080/audios/ \
-hls_segment_filename /Users/kuoxin/Movies/56K/'TI2014_56k_%05d.ts' \
/Users/kuoxin/Movies/56K/56k_aac.m3u8
2. 移动网络264Kbps视频编码
帧率: 12
尺寸: 416 x 234
码流: 264Kbps
视频: 200Kbps
音频: 56Kbps
音频采样: 48KHz
MP4 描述: baseling3.0
时长: 10s
命令如下:
$ ffmpeg -i The.Interview.2014.BluRay.720p.x264.AAC-PHD.mp4 \
-c:v libx264 \
-r 12 \
-s 416X234 \
-b:v 200k \
-profile:v baseline \
-b:a 56k \
-hls_time 10 \
-hls_list_size 0 \
-hls_allow_cache 1 \
-hls_base_url http://127.0.0.1:8080/videos/264k/ \
-hls_segment_filename /Users/kuoxin/Movies/264k/'TI2014_264k_%05d.ts’ \
/Users/kuoxin/Movies/264K/264k_mp4.m3u8
3. 移动网络464Kbps视频编码
帧率: 15
尺寸: 480 x 270
码流: 464Kbps
视频: 400Kbps
音频: 56Kbps
音频采样: 48KHz
MP4 描述: baseline
时长: 10s
$ ffmpeg -i The.Interview.2014.BluRay.720p.x264.AAC-PHD.mp4 \
-c:v libx264 \
-r 15 \
-s 480X270 \
-b:v 400k \
-profile:v baseline \
-b:a 56k \
-hls_time 10 \
-hls_list_size 0 \
-hls_allow_cache 1 \
-hls_base_url http://127.0.0.1:8080/videos/464k/ \
-hls_segment_filename /Users/kuoxin/Movies/464k/'TI2014_464k_%05d.ts’ \
/Users/kuoxin/Movies/464K/464k_mp4.m3u8
4. WiFi/CELL 664Kbps视频编码
帧率: 视频当前帧数
尺寸: 640 x 360
码流: 664Kbps
视频: 600Kbps
音频: 56Kbps
音频采样: 48KHz
MP4 描述: baseline
时长: 10s
$ ffmpeg -i The.Interview.2014.BluRay.720p.x264.AAC-PHD.mp4 \
-c:v libx264 \
-s 640X360 \
-b:v 400k \
-profile:v baseline \
-b:a 56k \
-hls_time 10 \
-hls_list_size 0 \
-hls_allow_cache 1 \
-hls_base_url http://127.0.0.1:8080/videos/664k/ \
-hls_segment_filename /Users/kuoxin/Movies/664k/'TI2014_464k_%05d.ts’ \
/Users/kuoxin/Movies/664K/664k_mp4.m3u8
4. WiFi 1294Kbps视频编码
帧率: 视频当前帧数
尺寸: 640 x 360
码流: 1296Kbps
视频: 1200Kbps
音频: 96Kbps
音频采样: 48KHz
MP4 描述: baseline
时长: 10s
$ ffmpeg -i The.Interview.2014.BluRay.720p.x264.AAC-PHD.mp4 \
-c:v libx264 \
-s 640X360 \
-b:v 1200k \
-profile:v baseline \
-b:a 96k \
-hls_time 10 \
-hls_list_size 0 \
-hls_allow_cache 1 \
-hls_base_url http://127.0.0.1:8080/videos/1296k/ \
-hls_segment_filename /Users/kuoxin/Movies/1296k/'TI2014_1296k_%05d.ts’ \
/Users/kuoxin/Movies/1296K/1296k_mp4.m3u8
5. WiFi 3596Kbps视频编码
帧率: 视频当前帧数
尺寸: 960 x 540
码流: 3596Kbps (当前最高码流只有:1780Kbps)
视频: 3500Kbps(当前最高码流只有:1648Kbps)
音频: 96Kbps
音频采样: 48KHz
MP4 描述: main
时长: 10s
$ ffmpeg -i The.Interview.2014.BluRay.720p.x264.AAC-PHD.mp4 \
-c:v libx264 \
-s 960X540 \
-b:a 128k \
-hls_time 10 \
-hls_list_size 0 \
-hls_allow_cache 1 \
-hls_base_url http://127.0.0.1:8080/videos/3596k/ \
-hls_segment_filename /Users/kuoxin/Movies/3596k/'TI2014_3596k_%05d.ts’ \
/Users/kuoxin/Movies/3596K/3596k_mp4.m3u8
6. WiFi 5128Kbps视频编码
帧率: 视频当前帧数
尺寸: 1280 x 720
码流: 5128k (当前最高码流只有:1780Kbps)
视频: 5000Kbps(当前最高码流只有:1648Kbps)
音频: 128Kbps
音频采样: 48KHz
MP4 描述: main
时长: 10s
$ ffmpeg -i The.Interview.2014.BluRay.720p.x264.AAC-PHD.mp4 \
-c:v libx264 \
-b:a 128k \
-hls_time 10 \
-hls_list_size 0 \
-hls_allow_cache 1 \
-hls_base_url http://127.0.0.1:8080/videos/5128k/ \
-hls_segment_filename /Users/fengkun/Movies/kuoxin/'TI2014_5128k_%05d.ts’ \
/Users/kuoxin/Movies/5128K/5128k_mp4.m3u8
总结
1. TS的时间长短很难保持10左右,会出现较大波动。(+-30%)
2. 出现码流波动较大。(存在大于规定值300%状况,根据HLS苹果推荐是10%)
3. 对于mpeg-ts中得关键帧没有很好的保证在推荐范围内
4. 总帧数是关键帧数三倍没有保证
5. 时间同步可能存在问题,我针对视频片段进行比较,发现如下问题:
随机某段MPEG-TS 时长,当前为第48段 | |
64K (audio) | 10.005333 |
264K(fps: 12, video) | 8.500000 |
464K(fps: 15, video) | 6.000000 |
664K(fps: 23, 640x360 video) | 6.172833 |
1296K(fps: 23, 640x360 video) | 6.172833 |
1780K(fps: 23, 960x540 video) | 6.172833 |
1780K(fps: 23, 1280x720 video) | 6.172833 |
个人认为这是由于帧频不同引起的,当实现视频的切换时,需要考虑到片段时长不一致问题
6. 有关FFmpeg编码效率,时间格式为:小时:分钟:秒
硬件A | 硬件B | 磁盘占用(MB) | |
64K (audio) | 2:10 | 3:37 | 53.8 |
264K(fps: 12, video) | 37:52 | 13:40 | 241.5 |
464K(fps: 15, video) | 18:27 | 15:33 | 422.4 |
664K(fps: 23, 640x360 video) | 30:37 | 22:43 | 607.2 |
1296K(fps: 23, 640x360 video) | 35:52 | 27:20 | 1178.4 |
1780K(fps: 23, 960x540 video) | 53:44 | 38:34 | 727.5 |
1780K(fps: 23, 1280x720 video) | 1:31:18 | 1:00:58 | 1138.2 |
a. 编码过程中,CPU性能对其影响较大,硬件B比硬件A多了2个CPU,并且是至强服务器类型(由于使用云并不能保证独占该CPU)
b. 随着编码要求提高,编码时间和磁盘占用正比增长(1780K 960x540除外)
c. 出现1780k编码磁盘占用小于1296k编码情况,个人认为这是由于I帧和TS分割时填充内容造成的(具体原因,在此不做深入研究,留作以后探讨)
参考