1 四个在线视频播放方案

第一个是RTSP(Real Time Streaming Protocol)实时流传输协议,是基于文本的多媒体播放控制协议,属于应用层。这里可能还会提到RTMP,这个其实就是Adobe私有的协议,一般走flv或者f4v格式流。它与RTSP是一路的,只不过RTSP是公开的,而且RTMP很老旧了,受支持也越来越少。RTSP传输的一般是TS或者MP4流,需要有支持该协议的客户端,当然也需要搭建一个RTSP协议服务器来提供播放服务。其缺省端口是554,简单的测试URL如:

rtsp://192.168.1.67:554/test

该方式播放流媒体视频我没有试过,需要单独搞一个RTSP协议的服务器也觉得麻烦,更主要的是其使用不够广泛。

第二个是HLS(HTTP Live Streaming)协议,由苹果公司开发的流媒体传输协议。这个以前研究过一些,知道流程。其原理是将一个大文件分成多个小文件,得到的m3u8配置文件就是各个小文件的信息表,客户端基于HTTP协议下载这些小文件。这个协议是支持动态码率的,客户端可以选择不同码率的同一段资源进行下载。这个以前用的时候并没有试过动态码率,只是用ffmpeg简单转换mp4文件得到一堆ts文件和一个m3u8播放列表。HLS协议规定视频封装格式是TS,编码格式是H264或者H265。相比与RTSP实时性不够,而且产生较多文件碎片,切片多个进行小文件分发也不够友好。另外HLS标准(或者苹果自有的HDS与微软的Smooth Streaming)已经是走下坡路了,如这篇文章介绍:

https://www.dacast.com/blog/mpeg-dash-vs-hls-what-you-should-know/

第三个是HTTP,也就是我正在用的。利用http服务器,直接输入一个mp4文件地址,即可在浏览器中进行播放。MP4是支持最为广泛的,http协议与http服务器应用是最广泛的,无需搭建别的服务器即可在线播放视频流。这里说的HTTP方式也就是HTTP Progressive Streaming,能够支持视频在线播放,拖拽进度等。

第四个是MPEG-DASH(Dynamic Adaptive Streaming over HTTP),新出的流视频播放控制协议,从名字也能看出是基于HTTP协议的。同HLS一样,它支持动态码率,用Youtube的应该知道它用的DASH,可以支持不同网络情况下播放不同清晰度的视频。相比较于HLS,DASH能以更低的码率传输更好的画面。不过该标准目前是大公司如Netflix和Youtube等在推广,支持程度还不是特别广泛。

以上几种方式基本就是当前视频流在线播放的主要方案,利弊也都分析了,下面是AVPro文档中的截图:

可以看出HTTP方式还是非常适合的,当前国内视频平台基本也用HTTP方式提供点播服务。

2 mp4 faststart和moov

下面就是第二部分了,mp4文件在线流播放时如何工作的呢?可以参考这篇文章:

https://rigor.com/blog/2016/01/optimizing-mp4-video-for-fast-streaming

这篇文章提到,mp4容器格式封装的h264编码的视频成为了在线html5视频的标准,所以优化在线视频流播放就基本说的时mp4文件的优化。首先就是基本概念,mp4文件是由许多数据块组成,存储了章节和音视频信息等。其中有一个moov块是最主要的,记录了该mp4文件的基础信息如每秒多少帧等,该部分的作用类似目录。当播放视频的适合,首先就是要找到moov块,但是不幸的是这些块顺序却可以不一致,比如用mp4info这个小工具看看:

这里说的moov就在第二处,比mdat靠前。如果moov靠后,浏览器播放在线视频的时候一开始请求不到这一块,就会往后面看下一个块,多请求几次。浏览器用HTTP Range Request先请求个几百K字节,这是第一次请求。得到206 Partical Content HTTP代码,可能没有找到moov。接着浏览器找后面几百K字节,找到moov块,从而准备好播放视频元信息。如这个博客截图:

实际上就会浪费几百K字节和几百毫秒,因此也就有了优化的方法,就是将moov提前:

ffmpeg -i input.mp4 -movflags faststart -acodec copy -vcodec copy output.mp4

如下:

根据我实际测试,faststart确实有没有差不多,一两百毫秒变化基本感觉不到,所以说一个一般的mp4文件就可以在线流播放,不用单独处理了。

3 国内视频网站采用方案对比

另外补充一下国内几大视频网站使用的在线视频播放方式,作为以后我的有关视频播放工作的参考对比。

先说优酷,这个也是老牌的视频网站了,参考:

http://www.cnblogs.com/zhaojunjie/p/4009192.html

细节不说,结论是优酷用的时m3u8方式,也是基于HTTP的,片段如下:

#EXTM3U
#EXT-X-TARGETDURATION:12
#EXT-X-VERSION:3
#EXTINF:6.006,
http://59.108.137.14/65666E0ED34581E6B96293A18/0300010F005430BCBA49631468DEFEC61C5678-3A78-37BA-1971-21A0D4EEA0E7.flv?ts_start=0&ts_end=5.906&ts_seg_no=0&ts_keyframe=1
#EXTINF:5.464,
http://59.108.137.14/65666E0ED34581E6B96293A18/0300010F005430BCBA49631468DEFEC61C5678-3A78-37BA-1971-21A0D4EEA0E7.flv?ts_start=5.906&ts_end=11.37&ts_seg_no=1&ts_keyframe=1

视频封装为flv格式,分割为多个片段,组合为m3u8列表,提供在线视频播放功能。实际上我可能对HTTP Progressive Streaming和HLS的区分还不很清晰,HLS中的H就是HTTP,实际上m3u8也是基于HTTP提供视频播放的,不需要单独搭建协议服务器提供后台服务。那么与HTTP Progressive Streaming的区别到底在哪,只是一个切片,一个不切片来通过HTTP播放视频吗?这里再找一些资料加以理解:

先说一下HTTP Progressive Streaming,这个类似于progressive download,不同之处则是Progressive Streaming时把视频缓存再内存中的,而不是永久存储设备中。那还是和HLS很像啊,这就要对比下HTTP Progressive Streaming和HLS了。HTTP Progressive Streaming能够不用完整下载视频就播放,相比于HLS不足之处是质量不能改变也就是就一个片源,而且安全性较差,可以看下这一段英文解释:

实际上就和前面说的差不多,也就是二者很相似,都是基于HTTP进行缓存播放,HLS可以提供多个源切换清晰度,比如优酷就用HLS方式,切片且提供不同质量的多个视频源。

接着是腾讯,这个比优酷来说感觉更新一些,可能也更清晰一些,参考:

https://blog.csdn.net/szu_it_man/article/details/80449751

这个博客给出了腾讯视频的方案,和优酷不同是,腾讯用的就是mp4,也就是直接HTTP Progressive Streaming一个mp4文件。当然腾讯能切换不同清晰度,因为其提供了多个不同质量的mp4文件。分析结果片段如下:

下面是爱奇艺的了,参考:

https://blog.csdn.net/qq405935987/article/details/83789697

爱奇艺用的是f4v格式的视频,基于https,而且也出现了m3u8的有关内容,如果划分到上面四种,是属于HLS的。分析片段如下:

所以国内这三个大型的视频网站没有用RTSP来提供在线视频播放服务,其中主要是用m3u8分片提供不同清晰度视频,而腾讯则跳出了m3u8,用起了mp4。

所以说,用mp4来提供在线视频播放没有问题,而且对于没有清晰度切换需求的业务,比m3u8也要更加轻便。

f4v既然遇到了,也记录下,百度百科有一些介绍:

F4V是Adobe公司为了迎接高清时代而推出继FLV格式后的支持H.264的F4V流媒体格式。它和FLV主要的区别在于,FLV格式采用的是H263编码,而F4V则支持H.264编码的高清晰视频,码率最高可达50Mbps。

现在主流的视频网站(如奇艺、土豆、酷6、优酷)等其他网站都开始用H264编码的F4V文件,H264编码的F4V文件,相同文件大小情况下,清晰度明显比On2 VP6和H263编码的FLV要好。土豆和56发布的视频大多数已为F4V,但下载后缀为FLV,这也是F4V特点之一。需要注意的是,F4V 和MP4 是兼容的格式,都属于ISMAMP4 容器,但是 F4V 只用来封装H.264视频编码和音频AAC。FLV 是Adobe 私有格式,但是也可以用来封装 H.264视频编码、AAC音频编码或H.263视频编码、MP3音频编码。所以不能看到扩展名为 flv 就认为不是H.264 编码的F4V,网络上很多后缀FLV的视频,其实质是更高清晰度的F4V。

在线视频流播放方法利弊;ffmpeg mp4 faststart;mp4 moov作用相关推荐

  1. 在线视频流播放控制(优酷、土豆、酷六、音乐台)

    最近在制作相关系统的原型,需要用到视频,就把视频的播放问题做一个总结 视频是制作博客.空间日志的好素材,它制作简单,内容广泛,主要包括有视频音乐.小品.朗诵.电影.电视.游戏等等,不仅可以在插入视频中 ...

  2. 笔记:RTSP在线视频流资源地址

    1 在线视频流地址:rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov 2 播放软件 vlc,下载地址 Downloads ...

  3. linux安装编译安装 ffmpeg,解决linux下ffmpeg压缩的mp4无法在网页播放问题

    ffmpeg官网下载页面:http://www.ffmpeg.org/download.html github下载页面  https://github.com/FFmpeg/FFmpeg/releas ...

  4. 使用ffmpeg錄影mp4, 檔案不能播放

    使用ffmpeg2.8.15錄影mp4的檔案, Video Codec使用H264 (openh264-1.5.0), Audio Codec使用aac(fdk-aac-0.1.4), 每五分鐘錄影一 ...

  5. ffmpeg系列之mp4与ts格式转换

    ffmpeg系列之mp4与ts格式转换 1. M3U 协议解析 1.1.Tag说明 2.HLS 与 M3U8 3.通过ffmpeg进行转换 3.1. mp4格式转换为ts格式 3.2. ts格式拼接命 ...

  6. 使用H5Stream实现rtsp视频流播放,在Vue项目中 (无插件、可多视频源播放、亲测可用)

    本文主要介绍用H5Stream 在Web页面播放摄像头的RTSP视频流,从0到1的过程.包括WebSocket代理.h5ss.bat文件 运行一会就自己卡死了.H5ss服务死掉自动定时重启的脚本 等可 ...

  7. mp4文件缺少moov box无法播放情况的修复【非完美】

    一.mp4文件缺少moov box可能出现的场景有:使用录屏工具录到一半crash或断电,手机摄像机录到一般突然没电等. 二.修复的前提条件:需要有一个同样工具录制的参考视频,需要相同的mp4头部参数 ...

  8. ffmpeg error:mp4 stream error: no moov before mdat and the stream is not seekable

    VLC播放器报错 mp4 stream error: no moov before mdat and the stream is not seekable 解决方法 ffmpeg生成moov是在mda ...

  9. [Rtsp]RTSP对实时摄像头视频流进行转换(FFmpeg+FFserver)

    FROM:http://www.cuplayer.com/player/PlayerCode/RTSP/2014/0706/1414.html 1.一.问题描述 输入数据为来自摄像头的RTSP视频流, ...

最新文章

  1. 全景照片不怕歪!Facebook 用神经网络矫正扭曲的地平线
  2. 17、计算机图形学——辐射度量学
  3. C#DateTime为“ YYYYMMDDHHMMSS”格式
  4. linux.调整收发队列,linux消息队列通信
  5. oracle存储过程模板
  6. Activiti入门文档
  7. 疫情影响海外净利润?海尔智家的回答出人意料
  8. web业务系统权限控制
  9. C/C++ | Qt 实现爬虫功能,爬取CSDN博客文章
  10. SQLAlchemy ORM教程之一:Create
  11. SQL 游标使用实例
  12. 从事 Android 开发六年,我学到的那些事!
  13. JLOI2015 城池攻占
  14. LINUX下载编译g729
  15. 冒险者传说pc6java_我的世界之冒险者传说整合包游戏
  16. 微信小程序开发批量推送服务通知
  17. java生成pdf旋转_如何使用Java旋转PDF文档中的图像?
  18. 360如何清理注册表
  19. 如何避免扫码枪重复扫码
  20. 文字识别ORC与公式识别

热门文章

  1. 本构二次开发 c语言,基于外部材料接口的循环塑性本构模型二次开发
  2. Servlet相关练习题
  3. 一个简单的中国亲戚关系计算器 实现思路整理
  4. 《百年孤独》--[哥伦比亚]加夫列尔·加西亚·马尔克斯
  5. Altium Designer20(AD20)+VESC6.4实战PCB教程 全26集(北冥有鱼)
  6. iOS:UIScrollView、UITableView、UICollectionView顶部空白问题
  7. 从这份报告,我读出了数据从业者的局限与未来
  8. 用python实现liang-Barsky二维裁剪算法
  9. 软件定义无线电的实时频谱分析仪相关原理介绍(一)——信号与频谱
  10. 程序员不得不珍藏的那些励志片段