第六季:RTSP协议详解与实时流视频预览

目录

  • 前言
  • [1 环境准备](#1 环境准备)
  • [2 H.264编码原理和基本概念](#2 H.264编码原理和基本概念)
    • [2.1 图像冗余信息](#2.1 图像冗余信息)
    • [2.2 h.264编码相关的一些概念](#2.2 h.264编码相关的一些概念)
    • [2.3 h264视频流总体分析](#2.3 h264视频流总体分析)
    • [2.4 H264的NAL单元详解2](#2.4 H264的NAL单元详解2)
      • [2.4.1 相关概念](#2.4.1 相关概念)
    • [2.5 NALU详解](#2.5 NALU详解)
    • [2.6 sps和pps详解](#2.6 sps和pps详解)
    • [2.7 H264的profile和level](#2.7 H264的profile和level)
    • [2.8 序列sequence](#2.8 序列sequence)

前言

本篇文章用于记录实验过程

1 环境准备

资料:

c 复制代码
链接:https://pan.baidu.com/s/18J8JjYrWGIQMgYxwacIYjg?pwd=wgg9 
提取码:wgg9 
--来自百度网盘超级会员V4的分享

下载的sample_rtsp.rar加压到mpp目录下,并改名

c 复制代码
unrar x sample_rtsp.rar
mv sample_bak/ sample_rtsp
ls
c 复制代码
cd sample_rtsp/venc
make clean
make -j6
ls
c 复制代码
cp sample_venc /mnt/hisilion_nfs/ -rf

在开发板中运行程序。

打开VLC播放器,使用网络串流连接开发板,URL改成你的开发板IP地址

2 H.264编码原理和基本概念

2.1 图像冗余信息

(1)空间冗余:一张图片中,颜色完全相同的一大片区域,可以用一个点表示颜色,另外需要记录着个区域的范围,这样可以节省很多内存空间。

(2)时间冗余:一个视频中,有些时间段,一直是一幅图片保持不变,这种情况可以只保留一张图片。

2.2 h.264编码相关的一些概念

(1)宏块 MB macroblock:多个像素点组成的一个区域,这些像素点的颜色应保持相似或相同,压缩算法以宏块为单位进行压缩。

(2)片 slice:一个帧可以由一个片或者多个片构成,片内包含一个或多个宏块。

(3)帧 frame:一帧就是一幅图片。

(4)I帧、B帧、P帧:

I帧(这一帧和前后帧不相关,例如:不需要考虑时间冗余,起始帧就是I帧,只能去除空间冗余)。

B帧(参考前一帧也参考后一帧,B帧很少见到)。

P帧(只参考前一帧,进行空间冗余和时间冗余的计算)。

(5)帧率 fps:每秒钟,显示多少张图片。

(6)像素->宏块->片->帧->序列->码流

2.3 h264视频流总体分析

(1)h264标准有多个版本,可能会有差异,具体差异不详

(2)网上看的资料有时讲法会有冲突,或者无法验证的差异

(3)以海思平台为主、为准、为案例,不能保证其他平台也完全一样

(4)海思平台编码出来的H.264码流都是一个序列包含:1sps+1pps+1sei+1I帧+若干p帧

2.4 H264的NAL单元详解2

NAL全称Network Abstract Layer, 即网络抽象层。

在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:视频编码层面(VCL)和网络抽象层面(NAL)。其中,前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。因此我们平时的每帧数据就是一个NAL单元(SPS、PPS、SEI除外)。在实际的H264数据帧中,往往帧前面带有00 00 00 01 或 00 00 01分隔符,一般来说编码器编出的首帧数据为PPS与SPS,有的标准中也包含SEI,接着为I帧......

NAL单元 = I帧 + P帧

2.4.1 相关概念

(1)序列 sequence

一个序列包含:1sps+1pps+1sei+1I帧+若干p帧

使用百度网盘内附带的软件打开 ar0130.h264 这个文件

如上图所示,图中只展示了有效数据,没有展示分隔符,序列号3 是I帧,4是P帧。0 1 2 在后面会进行详细介绍。

(2)分隔符

使用winhex打开 ar0130.h264 这个文件,这个文件在本文开头的百度网盘内

上面的00 00 00 01就是一个分隔符,这是h.264编码协议规定的,如果有效数据中包含了连续的三个00,则在第二个和第三个之间添加03,即00 00 03 00 01。

分隔符后面的第一个字节决定了这段内容属于什么帧,详细内容:

https://blog.csdn.net/jefry_xdz/article/details/8461343

对引用的博客进行说明补充,上面图片中的(2)部分,表示数据传输时的优先级,数字越大优先级越高。

由图可知,P帧的优先级为3,首位为0,帧类型为P帧。如果出现网速慢,而且需要保持网络视频的实时性,通信协议会丢弃优先级较低的内容。

(3)sps (sequence paramater set)

sps和pps详解:

https://www.cnblogs.com/wainiwann/p/7477794.html

先介绍SPS。

上图,NAL_Size表示字节,图中的SPS占14个字节。

如上图所示,结合SPS占14个字节,67 42 ... 80 81,这段内容就是SPS。

(4)pps

pps对应的内容68 CE 3C 80,共占4个字节。

(5)sei

sei对应的内容06 E5 01 34 80,共占5个字节。

(6)NALU

2.5 NALU详解

参考阅读:
https://blog.csdn.net/jefry_xdz/article/details/8461343
https://blog.csdn.net/special00/article/details/82533768

2.6 sps和pps详解

 https://www.cnblogs.com/wainiwann/p/7477794.html

2.7 H264的profile和level

https://blog.csdn.net/xiaojun111111/article/details/52090185

2.8 序列sequence

(1)一段h.264的码流其实就是多个sequence组成的

(2)每个sequence均有固定结构:1sps+1pps+1sei+1I帧+若干p帧

(3)sps和pps和sei描述该sequence的图像信息,这些信息有利于网络传输或解码

(4)I帧是关键,丢了I帧整个sequence就废了,因为P帧参考I帧,I帧是起始帧,每个sequence有且只有1个I帧

(5)p帧的个数等于fps-1

(6)I帧越大则P帧可以越小,反之I帧越小则P帧会越大

(7)I帧的大小取决于图像本身内容,和压缩算法的空间压缩部分

(8)P帧的大小取决于图像变化的剧烈程度

(9)CBR(固定码率)和VBR(可变码率)下P帧的大小策略会不同,CBR时P帧大小基本恒定,VBR时变化会比较剧烈。码率就是P帧的大小,P帧大小固定时,如果当前帧相比于前一帧的变化不大,清晰度保持不变,如果变化大,而且变化的字节数超过了固定的码率,清晰度会下降;可变码率的清晰度一直不变,但当图像变化大时,字节数会增加,导致网络传输的字节数变大,如果网速慢,视频会出现卡顿的情况。

(10)如果当前帧和前一帧相比,变化非常小,则P帧所占的字节数就很小。

本文许多结论是基于我们的海思HI3518E平台得到的,对于其他平台并不一定适用!

相关推荐
Fre丸子_6 小时前
ffmpeg之播放一个yuv视频
ffmpeg·音视频
9527华安6 小时前
FPGA多路MIPI转FPD-Link视频缩放拼接显示,基于IMX327+FPD953架构,提供2套工程源码和技术支持
fpga开发·架构·音视频
catmes7 小时前
设置浏览器声音或视频的自动播放策略
chrome·音视频·edge浏览器
杨德杰9 小时前
QT多媒体开发(一):概述
qt·音视频·多媒体
是十一月末10 小时前
Opencv实现图片和视频的加噪、平滑处理
人工智能·python·opencv·计算机视觉·音视频
余~~1853816280012 小时前
稳定的碰一碰发视频、碰一碰矩阵源码技术开发,支持OEM
开发语言·人工智能·python·音视频
m0_7482323912 小时前
WebRTC学习二:WebRTC音视频数据采集
学习·音视频·webrtc
Kai HVZ13 小时前
python爬虫----爬取视频实战
爬虫·python·音视频
强哥之神15 小时前
Nexa AI发布OmniAudio-2.6B:一款快速的音频语言模型,专为边缘部署设计
人工智能·深度学习·机器学习·语言模型·自然语言处理·音视频·openai
EasyDSS16 小时前
国标GB28181-2022平台EasyGBS:安防监控中P2P的穿透方法
网络协议·php·音视频·p2p