PS:要转载请注明出处,本人版权所有。

PS: 这个只是基于《我自己》的理解,

如果和你的原则及想法相冲突,请谅解,勿喷。

前置说明

  本文作为本人csdn blog的主站的备份。(BlogID=075)

  本文发布于 2019-01-04 14:56:29,现用MarkDown+图床做备份更新。blog原图已丢失,使用csdn所存的图进行更新。(BlogID=075)

环境说明

  无

背景


  由于公司需要把相关视觉算法结果以流媒体的方式可视化出来,这样可以有利于推广、演示和其他等等。

  一般来说:视觉算法一般都是通过某种方式(USB接口、RTSP等等方式)采集摄像头的图像数据,然后送入视觉算法,取出视觉算法的结果,然后根据算法结果在原图上画出相关的检测结果,这样即可把算法结果可视化,而且也是比较实际的一种可视化方式。

  现在要做的是把这些可视化结果做成一个可以播放的视频。根据这样一个需求,初步确定就是视频编码然后通过相应的流媒体协议发送出去,然后就可以用相应的播放器播放了。由于考虑到后期可能会涉及到移动端播放视频以及以及减轻前端的开发难度(前端可直接用H5播放),选择了H264+RTMP这样一种方式。

  市面上成熟的RTMP服务器很多,开源的也有(SRS,CRTMPSERVER等等),商业的也有(万恶之源ADOBE FLASH SERVER),它们的一般流程都是:一个程序推流,一个RTMP服务器接收推送的流。但是考虑到我们的嵌入式设备,要尽可能的减少资源占用,精简项目架构,准备把推流和RTMP服务器结合起来开发。

  于是,需要在设备上采集相机数据(解码),送给视觉算法检测,然后把检测结果画出来,然后通过H264编码,然后其他人可以通过打开一个网页看到我们的RTMP服务器推送是视频。

H264编码


  本系列的重点本来是根据RTMP协议实现一个RTMP服务器,至少我没有做这件事情之前是这样认为的。但是做完这件事情后,我发现还是先从一些和RTMP相关的H264的要点说起来。

  H264的基本知识网上有许多资料,我这里不会完整的翻译这些文章,我只会提出部分内容,这些内容是和RTMP推流息息相关的。(PS:说一句,我在整个过程中用了许多H264相关的知识,但是我依然是一个H264的小白,我只需要会用就行了,至于怎么压缩怎么编码的,我根本不知道!!!!!!)

  阅读本文前:建议先找一篇网上的有H264详细内容的看一看,了解个大概。

NALU

  H264 的功能结构分为视频编码层(VCL)和网络提取层(NAL).VCL层输出的是编码器输出原始图像经过编码后的数据流,NAL层输出的是可以存储和传输的数据结构。

NAL = NALHeader + RBSP(Raw Byte Sequence Payload)

NALHeader有如下我们熟悉的内容:
0x65 ---- I帧NALHeader
0x67 ---- sps帧NALHeader,这里面包含了分辨率及其他解码器需要的信息。
0x68 ---- pps帧NALHeader,这里包含了解码器需要的信息。
... ... RBSP就是实际携带视频数据的字段。

  注意:这里的一个NALU可能一帧数据(一张图片)也可能不是。

Annex B ---- Byte stream format

  在h264的文档中,附录B有一个字节流格式,这个是官方推荐和国际标准的。所以,现在大多数编码器输出的数据的结构变为了这种结构。结构如下:

STARTCODE + NALU = STARTCODE + NALHeader + RBSP

STARTCODE 就是 0x000001 或者 0x00000001

  这种结构如官方文档下图所示:

后记


  以上两类知识在RTMP是非常重要。

参考文献


打赏、订阅、收藏、丢香蕉、硬币,请关注公众号(攻城狮的搬砖之路)

PS: 请尊重原创,不喜勿喷。

PS: 要转载请注明出处,本人版权所有。

PS: 有问题请留言,看到后我会第一时间回复。

一个简单的RTMP服务器实现 --- RTMP与H264的更多相关文章

  1. 自己动手模拟开发一个简单的Web服务器

    开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的W ...

  2. 一个简单的web服务器

    写在前面 新的一年了,新的开始,打算重新看一遍asp.net本质论这本书,再重新认识一下,查漏补缺,认认真真的过一遍. 一个简单的web服务器 首先需要引入命名空间: System.Net,关于网络编 ...

  3. [置顶] 在Ubuntu下实现一个简单的Web服务器

    要求: 实现一个简单的Web服务器,当服务器启动时要读取配置文件的路径.如果浏览器请求的文件是可执行的则称为CGI程序,服务器并不是将这个文件发给浏览器,而是在服务器端执行这个程序,将它的标准输出发给 ...

  4. Tomcat剖析(二):一个简单的Servlet服务器

    Tomcat剖析(二):一个简单的Servlet服务器 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三) ...

  5. Tomcat剖析(一):一个简单的Web服务器

    Tomcat剖析(一):一个简单的Web服务器 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三):连接器 ...

  6. 自己模拟的一个简单的web服务器

    首先我为大家推荐一本书:How Tomcat Works.这本书讲的很详细的,虽然实际开发中我们并不会自己去写一个tomcat,但是对于了解Tomcat是如何工作的还是很有必要的. Servlet容器 ...

  7. java实现一个简单的Web服务器

    注:本段内容来源于<JAVA 实现 简单的 HTTP服务器> 1. HTTP所有状态码 状态码 状态码英文名称 中文描述 100 Continue 继续.客户端应继续其请求 101 Swi ...

  8. 响应式编程笔记三:一个简单的HTTP服务器

    # 响应式编程笔记三:一个简单的HTTP服务器 本文我们将继续前面的学习,但将更多的注意力放在用例和编写实际能用的代码上面,而非基本的APIs学习. 我们会看到Reactive是一个有用的抽象 - 对 ...

  9. 转:【专题十二】实现一个简单的FTP服务器

    引言: 休息一个国庆节后好久没有更新文章了,主要是刚开始休息完心态还没有调整过来的, 现在差不多进入状态了, 所以继续和大家分享下网络编程的知识,在本专题中将和大家分享如何自己实现一个简单的FTP服务 ...

  10. 使用gitblit搭建一个简单的局域网服务器

    使用gitblit搭建一个简单的局域网服务器 1.使用背景 现在很多使用github管理代码,但是github需要互联网的支持,而且私有的git库需要收费.有一些项目的代码不能外泄,所以,搭建一个局域 ...

随机推荐

  1. 除了mysql 和 sql server, 你还有另外一种选择 postgreSQL

    数据库的重要性,不用多说.数据库的名字,大家应该也知道很多.就国内来说,使用者最多的应该是mysql 和sql server,大企业用ORACLE的也不在少数. 就我个人而言,在使用.NET的时候,基 ...

  2. 使用7-zip进行分卷压缩和解分卷压缩(Windows和Linux)

    现在一共有10个视频,一共313M,我对该文件夹进行分卷压缩,每个tar包100M,压缩过程如下: Windows环境首先选中所有的压缩包,然后在压缩包上单击鼠标右键,然后选择7-Zip,再选择提取到 ...

  3. mac os 解决Error: EMFILE: too many open files错误

    壹 ❀ 引 构建项目时终端反复出现Error: EMFILE: too many open files的错误,经排查是因为项目较大,发布过程中已经超过了mac默认的文件监听上限,错误如下: 解决方式也 ...

  4. NC16697 [NOIP2001]Car的旅行路线

    题目链接 题目 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中 ...

  5. 前端学习 node 快速入门 系列 —— 项目版权格式化

    其他章节请看: 前端学习 node 快速入门 系列 项目版权格式化 需求 替换整个项目的版权信息,替换文件为 .c 和 .h 结尾. 分析 版权信息通常都在文件开头,通过是否有 copyright 来 ...

  6. STM32F401+nRF24L01无线传输音频(对讲机原型)

    尝试结合STM32F401的ADC, PWM, SPI(NRF24L01)和TIM, 试验了一下音频的无线传输(对讲机原型) 工作机制 音频采样 因为硬件的限制, 包括STM32F401片内存储, 内 ...

  7. 配置nginx反向代理

    最近在做一个前后分离的项目,前端用Vue,后台spring boot,使用nginx做反向代理.下面说一下如何配置: 启动spring boot项目,端口8110 启动nginx 修改nginx.co ...

  8. spring boot整合spring security自定义登录跳转地址

    说明 在博客用户登录后我想跳转到各自用户的博客首页,我们知道这个地址是动态的. 例如: http://localhost:8080/blog/zhangsan, 每个用户地址不一样.这时候我就用到了自 ...

  9. 【Azure 事件中心】Spring Cloud Stream Event Hubs Binder 发送Event Hub消息遇见 Spec. Rule 1.3 - onSubscribe, onNext, onError and onComplete signaled to a Subscriber MUST be signaled serially 异常

    问题描述 开发Java Spring Cloud应用,需要发送消息到Azure Event Hub中.使用 Spring Cloud Stream Event Hubs Binder 依赖,应用执行一 ...

  10. 【Azure 存储服务】如何查看Storage Account的删除记录,有没有接口可以下载近1天删除的Blob文件信息呢?

    问题描述 如何查看Storage Account的删除记录,有没有接口可以下载近1天删除的Blob文件信息呢?因为有时候出现误操作删除了某些Blob文件,想通过查看删除日志来定位被删除的文件信息. 问 ...