一般来说我们总是将rtmp和http放在一起,一方面是因为他们都是采用tcp,另一方面它们的数据包都是互通的,一般来说,我们常见的服务器为如下:

rtmp 可以传输三种方式的流,http为一种flv,我个人觉得rtmp主要是为了支持flash和webH5所以就兼容的flv和MP4,http就不用说了,b站转型找的一种兼容方案。

其实如果我们单纯的想要web播放,如果是自己开发webh5播放器,我觉得http采用h264更加好,反正就是将demux放在服务端还是客户端的事情。

以下为参考文档:

fmp4,是适应于现代浏览器的一种流媒体格式。和mp4格式不同的是,以往的mp4格式化也分为header信息和payload信息,一个大的mp4就会有一个很大的头信息,不适合与现在的网络环境。所以新的fmp4格式就出现了,fmp4格式有一个带了metadata的头片段,及后面一序列的fragment,每个fragment都有各自的header信息,这样就把header信息也分成了一个个小的片段,更适合现在的应用场景。所以fmp4格式也就是用于MediaSource对象的SourceBuffer的格式,通过一个initSegment和一序列的segment塞给MediaSource对象来播放。

直播,类似于新闻联播,视频流在网络上,只要终端接收流就从那一刻开始
点播,类似于重播,编辑好的视频文件,被观众任意观看,每次都从头播放
直播平台,国内最大的有yy、战旗、斗鱼tv、龙珠,新技术流“全民直播”全球首个实现了手机作为直播源的一键直播
点播平台,优酷、土豆、百度视频、腾讯视频

视频点播
服务端存放多个视频文件,客户端可通过网路点播客户端任意观看其中一个视频,并可拖动进度进行观看

视频直播
服务端实时发送直播来源(如系统桌面、摄像头)的数据流,客户端通过支持流媒体协议的播放器实时播放同样的内容,不可拖动进度

参考:
MP4首先不能够像h264 es流进行直播,需要先mux成mp4然后点播。
其次,mp4的类real-time传送方法,需要再mp4本地格式码流中加入hint track。mp4creator
ffmpeg都可以加入,这个过程的名词叫mp4流媒体化,只有流媒体化过的mp4才可以在网络间实时传送。
你应该先学习学习mp4格式,不仅是本地格式,要学习流的格式。
一、关于chrome的快速播放和拖拽

1、chrome使用H5的video标签来播放

2、chrome很智能,如果读取MP4文件,发现moov box不在文件前部,会直接读取MP4的文件尾部,加载moov box

3、拖拽时,chrome根据moov box得到的关键帧的字节偏移量,采用range请求来请求

4、Flash如果读取MP4文件,发现moov box不在文件前部,不会直接读取MP4的文件尾部去寻找moov box,所以Flash要等文件全部下载完,取到文件尾部的moov头,才可以正常播放。

一般来说,如果边下载边播放就需要moov前置。

1,RTMP协议
(1)是流媒体协议。
(2)RTMP协议是 Adobe 的私有协议,未完全公开。
(3)RTMP协议一般传输的是 flv,f4v 格式流。
(4)RTMP一般在 TCP 1个通道上传输命令和数据。

2,RTSP协议
(1)是流媒体协议。
(2)RTSP协议是共有协议,并有专门机构做维护。.
(3)RTSP协议一般传输的是 ts、mp4 格式的流。
(4)RTSP传输一般需要 2-3 个通道,命令和数据通道分离。

3,HTTP协议
(1)不是是流媒体协议。
(2)HTTP协议是共有协议,并有专门机构做维护。

(3)HTTP协议没有特定的传输流。
(4)HTTP传输一般需要 2-3 个通道,命令和数据通道分离。

在最后着重讲一下视频消息的chunk

         协议层                封装层++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++|RTMP Chunk Header | FLV VideoTagHeader | FLV VideoTagBody |     ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

在实际发送的过程中我们并不发送 FLV VideoTagHeader,为什么呢?我们来看 FLV VideoTagHeader数据:
FLv Tag Header结构占用11个字节:

第1个字节表示Tag类型,包括音频(0x08)、视频(0x09)和script data(0x12),其他类型值被保留。  即为0x09第2-4字节为UI24类型的值,表示该Tag Data部分的大小。 即为0x1E=30第5-7字节为UI24类型的值,表示该Tag的时间戳(单位为ms),第一个Tag的时间戳总是0。即为0x53=83,此时间戳表示解码时间!!!第8个字节为时间戳的扩展字节,当24位数值不够时,该字节作为最高位将时间戳扩展为32位值。  即为0x00第9-11字节为UI24类型的值,表示stream id,总是0. 即为0x00
class FlvTagHeader {public:uint8_t type = 0;uint8_t data_size[3] = {0};uint8_t timestamp[3] = {0};uint8_t timestamp_ex = 0;uint8_t streamid[3] = {0}; /* Always 0. */
}PACKED;

关于flv 参考:https://my.oschina.net/u/2326611/blog/679702

这些数据跟chunk中的chunk Msg Header 相同

Basic header + Chunk Msg Header+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| format | chunk stream id | timestamp | message length | msg type id | msg stream id |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+2 bits      6 bits        3 bytes       3 bytes         1 bytes        4 bytes
class ChunkMsgHeader {public:uint8_t flags;uint8_t time_stamp[3];uint8_t body_size[3];uint8_t type_id;uint8_t stream_index[4]; /* Note, this is little-endian while others are BE */
}PACKED;

所以chunkMsgHeader就可以替代FlvTagHeader

关于rtmp参考:https://segmentfault.com/a/1190000018582618

总结:所以有同学问rtmp传输的时候到底传输视频的时候是不是首先将h264组包为flv格式,然后再组包chunk,实际上是不用的,直接将chunk Msg Header组包就可以。

rtmp和http flv协议总结相关推荐

  1. python解析flv协议(AMF数据)

    学习python也有1周了,因为之前学习了golang,所以觉得python和golang有很多类似的地方,比如切片和语法,python的确是一门很好的语言,至少你了解了之后才会发现其实它很强大,编写 ...

  2. rtmp flv协议笔记

    rtmp协议格式: RTMP - Real Time Messaging Protocol,TCP/IP五层体系结构中应用层协议(流媒体协议),基于TCP传输,在TCP通道上传输命令和数据,一般传输的 ...

  3. EasyRTMP实现的rtmp推流的基本协议流程

    EasyRTMP介绍 EasyRTMP是结合了多种音视频缓存及网络技术的一个rtmp直播推流端,包括:圆形缓冲区(circular buffer).智能丢帧.自动重连.rtmp协议等等多种技术,能够非 ...

  4. FLV协议5分钟入门浅析

    FLV协议简介 FLV(Flash Video)是一种流媒体格式,因其体积小.协议相对简单,很快便流行开来,并得到广泛的支持. 常见的HTTP-FLV直播协议,就是使用HTTP流式传输通过FLV封装的 ...

  5. [js] ajax请求地址只支持http/https吗?能做到让它支持rtmp://等其它自定义协议吗 ?

    [js] ajax请求地址只支持http/https吗?能做到让它支持rtmp://等其它自定义协议吗 ? ajax只支持http/https协议, 可以通过自定义http头来间接支持自定义协议 个人 ...

  6. RTMP协议和RTSP协议的区别

    一.RTMP协议: 1.是流媒体协议 2.RTMP是Adobe的私有协议,没有完全公开 3.RTMP协议一般传输的是flv.f4v格式流 4.RTMP协议一般在TCP的一个通道传输命令和数据 二.RT ...

  7. 基于Nginx+rtmp搭建支持hls协议的点播流媒体服务器(windows/Linux)

    前言:公司最近因为客户端视频文件过大导致视频加载时间很长,让我将视频播放做成流媒体点播的形式,于是查阅了几十篇相关文章以及文档,最终将功能实现.可能是存在版本差异,绝大部分文章介绍的教程并不能成功实施 ...

  8. 直播视频流+html,前端页面播放 rtmp 流与 flv 格式视频文件

    技术 :angular/cli , html5 , typescript , scss ,es 6 ... 项目类型:直播视频与视频回放 使用到 插件 : videojs + ckplayer 遇到的 ...

  9. rtmp流放与flv格式视频问题解决

    项目:直播视频与视频回放 插件:videojs+ckplayer 解决问题:一开始用flv.js播放flv格式视频文件超过40M,就会出现异常. 解决方法: 用ckplayer代替flv插件 代码: ...

最新文章

  1. UI+UE+UX+区别
  2. nbu 196错误和191错误解析
  3. 第十六届全国大学生智能车竞赛RT-Thread创新专项奖获奖名单
  4. 导入表编程-枚举导入表
  5. JVM-虚拟机栈详解 附面试高频题 (手画多图)!!!深入浅出,绝对值得收藏哈!!!
  6. linux配置临时IP和永久IP
  7. Python下载安装
  8. 【数据库】Mysql日期/时间函数实际案例
  9. 框架升级后某个类型所在程序集发生转移,应用还能正常运行吗?
  10. Centos7使用yum安装Mysql5.7.19的详细步骤(可用)
  11. python是交互式语言吗_什么是Python交互式解释器
  12. Oracle学习资料汇集
  13. 什么是SPREADJS的脏数据?
  14. 富士通Fujitsu DPK750 Pro 打印机驱动
  15. 小刘同学的第一百三十篇日记
  16. vue将图片链接、本地图片转为二进制文件流
  17. 高级运维工程师证书_一位IT运维工程师的CISSP认证历程,值得借鉴!
  18. {  周赛  }又被虐爆了
  19. jquerykindeditor文本编辑器插件
  20. [BUUCTF-pwn] wdb_2018_semifinal_pwn3

热门文章

  1. 阿宝体育技术服务支持
  2. 深入理解:文件、二进制、字符集(编码)三者之间的区别与联系
  3. 计算机辅助设计中专专业,《计算机辅助设计cad》中专课程标准.doc
  4. U盘中文件无法删除,删除后一刷新又出现,并提示“文件或目录损坏且无法读取”的解决方法
  5. 经典语录!不看你会后悔!
  6. mysql数据库中 索引的作用是什么意思_什么是数据库索引,索引有什么作用
  7. python爬虫编写-零基础写python爬虫之爬虫编写全记录
  8. 第三周作业1(1)嘎嘎嘎
  9. VLOOKUP之全面掌握VLOOKUP函数各类用法(一)
  10. C盘空间清理并查看各个文件占的大小