欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA音视频解决方案----音视频基础知识

程序员文章站 2022-07-01 17:39:44
...

序言

公司现在在做汽车终端的平台,需要了解交通部808,1078的终端协议.  尤其是1078是关于音视频的协议.故此开始入坑java的音视频解决方案.本系列文章涉及一个完整的音视频服务搭建.

 

Java音视频中间库

这个肯定是站在巨人的肩上.我们会使用JAVACV来处理所有的视频,音频信息.  

 

音视频基础知识

1、图像像素格式与图片封装格式

       图像像素格式(简称像素格式),一般指的是没有经过编码的按照原始像素排列的数据。举个栗子,一个完整图像的像素排列一般是这样的(以4*4像素的rgb像素格式为例):

rgbrgbrgbrgb

rgbrgbrgbrgb

rgbrgbrgbrgb

rgbrgbrgbrgb

       当然我们存储的时候一般使用一维数组来存这些数据,所以排列顺序就变成这样:rgbrgbrgbrgb.......以此类推。

       图片封装格式指的我们日常见到的png,jpg,bmp,gif等等图片格式,其中bmp是无损格式,里面的数据格式就是图片头信息加上rgb排列的像素数据,png/jpg这些都是有损压缩格式,但是压缩比还是很高的,为什么要压缩下面会讲到。(压缩就是编码[email protected])
 

2、图像与视频帧

       图像像素数据指的是yuv、rgb,rbga,bgr,gbra等图像像素格式,经过编码后才是视频帧。比如我们常见的h264编码,编码其实就是对图像像素数据的压缩,(以rgb为例,假如当前图像像素尺寸为1920*1080,,每种颜色用一个字节表示,也就是说每个像素点有红绿蓝三色共3字节,图像有1920*1080个像素点,也就是说这张图像大小为1920*1080*3字节,显然数据太大了),可以这样理解,h264编码本质上就是一种图像数据压缩算法。(一个像素为啥占用3个字节,因为红绿蓝三原色[email protected])

       视频帧中常常提到的I帧,B帧和P帧指的是什么?i帧也叫关键帧,实际上就是一张完整的静态图像,而B帧和P帧只是用来记录画面的运动矢量等非图像数据,B/P帧都需要依赖i帧才能够正确解码出完整图像(有损的图像画面)。在实际应用中各种视频源中很少使用B帧,原因是虽然使用大量B帧可以提高压缩率,但也会消耗更多的硬件性能,所以大多数情况下的视频源都以i帧(关键帧)和大量P帧为主。

       另外在直播应用中i帧间隔会很低,这样能够更快的显示首帧画面(B/P帧需要i帧才能够解码),但是这样也增加了传输的数据量,因为一个i帧通常会很大。

3、编码与封装

     编码上面已经讲了,是一种压缩算法;那么封装格式又是什么呢,封装格式就是我们日常见到的视频文件了,比如mp4,avi,mkv,flv等等等,按照每种封装格式的规范把视频帧和音频按照一定顺序存起来就成我们日常看到的视频文件了,这些封装格式一般都会包含一些头/尾标识和一些视频描述信息,这样播放器读取视频文件的时候就知道该怎么播放这些视频文件了(可以把封装格式理解成收纳箱,上面贴着小纸条说明里面放了哪些东西)。压缩图片格式也可以参考视频编码格式,原理都一样,都是对图像数据做有损/无损压缩。
 

4、转封装与转码

       什么是转封装?为什么转封装比转码消耗更少?为什么转封装无法改动视频尺寸?

       先举个栗子:假设视频格式(mp4,flv,avi等)是盒子,里面的视频编码数据(h264,hevc)是苹果,我们把这个苹果从盒子里取出来放到另一个盒子里,盒子是变了,苹果是没有变动的,因此视频相关的尺寸数据是没有改动的,这个就是转封装的概念。有了上面这个例子,我们可以把“转码”理解为:把这个盒子里的苹果(hevc)拿出来削皮切块后再加工成樱桃(h264)后再装到另一个盒子里,多了一步对苹果(hevc)转换为樱桃(h264)的操作,自然比直接把苹果拿到另一个盒子(转封装)要消耗更多机器性能

5、音/视频源

      音/视频源可以是视频文件、音频文件,流媒体源,设备等等。

       比如我们要看电脑或手机摄像头视频,就得采集设备的图像数据(从源设备采集到的是像素数据,一般是bgr或者rgb像素数据)如果是某些厂商的商用摄像机,可能会支持rtsp/rtmp协议,要采集声音呢,就得采集录音/话筒设备里面的数据(一般是pcm采样数据)。
 

6、流媒体协议

rtsp协议栈,rtmp协议栈,hls,http-flv(理论上讲这个flv不能算是流媒体协议,它只是个无限大的flv文件)等等。

例如rtmp,对编码后的音视频帧,要对其进行封装成flv进行传输。(说到底这些协议原理上依然是建立在tcp/udp基础上的应用层传输协议。[email protected])  部标的1078协议要求终端设备的推流协议是参考的rtp协议.后面我们写代码去处理它.

 

7、流媒体服务

 流媒体服务就是接受rtsp,rtmp的推流服务器,并且能接收拉流.后面我们会搭建一个rtmp的流服务器.

 

 

 

相关标签: 音视频