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. Jackson objectMapper.readValue 方法 详解

    直接说结论方便一目了然: 1. 简单的直接Bean.class 2. 复杂的用 TypeReference 这样就完事了. public class TestMain2 { public static ...

  2. crontab 里如何创建带日期的日志文件

    需求在crontab 执行定时任务时,将执行的任务输出到带日期的文件中 crontab中,执行脚本需要传入系统时间date +"%Y-%m-%d" 问题今天遇到一个crontab问 ...

  3. DecisionTreeClassifier&DecisionTreeClassRegression

    DecisionTreeClassifier from sklearn.datasets import load_wine # 红酒数据集 from sklearn.tree import Decis ...

  4. 从零开始的微信小程序入门教程(三),有趣且好玩的数据绑定

    壹 ❀ 引 我在从零开始的微信小程序入门教程(二),初识WXML与WXSS一文中简单介绍了小程序组件与小程序样式相关概念,在了解这两者之后,其实我们已经可以搭建出简单的静态页面,与书写HTML页面一样 ...

  5. Ubuntu/Centos下OpenJ9 POI输出Excel的Bug

    项目更换 JDK为 OpenJ9 后, 使用 POI 导出 Excel 遇到的问题 OpenJ9 版本信息 /opt/jdk/jdk-11.0.17+8/bin/java -version openj ...

  6. oracle authid current_user详解

    在编写PLSQL程序时,对于授权的考虑很重要.ORACLE PLSQL中提供两种授权选择: --AUTHID DEFINER (定义者权限):指编译存储对象的所有者.也是默认权限模式. --AUTHI ...

  7. SQL Server使用常见问题

    普通分页查询 三种方式: Top Not IN 方式:查询靠前的数据较快 ROW_NUMBER() OVER()方式:查询靠后的数据速度比上一种较快,在老版本的SQL Server中最常使用 offs ...

  8. 面向对象基础---day02

    成员变量和局部变量区别 封装 private关键字 1.是一个权限修饰符 2.可以修饰成员(成员变量和成员方法) 3.作用是保护成员不被别的类使用,被private修饰的成员只在本类中才能访问 针对p ...

  9. 【Azure 应用服务】App Service For Linux 中安装paping, 用于验证从App Service向外请求的网络连通性

    问题描述 App Service For Linux 中安装paping的操作步骤 解决步骤 1) 登录App Service的Kudu站点,点击Bash 2)使用命令下载paping压缩文件:#wg ...

  10. 【Azure 应用服务】App Service 通过 wardeploy 部署 war 包,如何指定到 root目录为wwwroot

    问题描述 在部署War包到App Service时,参考文档:(使用 ZIP 或 WAR 文件将应用部署到 Azure 应用服务 : https://docs.azure.cn/zh-cn/app-s ...