zoukankan      html  css  js  c++  java
  • 使用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分割时填充内容造成的(具体原因,在此不做深入研究,留作以后探讨)
     
     
    参考
  • 相关阅读:
    Java实现 LeetCode 807 保持城市天际线 (暴力)
    ASP.NET关于书籍详情和删除的Demo(HttpHandler进行页面静态化[自动生成html网页]+Entity Framework通过类创建数据库+EF删查)
    ASP.NET关于书籍详情和删除的Demo(HttpHandler进行页面静态化[自动生成html网页]+Entity Framework通过类创建数据库+EF删查)...
    ASP.NET关于书籍详情和删除的Demo(HttpHandler进行页面静态化[自动生成html网页]+Entity Framework通过类创建数据库+EF删查)...
    Java实现 LeetCode 806 写字符串需要的行数 (暴力模拟)
    Java实现 LeetCode 806 写字符串需要的行数 (暴力模拟)
    Java实现 LeetCode 806 写字符串需要的行数 (暴力模拟)
    Java实现 LeetCode 805 数组的均值分割 (DFS+分析题)
    .net web api返回结果为json
    httpclient与webapi
  • 原文地址:https://www.cnblogs.com/kuoxin/p/4623642.html
Copyright © 2011-2022 走看看