一个简单的RTMP服务器实现 --- RTMP与H264
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的更多相关文章
- 自己动手模拟开发一个简单的Web服务器
开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的W ...
- 一个简单的web服务器
写在前面 新的一年了,新的开始,打算重新看一遍asp.net本质论这本书,再重新认识一下,查漏补缺,认认真真的过一遍. 一个简单的web服务器 首先需要引入命名空间: System.Net,关于网络编 ...
- [置顶] 在Ubuntu下实现一个简单的Web服务器
要求: 实现一个简单的Web服务器,当服务器启动时要读取配置文件的路径.如果浏览器请求的文件是可执行的则称为CGI程序,服务器并不是将这个文件发给浏览器,而是在服务器端执行这个程序,将它的标准输出发给 ...
- Tomcat剖析(二):一个简单的Servlet服务器
Tomcat剖析(二):一个简单的Servlet服务器 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三) ...
- Tomcat剖析(一):一个简单的Web服务器
Tomcat剖析(一):一个简单的Web服务器 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三):连接器 ...
- 自己模拟的一个简单的web服务器
首先我为大家推荐一本书:How Tomcat Works.这本书讲的很详细的,虽然实际开发中我们并不会自己去写一个tomcat,但是对于了解Tomcat是如何工作的还是很有必要的. Servlet容器 ...
- java实现一个简单的Web服务器
注:本段内容来源于<JAVA 实现 简单的 HTTP服务器> 1. HTTP所有状态码 状态码 状态码英文名称 中文描述 100 Continue 继续.客户端应继续其请求 101 Swi ...
- 响应式编程笔记三:一个简单的HTTP服务器
# 响应式编程笔记三:一个简单的HTTP服务器 本文我们将继续前面的学习,但将更多的注意力放在用例和编写实际能用的代码上面,而非基本的APIs学习. 我们会看到Reactive是一个有用的抽象 - 对 ...
- 转:【专题十二】实现一个简单的FTP服务器
引言: 休息一个国庆节后好久没有更新文章了,主要是刚开始休息完心态还没有调整过来的, 现在差不多进入状态了, 所以继续和大家分享下网络编程的知识,在本专题中将和大家分享如何自己实现一个简单的FTP服务 ...
- 使用gitblit搭建一个简单的局域网服务器
使用gitblit搭建一个简单的局域网服务器 1.使用背景 现在很多使用github管理代码,但是github需要互联网的支持,而且私有的git库需要收费.有一些项目的代码不能外泄,所以,搭建一个局域 ...
随机推荐
- 洛谷P3612 [USACO17JAN] Secret Cow Code S
[USACO17JAN] Secret Cow Code S 题面翻译 奶牛正在试验秘密代码,并设计了一种方法来创建一个无限长的字符串作为其代码的一部分使用. 给定一个字符串,让后面的字符旋转一次(每 ...
- .NET 云原生架构师训练营(模块二 基础巩固 HTTP管道与中间件)--学习笔记
2.3.2 Web API -- HTTP管道与中间件 管道 中间件 ASP.NET Core 中间件:https://docs.microsoft.com/zh-cn/aspnet/core/fun ...
- NC21125 践踏
题目链接 题目 题目描述 首先给定一个定值k,支持如下操作(在数轴上) 加入一条线段[l,r] 删除一条已经存在的线段 给定x,问有多少个区间包含x+kt,其中t是一个整数变量,即t ∈ Z 比如说当 ...
- 【Unity3D】流动雾效
1 前言 屏幕深度和法线纹理简介中对深度和法线纹理的来源.使用及推导过程进行了讲解,激光雷达特效中讲述了一种重构屏幕像素点世界坐标的方法,本文将介绍使用深度纹理重构屏幕像素点在相机坐标系下的坐标计 ...
- Js中数组空位问题
Js中数组空位问题 JavaScript中数组空位指的是数组中的empty,其表示的是在该位置没有任何值,而且empty是区别于undefined的,同样empty也不属于Js的任何数据类型,并且在J ...
- F - Subarrays题解
F - Subarrays 题意:给你一个序列,问这个序列里有多少个子串的和能被k整除. 思路:求前缀和,然后每个位置对k取模,模数相等的位置之间,是一个满足条件的字串. 因为求的是前缀和,所以取模后 ...
- C++字符串大写字母转小写字母
#include <iostream> #include <stdio.h> using namespace std; char* Capital_to_Small(char* ...
- click模块解析命令行参数
click模块解析命令行参数 安装 pip install click 操作步骤 1)使用@click.command()装饰一个函数,使之成为命令行接口 2)使用@click.option()等装饰 ...
- python中动态生成类type的用法
示例:正常创建类 class Person(object): def __init__(self): self.name = name self.age = age p = Person(" ...
- Advanced .Net Debugging 2:CLR基础
一.简介 这是2024新年后我的第一篇文章,也是我的<Advanced .Net Debugging>这个系列的第二篇文章.这篇文章告诉我们为了进行有效的程序调试,我们需要掌握哪些知识.言 ...