使用FFmpeg生成HLS视频

本文详细介绍了使用FFmpeg对HLS视频进行编码的过程,包括不同网络条件下的视频编码参数设置,如移动网络264Kbps和WiFi1294Kbps等。同时对比了不同硬件环境下编码效率和磁盘占用情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

准备

     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:103:3753.8
264K(fps: 12, video)37:5213:40241.5
464K(fps: 15, video)18:2715:33422.4
664K(fps: 23, 640x360 video)30:3722:43607.2
1296K(fps: 23,  640x360 video)35:5227:201178.4
1780K(fps: 23, 960x540 video)53:4438:34727.5
1780K(fps: 23, 1280x720 video)1:31:181:00:581138.2
 
      a. 编码过程中,CPU性能对其影响较大,硬件B比硬件A多了2个CPU,并且是至强服务器类型(由于使用云并不能保证独占该CPU) 
      b. 随着编码要求提高,编码时间和磁盘占用正比增长(1780K 960x540除外)
      c. 出现1780k编码磁盘占用小于1296k编码情况,个人认为这是由于I帧和TS分割时填充内容造成的(具体原因,在此不做深入研究,留作以后探讨)
 
 
参考

转载于:https://www.cnblogs.com/kuoxin/p/4623642.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值