简介

随着客户的增加,mp4文件播放的弊端也日益凸显,主要集中在两个方面

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

为了解决上述问题,公司打算使用m3u8格式来替代mp4格式。

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

mp4转码m3u8

如果视频不为mp4格式,需先将视频转码为mp4,可使用如下命令进行转换

ffmpeg -i 本地视频地址 -y -c:v libx264 -strict -2 转换视频.mp4
  • 1

将mp4格式转换为ts格式

ffmpeg -y -i 本地视频.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 转换视频.ts
  • 1

将ts文件进行切片

ffmpeg -i 本地视频.ts -c copy -map 0 -f segment -segment_list 视频索引.m3u8 -segment_time 5 前缀-%03d.ts
  • 1

其中segment 就是切片,-segment_time表示隔几秒进行切一个文件,上面命令是隔5s,你也可以调整成更大的参数。

转换好的文件

跨域问题

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

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

限制指定网站访问,可以参考百度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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

播放

这里推荐使用第三方h5播放器ckplayer,集成完成后看下视频请求

可以看到视频先加载的m3u8格式的索引文件,然后开始加载视频,跟据所以文件依次加载abc000.tsabc001.tsabc002.ts,这时候拖动视频,视频开始加载abc011.tsabc012.tsabc013.ts跳过了4~10的文件,这就是m3u8的好处,按需加载

使用ffmpeg转码m3u8并播放及跨域问题相关推荐

  1. 使用ffmpeg转码m3u8并播放

    简介 随着客户的增加,mp4文件播放的弊端也日益凸显,主要集中在两个方面 当视频时长比较长的时候,mp4的关键帧元素往往很大,需要加载很长时间才能开始播放,网速不好的情况缓冲加载就要20多秒的时间,客 ...

  2. m3u8下载时出现跨域的解决方法

    m3u8下载时出现跨域复制下面的代码 当无法下载,资源发生跨域限制时,在视频源页面打开控制台,注入代码解决,点击复制下面代码 // 注入htmllet $section = document.crea ...

  3. Nginx+ffmpeg实现Hls(m3u8)推流播放,不使用flash

    文章目录 相关环境: 一.Nginx部署: 二.ffmepg部署 三.配置ffmpeg转发 四.写前端访问代码查看: 五.报错相关: 1.如果到启动时缺少了ffmpeg模块 六.写在最后: 任务需求: ...

  4. nginx HLS m3u8播放视频跨域问题

    采用HLS+m3u8方式播放视频,在播放的时候会报跨域问题.例如:https://www.***.com/crossdomain.xml找不到. 方法1:在跨域的网站根目录放crossdomain.x ...

  5. 阿里云m3u8播放,跨域问题

    去 阿里视频服务器配置一下 关于跨域访问配置说明 https://help.aliyun.com/document_detail/62950.html 常见问题:https://www.alibaba ...

  6. js使用iframe引入youtube视频到页面中播放,解决跨域播放

    首先肯定要能翻墙了,才能播放youtube视频 直接上代码 这里的主要原理是使用的embed-container,这是一个html的 class 实际标签是这样的,iframe中引入的youtube视 ...

  7. spring MVC cors跨域实现源码解析

    spring MVC cors跨域实现源码解析 名词解释:跨域资源共享(Cross-Origin Resource Sharing) 简单说就是只要协议.IP.http方法任意一个不同就是跨域. sp ...

  8. 银联生成的二维码出现跨域

    银联返回的二维码 官方demo是使用 code_img_url 这个展示二维码, 这样会出现跨域 我们改成使用 code_url 参数自己生成二维码 npm install qr-image var ...

  9. Spring boot视频播放(解决MP4大文件无法播放),整合ffmpeg,用m3u8切片播放。

    一.首先说一下,不超过500M的视频如何提供给前端,这种方式比较快速,但是对前端不友好,特别大的视频文件,浏览器无法播放. 下面是Java代码实例. 这种方式不需要引入依赖.首先进行配置 import ...

最新文章

  1. python中break和continue的区别
  2. 不同数据类型的处理函数(一)
  3. pandas使用query函数基于dataframe字符串数据列中字符串的长度筛选dataframe的数据行(specific column string length)
  4. qt 启动画面显示图片_用QT实现软件启动画面的效果,学习参考!
  5. Jira 随便总结
  6. c语言see函数,vprintf() - C语言库函数
  7. js触发asp.net的Button的Onclick事件
  8. 《统一沟通-微软-实战》-6-部署-7-部署移动功能-1
  9. Redis项目应用场景与实例汇总
  10. 图解通信原理与案例分析-1:开篇-通信系统大全与快速概览
  11. 【jQWidgets】API 笔记
  12. Microsoft.Office.Interop.Excel.dll下载
  13. Linux物理内存较少导致OOM问题分析
  14. 红米android10参数,红米note9详细参数表_红米note9参数配置详情
  15. 2021美团杯CTF ez-sql
  16. 联想笔记本电脑w530更换电池的电芯并进行软件重置,不再提示更换电池
  17. LC滤波器设计学习笔记(一)滤波电路入门
  18. STC51单片机数码管显示程序和仿真
  19. 思维导图SimpleMind mac版
  20. 用Python批量修改hex文件的内容

热门文章

  1. Promise--promise 的状态改变 promise 的基本流程
  2. 苹果A15仿生芯片集成150亿个晶体管,较A14增加近30%
  3. Flutter 状态管理之Bloc上
  4. 玩cf出现outofmemory_玩CF自动掉线出现out of memory怎么处理?
  5. 为什么我的CNN石乐志?我只是平移了一下图像而已
  6. NEO4J不存在某个关系的查询方式
  7. CatDriver 小米 猫盘 Boot Info
  8. inherit.js
  9. Oracle项目管理主数据之RBS与ROBS
  10. 羽毛球规则之羽毛球场地尺寸(球场、网柱、球网)