RTMP 视频数据格式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RTMP 视频数据格式相关的知识,希望对你有一定的参考价值。

参考技术A RTMP视频流格式与FLV很相似,通过查看FLV的格式文档,就能够知道RTMP视频数据应该怎么拼接。
RTMP中的数据就是由FLV的TAG中的数据区构成。

一般情况下,组装的RTMPPacket(RTMPDump中的结构体)为:

NALU就是NAL UNIT,nal单元。NAL全称Network Abstract Layer, 即网络抽象层,H.264在网络上传输的结构。一帧图片经过 H.264 编码器之后,就被编码为一个或多个片(slice),而装载着这些片(slice)的载体,就是 NALU 了 。

​ 我们通过x264编码获得一组或者多组 x264_nal_t 。结合RTMP,我们需要区分的是SPS、PPS、关键帧与普通帧:

一段h264视频由N组GOP(group of picture)组成,GOP指的就是画面组,一个GOP是一组连续的画面 。之前的学习中我们知道I帧能够独立解码,而P、B需要参考其他帧。
属于I帧的子集,有一种特殊的I帧,被称之为IDR帧,IDR帧的作用为即时刷新。

上面的这张图片描述的是2组GOP。其他I帧与IDR帧的区别就在于:刷新。当解码器解码帧5的时候,可以跨过帧4参考到帧3,普通I帧不会导致解码器的解码信息数据刷新。而IDR帧则会刷新解码需要的SPS、PPS数据,所以帧8不可能跨帧7参考解码。

往RTMP包中填充的是H.264数据,但不是直接将x264编码出来的数据填充进去。
一段包含了N个图像的H.264裸数据,每个NAL之间由:00 00 00 01 或者 00 00 01进行分割。

在分割符之后的第一个字节,就是表示这个nal的类型。

即为上面的

在将数据加入RTMPPacket的时候是需要去除分割符的。

如何在移动浏览器上通过 RTMP 显示 H.264 格式的视频直播?

【中文标题】如何在移动浏览器上通过 RTMP 显示 H.264 格式的视频直播?【英文标题】:How can I show live stream of video in H.264 format via RTMP on mobile browser? 【发布时间】:2014-09-14 18:22:39 【问题描述】:

如何在移动浏览器上通过 RTMP 显示 H.264 格式的实时视频流?我尝试了很多方法,但没有一个适用于移动浏览器。

【问题讨论】:

【参考方案1】:

RTMP 仅在 Flash 中可用。

【讨论】:

会兼容安卓手机浏览器吗?如果是这样,你能告诉我我该怎么做吗? 某些版本的 android 是的,其他的不是。对于 iOS,如果您的内容超过 5 分钟,则必须使用 HLS。所以我一般都推荐HLS。 你能帮我解决这个问题吗?用于在安卓移动浏览器上运行直播。 不,我不能。但我可以回答您在堆栈溢出上发布的具体问题。如果您在项目中的进展还不够远,无法提出具体问题,那么您需要自己做更多的研究。我建议你从 video.js 或 jwplayer 开始。

以上是关于RTMP 视频数据格式的主要内容,如果未能解决你的问题,请参考以下文章

RTMP视频流格式解析

如何在移动浏览器上通过 RTMP 显示 H.264 格式的视频直播?

前端页面播放 rtmp 流与 flv 格式视频文件

开发直播网站,想在手机浏览器播放,用rtmp推流,但是手机浏览器无法接收rtmp,请问有啥好的方法吗

rtmp和rtsp的区别和适用范围

从wireshark抓包分析rtmp协议,并提取出H264视频流