使用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分割时填充内容造成的(具体原因,在此不做深入研究,留作以后探讨)
 
 
参考
posted @ 2015-07-06 10:17  kuoxinxin  阅读(7582)  评论(0编辑  收藏  举报