音视频流媒体学习

一、音视频开发系列课程学习
1.基础相关
在这里插入图片描述
(1)为什么要进行编码?视频是连续的图像序列,由连续的帧构成。由于人眼的视觉存在暂留效应,所以为了压缩数据,对视频进行编码。
(2)IPB帧:I帧:帧内编码帧,关键帧,I帧可以看作一个图像经过压缩之后的产物,可以单独解码出一个完整的图像;
P帧:前向预测编码帧,记录了本帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧自定义的差别,生成最终画面;
B帧:双向预测编码帧,记录了本帧与前后帧的差别,解码需要参考前面一个I帧或P帧,同事也需要后面的P帧才能解码一张完整的图像。
两个I帧之间的距离称为一个GOP。
(3)如何编码?
空间冗余:图像内部相邻像素之间存在较强的相关性造成的冗余;
时间冗余:视频图像序列中的不同帧之间的相关性所造成的冗余;
视觉冗余:是指人眼不能感知或者不太敏感的那部分图像信息;
信息熵冗余:也就是编码冗余;
知识冗余:是指再有些图像中还包含与某些验证知识有关的信息。
(3)视频编码
所谓视频编码就是直通过特定的压缩技术,将某个视频格式文件转换成另一个视频格式文件的方式。视频流传输中最重要的的编解码标准有国际电联(IUT-T)的H.261,H.263,H.264等。运动静止图像专家组的MPEG系列标准MPEG1\MPEG2\MPEG4 AVC等。
H.265则被成为高效率视频编码(HEVC)。
(4)H.264码流分析
H.264的码流闻见主要分为两层:
VCL(video coding player,视频编码层):负责高效的视频内容表示,VCL数据即编码处理的输出,它表示被压缩编码后的视频数据序列;
NAL(Network Abstraction layer,网络提取层):负责益网络所要求的恰当的方式对数据进行打包和传送,是传输层。不管再本地播放还是在网络播放,都要通过这一层的传输。
A.片和宏块
一帧图片经过H.264编码器之后,就被编码成为一个躲着多个片(slice),每片包含数个宏块(至少一个宏块,最多包含有多个图像宏块),NAL单元就是承载着这些片(slice)的载体。
B.Annexb格式
一般H.264吧编码器的默认输出为:起始码+NALU(NAL单元),起始码为0x00000001或者0x000001。每个NALU包含1个字节的NAL header与若干整数字节的负荷数据EBSP构成。
NAL Header | EBSP | NAL Header | EBSP |
其中Nal header 占用1个直接,此字节低5位表示NALU类型。
(5)RGB:基色分量,它们的取值,分别从0–255.
(6)YUV(也可以记为YCBCr):主要用于优化彩色视频信号的传输,Y表示明亮度,uv表示色度(色调的饱和度)。如果只有Y数据,那么表示的图像就是黑白的。
使用YUV格式能够极大的去除冗余信息,人眼对亮点信息更加敏感,而对色度敏感度较低。所以,可以鸭是哦UV分量。因而,压缩的第一步就是先将RGB数据转换为YUV数据。对Y少压缩一些,对UV多压缩一点,就是为了平衡图像效果和压缩率。
Gray=R0.30+0.59G+0.11B;
—NV21与I420
YUV因为采样和数据排列方式的不同,又被分为不同的存储格式。一般的Android摄像头输出为NV21格式,而I420格式是绝大多数编解码器默认输入输出格式。
在这里插入图片描述
大小的计算:width
height3/2
(7)MediaCodec
MediaCodec类可用于访问Android底层的多媒体编解码器,例如,编码器/解码器组件。它是Android底层多媒体支持基础架构的一部分。
Android底层多媒体模块采用的是OpenMax框架,任何Android底层编解码模块的实现,都必须遵守OpenMax标准。Google官方默认提供了一系列的软件编解码器,而硬件编解码功能,则需要由芯片厂商依照OpenMax框架标准来完成。
软解码:优点(兼容性强,对系统版本要求比低,出错情况少;解码方面,软解码的色彩一般比硬解码的柔和;编码的可操作空间比较大,自由度高);缺点(CPU功耗较大;机器容易发热;功耗较高)。
硬解码:优点(功耗低,执行效率低);缺点
(不同型号的芯片对编解码的实现不同,兼容性不高;可控性差,依赖底层编解码实现)。
—主要的MediaCodec流程
配置编码参数(码率:数据传输时候但是为时间传递的数据位数,1kbps表示每秒有1000位数据;帧率:图像每秒的个数)—>创建编码器Mediacodec–>创建混合器MediaMuxer(将声音与图像压缩数据放入到MP4盒子)->开始编码。
在这里插入图片描述
2、应用行业–直播
(1).直播架构主要分为三块。第一块采集数据推流过程,包括对数据流编码,通过流媒体协议传输到服务器上。第二块就是服务端收到推流后,进行内容分发以及中间转存处理。最后一块就是播放器进行拉流操作。这其中不仅仅是播放音视频,还包括一些实时的特效等。
(2)RTMP协议
Real time messaging protocol(实时消息传输协议):基于TCP的应用层协议。
TCP/IP四层模型:应用层(HTTP\RTMP),传输层(TCP),网络层(IP),网络接口层(PPP)。
–LIBRTMP:c语言开源RTMP库,封装Socket建立TCP通信,并实现了RTMP数据的收发。正如OKHTTP封装了socker完成HTTP数据的收发。http://rtmpdump.mplayerhq.hu/
–RTMP视频流格式与FLV很相似,通过查看FLV的格式文档,就能够直到RTMP视频数据应该怎么拼接。RTMP重的数据就是由FLV的TAG中的数据区构成的。
关键帧: 0x17 0x01 0x00 0x00 0x00 4字节数据长度 h264裸数据
非关键帧:0x27 0x01 0x00 0x00 0x00 4字节数据长度 h264裸数据
sps与pps:0x17 0x00 0x000 0x00 0x00 sps+pps数据
在这里插入图片描述
–RTMP音频包数据:RTMP包中封装的音视频数据流,和FLV格式友好的兼容,封装音频和视频数据的方式是相同的,所以我们只需要按照FLV格式封装音视频即可。
解码信息:0XAF 0X00 解码数据
数据: 0XAF 0x01 音频数据
(因为上面的音频采用了AAC编解码。)
–RTMP调用的过程:RTMP_Alloc—RTMP_Init—RTMP_SetupURL—RTMP_EnableWrite—RTMP_Connect–RTMP_ConnectStream—RTMP_SendPacket—RTMP_free—RTMP_close.
(3)RTyMP直播实现流程
相机\话筒(AduioRecord\openSL)—视频\音频编码—RTMP视频包\音频包—RTMP_SendPacket
—音频采集—AudioRecord:AudioRecord初始化需要一个相关联的声音buffer,这个buffer主要是用来保存新的声音数据。表明一个AudioRecord对象还没有被读取的声音数据能存放的数据量。
采样率:录音设备在一秒钟内对声音信号的采样次数,采样频率越高声音的还原就越真实越自然。
–视频采集—MediaProjection:获取到MediaProjection后调用createVirtualDisplay创建虚拟显示器VirtualDisplay,既会将手机屏幕镜像到虚拟显示器上。 在CreatVirtualDisplay时,需要传递一个surface(画布),需要获取图像数据即可以从这个surface中读取。
3.OpenGL
(1)open graphics library:图形领域的工业标准,是一套跨编程语言、跨平台的、专业的图形编程(软件)接口。它用于二维、三维图像,是一个功能强大,调用方便的底层图形库。与硬件无关,可以在不同的平台如Windows、linux、mac、Android、IOS之间进行移植。因此,支持OpenGL的软件具有很好的移植性,可以获得非常广泛的引用。
openGL是一个跨平台的操作GPU的API,但是OpenGL需要本地视窗系统进行交互,这就需要一个中间控制层,EGL就是连接OpenGL ES和本地窗口系统的接口,引入EGL就是为了屏蔽不同平台的区别。
(2)openGL ES:针对手机\PDA和游戏主机等嵌入式设备而设计的OpenGL API子集。
JAVA/JNI
GLSurfaceView:继承自surfaceView,它内嵌的surface专门负责OpenGL渲染,管理Surface与EGL,允许自定义渲染器(render)。让渲染器在独立的线程里运行,和UI线程分离。支持按需渲染(on-demand)和连续渲染(continuous).
–openGL绘制流程:
在这里插入图片描述
—shader着色器
着色器(shader)是运行在GPU上的小程序。
定点着色器(vertex shader)如何处理顶点、法线等数据的小程序。
片元着色器(fragment shader)如何处理光、阴影、遮挡、环境等等对物体表面的影响,最终生成一副图像的小程序。
比如美图秀秀下载完成打开之后,就会有很多的
.fs或者*.vs为后缀的文档,主要就是用于着色的。
—实现流程
图片如何使用OpenGL显示:配置GLSurfaceView,初始化着色器,图片在OpenGL绘制;大眼睛功能实现。
在这里插入图片描述
----大眼特效的实现公式
在这里插入图片描述
在这里插入图片描述
4.交叉编译与CameraX预览
(1)交叉编译
X264是一个开源的H.264/MPEG-4 AVC视频编码函数库,是最好的视频编码器之一。
pwd当前目录
~/用户目录
–NDK R19里面已经将GCC移除了,之后使用的都是clang编译器。
—在shell脚本中
没有加export的变量,就相当于脚本的临时变量;
加了export的变量,就变成了当前会话的环境变量;
指令一行写不下的时候加
注释的写#
–本来直接修改configure.sh文件进行编译,但是有的第三方的函数库,可能不存在这个文件。包含的文件是:configure.ac(给autoconf使用的,autoconf(仅仅是Android当中的一个命令)能够根据ac与makefile.am文件来生成configure.shell文件。)
(2)camerax
camera1比较简单,camera2比较复杂,但是比较难用。camerax则是较为综合的一个。看官网文档学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值