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. 【AI视频教程】只需5步,AI作出鸡你太美视频

    1.视频效果 黄昏见证虔诚的信徒 2.准备工作 制作视频效果,需要准备下面3个条件: 准备stable diffusion的环境 剪辑一段[鸡你太美]原版视频 stable diffusion安装sd ...

  2. 数学微积分,学习笔记,等价无穷小的证明:(1+x)^a-1 ~ ax

    \(\lim_{x \to 0} \frac{\sqrt[n]{1+x} -1}{\frac{x}{n} } =1\)的证明 \[\lim_{x \to 0} \frac{\sqrt[n]{1+x} ...

  3. 20.2 显示的链接到导出符号--《Windows核心编程》

    FAPPROC GetProcAddress(HMOUDLE hInstDll,PCSTR pszSymbolName); 1.根据名称 FARPROC FunctionAddress = (ULON ...

  4. android mvvm实例解析

    MVVM架构,将整个应用分为三层,View层,VM层,Model层.其中View层单向引用VM层,VM层单向引用Model层.如上图. 单向引用,而非双向引用,这是MVVM与MVP最大的区别.View ...

  5. OGP协议的使用

    OGP协议是一套Metatags的规格,用来标注页面,告诉我们你的网页快照.帮助社交app高效并准确的获取网页中的核心链接.标题.主图.正文摘要等信息,使得该网页在社交分享中有更好的展现体验. 如果网 ...

  6. java 如何计算两个汉字的相似度?如何获得一个汉字的相似汉字?

    计算汉字相似度 情景 有时候我们希望计算两个汉字的相似度,比如文本的 OCR 等场景.用于识别纠正. 实现 引入 maven <dependency> <groupId>com ...

  7. low-code 低代码平台 java 代码自动一键生成工具

    low-code low-code 是一款为 java 打造的低代码平台. 开源地址:https://github.com/houbb/low-code 特性 支持基本的增删改查 支持枚举值处理 支持 ...

  8. 使用winhex查看FAT16格式结构

    winhex介绍 winhex可以直接查看磁盘二进制信息, 可以比较直观地查看到各种文件系统格式的区别. winhex使用 查看硬盘要管理员权限, 即启动的时候要用邮件管理员权限启动 点击Tools- ...

  9. CSS实现图形效果

    CSS实现图形效果 CSS实现正方形.长方形.圆形.半圆.椭圆.三角形.平行四边形.菱形.梯形.六角星.五角星.心形.消息框. 正方形 <section> <div id=" ...

  10. Java设计模式-观察者模式Observer

    介绍 观察者模式是行为设计模式之一.当您对对象的状态感兴趣并希望在任何更改时得到通知时,观察者设计模式非常有用.在观察者模式中,观察另一个对象状态的对象被称为观察者,而被观察的对象则被称为主体. 优点 ...