首页 > 编程知识 正文

实现流媒体的关键技术是,java搭建流媒体服务器

时间:2023-05-05 15:06:41 阅读:43926 作者:4164

背景介绍大数据的离线内容在这几年也变多了,今年想做实时大数据处理,包括实时收集、实时处理、实时分析、之后的实时推荐等目前公司正在对接几个海康的相机。 正好利用这个机会学习和整理相关的采集知识点,只用于入门。

本人的文章内容也在前人的指导下实践,在让xndz能够阅读的同时,为自己沉淀内容。

什么是javacv? javacv技术堆栈可以做什么? 我相信,在一个老生常谈的问题上,只要大家用各种搜索引擎搜索,就应该知道能做什么。

首先是音视频处理、编解码、打包。 可以使用ffmpeg的javacv就可以了。 他们没有任何区别。

而且是图像处理和图像识别。 可以使用opencv图像检测识别和tessert字符识别。 他们也没有任何区别。 但是,因为javacv只是让jni跨平台,所以不需要自己封装。

剩下的包括矩阵计算、深度学习等在内的内容目前还不太清楚,所以不一一说明。 接下来有精力和时间的话,也会进行内容的共享。

javacv技术堆栈的应用场景很多人都很好奇,现在javacv在哪些应用场景中比较常用?

javacv跨平台不仅可以在服务器和客户端计算机(如windows、linux和macos )上运行,还可以在各种嵌入式主板上运行。

嵌入式领域:

很多人将javacv用于草莓馅饼等基于arm芯片的主板上,使用外置摄像机或音频设备就可以进行音视频升级、图像处理、图像识别等操作。

流媒体:

利用javacv流媒体的优势,轻松收集音视频、进行流媒体、编解码、打包等操作。

深度学习:

深度学习4 j主要利用java大数据能力进行深度学习,虽然这方面鲜为人知,但它确实很有名。

人脸检测识别:

在网上搜索到javacv最多的文章是关于人脸检测识别,javacv官网的首页demo是人脸检测的一个例子,opencv能做什么就做什么。

文本识别:

使用Tesseract-OCR,可以方便地对字符库进行培训和字符识别。 利用javacv特有的流媒体属性和嵌入式开发特性,还可以实现摄像头文字识别、视频图像文字识别等场景。

流媒体是什么? 流媒体的入门介绍是什么? 如上所述,我们用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等是有损压缩形式。 压缩图像可以有效地节省硬盘空间。

2、图片? 视频帧? 傻瓜不清楚

图像数据是图像像素格式,如yuv、rgb、rbga、bgr和gbra,只有在编码后才成为视频帧。 例如,我们常见的h264编码实际上是对图像像素数据的压缩。 (以rgb为例,如果当前图像的像素大小为1920*1080,则每个颜色都用一个字节表示。 即,各像素点为红、绿、蓝3色,共计3字节,图像为1920*1080像素点,该图像的尺寸为1920*1080*

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

ng>

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

3、编码?封装?傻傻分不清楚

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

压缩图片格式也可以参考视频编码格式,原理都一样,都是对图像数据做有损/无损压缩。

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

先举个栗子:假设视频格式(mp4,flv,avi等)是盒子,里面的视频编码数据(h264,hevc)是苹果,我们把这个苹果从盒子里取出来放到另一个盒子里,盒子是变了,苹果是没有变动的,因此视频相关的尺寸数据是没有改动的,这个就是转封装的概念。

有了上面这个例子,我们可以把“转码”理解为:把这个盒子里的苹果(hevc)拿出来削皮切块后再加工成樱桃(h264)后再装到另一个盒子里,多了一步对苹果(hevc)转换为樱桃(h264)的操作,自然比直接把苹果拿到另一个盒子(转封装)要消耗更多机器性能。

4、音/视频源

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

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

 

5、流媒体协议

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

例如rtmp,对编码后的音视频帧,要对其进行封装成flv进行传输。

补充:说到底这些协议原理上依然是建立在tcp/udp基础上的应用层传输协议。

 

6、流媒体服务

支持音视频存储分发的服务都可以叫流媒体服务。

比如常见的srs(开源的rtmp流媒体服务,当然它支持rtmp/hls/http-flv的分发)和nginx(通过安装模块可以支持rtmp,hls,http-flv分发),除此之外的收费的和一些不太友好的开源流媒体服务就不一一介绍了。

关于nginx搭建流媒体服务器的文章已经在前面整理好了,大家可以参考这篇:从零开始搭建流媒体服务器

 

鉴于很多小伙伴还是比较混乱,为了方便理解,放一xfdxg的音视频像素、编码、格式和协议及图片知识概念关系图:

流媒体协议层:rtsp、rtmp、hls

封装格式层:flv、ps、ts、图片格式(jpeg,png,gif)

音/视频编解码层:h264(AVC)、h265(HEVC)、h266(VVC)、AAC、PCMA

图像像素格式和音频采样层:YUV、RGB、RGBA等和PCM采样 

 

基础的介绍就先讲解这些,如有问题大家可以相互探讨,本人也是xndz一枚,后续将从实战代码方面进行整理,确保大家可以实际上手!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。