mp4文件播放的弊端日益凸显,主要集中在两个方面:
  1、当视频时长比较长的时候,mp4的关键帧元素往往很大,需要加载很长时间才能开始播放,网速不好的情况缓冲加载就要20多秒的时间,客户早已急不可耐。
  2、当用户打开一个视频播放的时候,浏览器会持续请求下载mp4文件直到下载完成,就算是用户暂停视频播放浏览器也会持续这种下载状态,如果这个视频文件是500M则会请求服务器下载500M文件,是1G则会不停下载1G,给服务器硬盘和宽带造成很大浪费和压力。

  m3u8是苹果公司开发的一种新型播放格式,这种播放格式支持目前市面的windows、androis、ios设备主流的浏览器,同样的视频文件既可以在flash环境播放,又能在无flash的html5环境播放,它的优势还不止于此,它可以实现多种码率在不同网速下的自动切换,网速好自动切换高清晰度视频,网速慢自动播放低清晰度文件,还可以实现流加密(视频文件本身加密)、分段下载播放、任意时间点拖拽播放、随机视频文件广告插入等等优势。

  废话不多说,直接DIY。
  首先下载ffmpeg,直达网址:http://www.ffmpeg.org/download.html,选择不同操作系统对应的版本下载安装,此处略过!
  如果转换视频很多想要偷懒,可以去系统设置环境变量,找到环境变量–系统变量–Path–编辑,直接把对应的ffmpeg的bin目录地址复制上去保存即可,不想那么麻烦的也可以在转换命令中直接使用绝对地址。

  运行CMD进入命令行模式,cd到ffmpeg的bin目录,然后运行下面的命令,
  使用用命令:
  ffmpeg ffprobe查看视频文件编码并输出JSON格式
  ffprobe D:\video\video.mp4 -show_streams -select_streams v -print_format json
  如果得到音视频编码为h264/aac则执行

  如果视频不为mp4格式,需先将视频转码为mp4,可使用如下命令进行转换
  ffmpeg -i 本地视频地址 -y -c:v libx264 -strict -2 转换视频.mp4

  将mp4格式转换为ts格式
  ffmpeg -y -i 本地视频.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 转换视频.ts

  直接将MP4转换为ts切片并保存m3u8列表
  ffmpeg -i D:\video\video.mp4 -f segment -segment_time 1 -segment_format mpegts -segment_list D:\video\vv.m3u8 -c copy -bsf:v h264_mp4toannexb -map 0 D:\video\vv-%04d.ts
  segment_time为切片时间,单位为秒。

  ffmpeg -i D:\video\video.mp4 -force_key_frames “expr:gte(t,n_forced*1)” -strict -2 -c:a aac -c:v libx264 -hls_time 1 -hls_list_size 0 -f hls D:\video\vv.m3u8
  参数-force_key_frames “expr:gte(t,n_forced*1)”强制每1秒一个关键帧,参数-strict -2是为了使用aac音频编码。
  
  前端播放推荐使用hls.js,https://github.com/video-dev/hls.js

跨域问题
  在跨域的网站根目录放crossdomain.xml文件,下面是允许所有的网站(一般不采取这样的方式,只是方便调试)均可以跨越访问资源配置如下:     

<?xml version="1.0" encoding="utf-8"?>
<cross-domain-policy> 
    <allow-access-from domain="*"/>  
</cross-domain-policy>

  限制指定网站访问,可以参考百度https://www.baidu.com/crossdomain.xml配置              

<cross-domain-policy>
     <allow-access-from domain="*.baidu.com"/>
    <allow-access-from domain="*.bdstatic.com"/>
    <allow-http-request-headers-from domain="*.baidu.com" headers="*"/>
    <allow-http-request-headers-from domain="*.bdstatic.com" headers="*"/>
</cross-domain-policy>

  如果文件存储在第三方平台上,比如阿里云OSS,就把crossdomain.xml放在bucket根目录下