原文:https://blog.csdn.net/eguid_1/article/details/82875343
javaCV对ffmpeg,opencv等十几个库做了封装,用javacpp方式为fmpeg,opencv等库编译了各个系统环境的包方便跨平台调用。
使用javacv可以采集视频和音频,给这些音视频编解码,然后是用封装格式封装这些音视频数据,以及用什么协议传输,可能还要对视频里的图像进一步进行处理,流程大概如此:
拉流(采集)-->图像像素数据/音频数据<----->编解码<---->音视频帧<---->解封装-----<-->推流
举例:编码过程(以hevc编码的rtsp转rtmp/flv为例,无音频数据):
rtsp流----拉流解复用--->h265(hevc)----解码---->yuv像素数据---编码----h264-----封装推流----->rtmp/flv
1,图像像素格式与图片封装格式
图像像素格式(简称像素格式),一般指的是没有经过编码的按照原始像素排列的数据。
举个例子,一个完整图像的像素排列一般是这样的(以4*4像素的rgb像素格式为例):
rgbrgbrgbrgb
rgbrgbrgbrgb
rgbrgbrgbrgb
rgbrgbrgbrgb
当然我们存储的时候一般使用的一维数组来存这些数据,所以排列顺序就变成rgbrgbrgbrgb.....以此类推。
图片封装格式指的是我们日常见到的png,jpg,bmp,gif等等图片格式,其中bmp是无损格式且不压缩,里面的数据格式就是图片头信息加上rgb排列的像素数据;png是无损压缩格式;jpg/gif等都是有损压缩格式。压缩图片可以有效节省更多的硬盘空间。
-
图像像素数据指的是yuv,rgb,rbga,bgr,gbra等图像像素格式,经过编码后才是视频帧。比如我们常见的h264编码,编码其实就是对图像像素数据的压缩,(以rgb为例,假如当前图像像素尺寸为19201080,每种颜色用一个字节表示,也就是说每个像素点有红绿蓝三色共三字节,图像有19201080个像素点,也就是说这张图像大小为192010803字节,显然数据太大了),可以这样理解,h264编码本质上就是一种图像数据压缩算法。
-
封装格式就是我们常见的视频文件,比如mp4,avi,mkv,flv等,按照每种封装格式的规范把视频帧和音频按照一定顺序存起来就是我们日常看到的视频文件,这些封装格式一般都会包含一些头/尾标识和一些视频描述信息,这样播放器读取视频文件的时候就知道该怎么播放这些视频文件了(可以把封装格式理解为收纳箱,上面贴着小纸条说明里面放了那些东西)
压缩图片格式也可以参照视屏编码格式,原理都一样,都是对图像数据做有损或者无损的压缩。 -
音/视频源可以是视频文件,音频文件,流媒体源,设备等等.
比如我们要看到电脑或手机摄像头视频,就是采集设备的图像数据(从源设备采集到的是像素数据,一般是bgr或者rgb像素数据)如果是某些厂商的商用摄像机,可能会支持rtsp/rtmp协议,要采集声音就得采集录音/话筒设备里的数据(一般是pcm采集数据)。 -
流媒体协议
rtsp协议,rtmp协议栈,hls,http-flv(理论上这个flv不能算流媒体协议,他只是个无限大的flv文件)等等。
例如: rtmp对编码后的音视频帧,要对其进行封装成flv进行传输。
补充: 说到底这些协议原理上依然都是建立在tcp/upd基础上的应用层传输协议。
6,流媒体服务
支持音视频存储分发的服务都可以叫做流媒体服务。
比如常见的srs(开源的rtmp流媒体服务,当然他支持rtmp/hls/http-flv的分发)和nginx(通过安装模块可以支持rtmp,hls,http-flv分发),除此之外的收费的和一些不太友好的开源流媒体服务就不说了。
image.png
流媒体协议层: rtsp,rtmp,hls
封装格式层:flv,ps,ts图片格式(jpeg,png,gif)
音/视频编码层: h264(AVC),h265(HEVC),h266(vvc),AAC,PCMA
图像像素格式和音频采样层:YUV,RGB,RGBA等和pcm采样。
网友评论