javaCV入门指南:序章
前言
从2016年6月开始写《javacv开发详解》系列,到而今的《javacv入门指南》,虽然仅隔了两年多时间,却也改变了很多东西。
比如我们的流媒体技术群从刚开始的两三个人发展到现在的三个500人群。又比如博主刚开始也想放弃,期间自行脑洞内心挣扎的场面也就不详说了,结果是现在还在坚持更新博客。当然这期间离不开群里小伙伴们一直以来的陪伴和支持,感谢大家一起默默为java流媒体技术踩坑,踩的多了也就真的成了路(也可能踩成深坑 )。另外感谢雷霄骅博士的ffmpeg博客,给予博主很大帮助,2016年刚开始接触ffmpeg就忽闻博士去世,甚为感慨,大家且行且珍惜吧。
以前从来不觉得java可以做流媒体、音视频编解码这些,直到现在,顶多说java做流媒体是非主流。业界广泛应用的librtmp、live555、ffmpeg也都是c/c++的库,刚开始也确实尝试过使用jni方式调ffmpeg,发现做起来吃力不讨好,后来在github发现了新大陆:javaCV。
有,总比没有强。虽然连个API文档都没有,通过github项目描述的那可怜的几个字勉勉强强知道它对ffmpeg、opencv等等等十几个库做了封装,用javacpp方式为fmpeg、opencv等库编译了各个系统环境的包方便跨平台调用。
一些题外话
踩坑到今天,可能还会有许多人踌躇疑惑javacv除了可以在音视频和图像处理这块稍微可以施展手脚外,还可以做什么?除了这些,在应对各种纷繁复杂的流媒体协议(rtp/rtsp/rtmp/flv/hls等等)也不在话下,当然一些小众和国产协议(比如sip/gb28181/jtt178等)可能需要依赖netty/mina等网络库来实现,编解码上结合javaCV,性能上也已经没有什么顾虑。另外在深度学习领域,deeplearning4j借助javaCV的东风令java在深度学习领域也同样引领风骚。
本系列将结合《javacv开发详解》系列作为实战教程,结合实例,力求简单易懂,快速上手。
一、老生常谈
javaCV能做什么,既然是"CV"大法,那自然是计算机视觉领域的库,诸如音视频、流媒体、图像处理、深度学习、机器学习、人工智能等等等(现在流行后面这三个,写上去应该能唬住不少人,deeplearning晓得不,里面一堆的javaCV库没发现吗)。
二、入门基础
以上全是些空话,我们无非就是要用javaCV采集视频和音频,给这些音视频编解码,然后是用什么封装格式封装这些音视频数据,以及用什么协议传输,可能还要对视频里的图像进一步进行处理(这个属于图像处理范畴),流程大致如此(音频方面了解不多,大家见谅):
拉流(采集)--->图像像素数据/音频数据<---->编/解码 <---->音/视频帧<---->解封装/封装---->推流
1、图像像素格式与图片封装格式
图像像素格式(简称像素格式),一般指的是没有经过编码的按照原始像素排列的数据。
举个栗子,一个完整图像的像素排列一般是这样的(以4*4像素的rgb像素格式为例):
rgbrgbrgbrgb
rgbrgbrgbrgb
rgbrgbrgbrgb
rgbrgbrgbrgb
当然我们存储的时候一般使用一维数组来存这些数据,所以排列顺序就变成这样:rgbrgbrgbrgb.......以此类推。
图片封装格式指的我们日常见到的png,jpg,bmp,gif等等图片格式,其中bmp是无损格式,里面的数据格式就是图片头信息加上rgb排列的像素数据,png/jpg这些都是有损压缩格式,但是压缩比还是很高的,为什么要压缩下面会讲到。
2、图像?视频帧?傻傻分不清楚
图像像素数据指的是yuv、rgb,rbga,bgr,gbra等图像像素格式,经过编码后才是视频帧。比如我们常见的h264编码,编码其实就是对图像像素数据的压缩,(以rgb为例,假如当前图像像素尺寸为1920*1080,,每种颜色用一个字节表示,也就是说每个像素点有红绿蓝三色共3字节,图像有1920*1080个像素点,也就是说这张图像大小为1920*1080*3字节,显然数据太大了),可以这样理解,h264编码本质上就是一种图像数据压缩算法。
3、编码?封装?傻傻分不清楚
编码上面已经讲了,是一种压缩算法;那么封装格式又是什么呢,封装格式就是我们日常见到的视频文件了,比如mp4,avi,mkv,flv等等等,按照每种封装格式的规范把视频帧和音频按照一定顺序存起来就成我们日常看到的视频文件了,这些封装格式一般都会包含一些头/尾标识和一些视频描述信息,这样播放器读取视频文件的时候就知道该怎么播放这些视频文件了(可以把封装格式理解成收纳箱,上面贴着小纸条说明里面放了哪些东西)。
压缩图片格式也可以参考视频编码格式,原理都一样,都是对图像数据做有损/无损压缩。
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分发),除此之外的收费的和一些不太友好的开源流媒体服务就不一一介绍了。
下一章:javaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装了FFmpeg的音视频操作?
支持eguid原创
javaCV入门指南:序章的更多相关文章
- javaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装了FFmpeg的音视频操作?
通过"javaCV入门指南:序章 "大家知道了处理音视频流媒体的前置基本知识,基本知识包含了像素格式.编解码格式.封装格式.网络协议以及一些音视频专业名词,专业名词不会赘述,自行搜 ...
- Gradle用户指南(章9:Groovy快速入门)
Gradle用户指南(章9:Groovy快速入门) 你可以使用groovy插件来构建groovy项目.这个插件继承了java插件的功能,且扩展了groovy编译.你的项目可以包含groovy代码.ja ...
- Ext JS 6学习文档–第1章–ExtJS入门指南
Ext JS 入门指南 前言 本来我是打算自己写一个系列的 ExtJS 6 学习笔记的,因为 ExtJS 6 目前的中文学习资料还很少.google 搜索资料时找到了一本国外牛人写的关于 ExtJS ...
- 信号与系统实验序章0——MATLAB基础命令入门
本次开启新的系列,关于用Matlab实现常见信号和函数的生成和变换. 同时如果没有MATLAB基础,那么可以跟着本文一步一步学习Matlab的相关操作,本文旨在记录在信号与系统课程中MATLAB的学习 ...
- 第3章 Spring Boot 入门指南
Part II. 入门指南 如果你刚刚开始使用Spring Boot,这是你的一部分内容! 在这里我们将会回答一些基本的“what?”, “how?” 和 “why?”的问题. 在这里你会找到一个详细 ...
- [转] Clojure 快速入门指南:1/3
[From] http://huangz.iteye.com/blog/1325228 导读 本文的目标是为熟悉 Ruby.Python或者其他类似语言.并对 Lisp 或者函数式编程有一定程度了解的 ...
- 一起学微软Power BI系列-官方文档-入门指南(1)Power BI初步介绍
我们在前一篇文章微软新神器-Power BI,一个简单易用,还用得起的BI产品中,我们初步介绍了Power BI的基本知识.由于Power BI是去年开始微软新发布的一个产品,虽然已经可以企业级应用, ...
- 一起学微软Power BI系列-官方文档-入门指南(2)获取源数据
我们在文章: 一起学微软Power BI系列-官方文档-入门指南(1)Power BI初步介绍中,我们介绍了官方入门文档的第一章.今天继续给大家介绍官方文档中,如何获取数据源的相关内容.虽然是英文,但 ...
- 一起学微软Power BI系列-官方文档-入门指南(3)Power BI建模
我们前2篇文章:一起学微软Power BI系列-官方文档-入门指南(1)Power BI初步介绍 和一起学微软Power BI系列-官方文档-入门指南(2)获取源数据 中,我们介绍了官方入门文档与获取 ...
随机推荐
- document.readyState和xmlhttp.onreadystatechange
document.readyState的几种状态 0-uninitialized:XML 对象被产生,但没有任何文件被加载. 1-loading:加载程序进行中,但文件尚未开始解析. 2-loaded ...
- 浅谈 Fork/Join
fork/join的java7新添加的功能,能够把它理解成一个并发框架. 我们通过fork/join能将一个可分解的大任务.分解成多个子任务同步运行.运行完成后,在将各子任务的结果进行合并,得到终于的 ...
- modelsim-altera
一. 1. Go to the menu Tools > Options. 2. In the “General” category, select “EDA Tool Options”. ...
- linux 跟踪工具
strace工具,进程诊断.排错.跟踪系统调用和信号量 每行输出都是一个系统调用,包括函数和返回值. strace是Linux环境下的一款程序调试工具,用来监察一个应用程序所使用的系统调用及它所接收的 ...
- mongo的碎片整理
由于业务原因,需要将过期数据删除,但有一个问题出现了,频繁删除数据之后,会产生很多磁盘碎片,这些碎片如果没有被重复利用, 进而会影响查询性能(表查询时仍然会扫描这部分删除数据的磁盘空间块),随需要处理 ...
- 小程序踩坑之不同屏幕下动态改变translate值
案例还原 小程序做一个进度条,可以通过拽转控制进度 那么肯定有一个进度条,不过小程序自己会做适配宽高 6s下这个div的width 是250 6splus就是276 但是问题来了,我拖拽用的是tran ...
- TP 框架 如果去掉表前缀
#jd_admin_abc 去掉前缀 C('DB_PREFIX')=获取前缀 结果为admin_abc $table_Name=str_replace(C('DB_PREFIX'), '', $tab ...
- java中的 equals + hashCode
[0]README 0.1)本文转自 core java volume 1, 旨在理清 equals + hashCode方法: [1]equals方法 1.1) Object中的 equals 方法 ...
- Linux NAT网络连接权威指南
[1]准备工作,写在前面 1.1)检查服务(cmd>>services.msc,我用的是VM) 1.2)确保Vmnet8 连接处于启动状态 + 获取ipv4(ipv6)地址 (在网络连接不 ...
- C#高级编程 第十五章 反射
(二)自定义特性 使自定义特性非常强大的因素时使用反射,代码可以读取这些元数据,使用它们在运行期间作出决策. 1.编写自定义特性 定义一个FieldName特性: [AttributeUsage(At ...