javaCV入门指南系列:

JavaCV入门指南:序章(看完本章后,不想看原理的小伙伴可直接跳转到《快速上手篇》)

JavaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装了FFmpeg的音视频操作

JavaCV入门指南:调用opencv原生API和JavaCV是如何封装了opencv的图像处理操作

JavaCV入门指南:帧抓取器(FrameGrabber)的原理与应用

JavaCV入门指南:帧录制器/推流器(FrameRecorder)的原理与应用

JavaCV入门指南:帧过滤器(FrameFilter)的原理与应用

JavaCV入门指南:FrameConverter转换工具类及CanvasFrame图像预览工具类

《快速上手篇》(为了区别,单独划分):

JavaCV入门指南之快速上手篇:快速上手视频拉流、推流、录制文件、录屏、截图和编解码复用解复用等常用音视频处理操作

前言

从2016年6月开始写《javacv开发详解》系列,到而今的《javacv入门指南》,虽然仅隔了两年多时间,却也改变了很多东西。

比如我们的流媒体技术群从刚开始的一个群里两三个人发展到现在的5个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采集视频和音频,给这些音视频编解码,然后是用什么封装格式封装这些音视频数据,以及用什么协议传输,可能还要对视频里的图像进一步进行处理(这个属于图像处理范畴),流程大致如此(音频方面了解不多,大家见谅):

拉流(采集)--->图像像素数据/音频数据<---->编/解码 <---->音/视频帧<---->解封装/封装---->推流

举例:编解码过程(以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字节,图像有1920*1080个像素点,也就是说这张图像大小为1920*1080*3字节,显然数据太大了),可以这样理解,h264编码本质上就是一种图像数据压缩算法。

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

另外在直播应用中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分发),除此之外的收费的和一些不太友好的开源流媒体服务就不一一介绍了。

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

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

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

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

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

下一章:javaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装了FFmpeg的音视频操作?

支持eguid原创技术分享,欢迎“关注、点赞、收藏”一键三连!

javaCV入门指南:序章相关推荐

  1. javacv入门指南:序章_建立开放文化的循序渐进指南

    javacv入门指南:序章 当我们在2015年发布<开放组织>时,它激发了各种规模和规模的公司对"开放"文化真正含义的好奇心. 即使我有机会与其他公司谈论使用我们的产品 ...

  2. JavaCV入门指南:调用opencv原生API和JavaCV是如何封装了opencv的图像处理操作?

    JavaCV入门指南系列: JavaCV入门指南:序章(看完本章后,不想看原理的小伙伴可直接跳转到<快速上手篇>) JavaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装 ...

  3. javaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装了FFmpeg的音视频操作?

    JavaCV入门指南系列: JavaCV入门指南:序章(看完本章后,不想看原理的小伙伴可直接跳转到<快速上手篇>) JavaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装 ...

  4. Kali Linux 无线渗透测试入门指南 第九章 无线渗透测试方法论

    第十章 WPS 和 探针 作者:Vivek Ramachandran, Cameron Buchanan 译者:飞龙 协议:CC BY-NC-SA 4.0 太阳底下无新事. – 谚语 这一章由新的技巧 ...

  5. Kali Linux 无线渗透测试入门指南 第一章 配置无线环境

    第一章 配置无线环境 作者:Vivek Ramachandran, Cameron Buchanan 译者:飞龙 协议:CC BY-NC-SA 4.0 简介 如果我要在八个小时之内砍倒一棵树,我会花六 ...

  6. kail linux配置无线网络,Kali Linux 无线渗透测试入门指南 第一章 配置无线环境

    第一章 配置无线环境 作者:Vivek Ramachandran, Cameron Buchanan 译者:飞龙 简介 如果我要在八个小时之内砍倒一棵树,我会花六个小时来磨我的斧子. -- 亚伯拉罕· ...

  7. kail linux无线渗透测试只能,Kali Linux 无线渗透测试入门指南 第一章 配置无线环境...

    第一章 配置无线环境 作者:Vivek Ramachandran, Cameron Buchanan 译者:飞龙 简介 如果我要在八个小时之内砍倒一棵树,我会花六个小时来磨我的斧子. -- 亚伯拉罕· ...

  8. Symbian入门指南第一章:Symbian系统简介

    刚才发现一套写得很好的Symbian入门文章,但分散在不同的网站,现收集起来与大家共享. 原文地址:http://www.sf.org.cn/Article/lumen/200508/1.html 1 ...

  9. 苹果脚本入门指南 第一章-苹果编程语言介绍和编程软件打开方法及界面介绍

    苹果自带的编程软件叫做:脚本编辑器,支持AppleScript和JavaScript语言.当然,这本书讲的是AppleScript语言,也就是苹果的编程语言. AppleScript是苹果公司开发的一 ...

最新文章

  1. Lungo transition in reverse direction. 反转效果
  2. sortable 拖拽时互换目标的位置_报表如何实现行列互换效果?
  3. 介绍两款Docker可视化工具
  4. JavaScript Iframe富文本编辑器中的光标定位
  5. 1-3移动均线交叉策略2
  6. java中sort的cmp_快速排序(cmp函数详解)
  7. 三维工艺设计系统SVMAN
  8. D7控件\dw_cd_VirtualTreeview_v4.5.2\Demos\Advanced---TVirtualStringTree用法
  9. 小程序思维导图(基础图)
  10. PMP资料,考过的学员整理分享
  11. reviewboard mysql_ReviewBoard安装配置
  12. 计算机exsl表f4代表锁定,Excel中F4技巧,相对引用、绝对引用和混合引用
  13. XJTU 新闻英语阅读unit1作业答案
  14. 【前端库】moment.js 时间库
  15. 最简单荣耀手机如何不用Root激活Xposed框架
  16. BIOS知识枝桠——UEFI Driver
  17. linux mc服务器 mod_官方minecraft服务器简单开服方法[linux][minecraft1.5.2]
  18. windows10 访问网页的时候提示找不到服务器IP地址如何处理
  19. unity3d培训_003
  20. 分享一下自己新入职前端工作三个月的心得

热门文章

  1. springboot整合redis后整合es,报错Failed to instantiate [org.elasticsearch.client.transport.TransportClient]
  2. 2023校招美团第二次笔试
  3. 简书PC端私密文章放在哪?
  4. 电子漫画系列更新9张美图,共计47张,收藏收藏!
  5. 打车应用生死未卜 嘀嘀或傍上腾讯
  6. html分享到微信朋友圈代码,微信分享给朋友及朋友圈JS代码
  7. 一个葫芦娃的小程序,爷青回!
  8. Xgboost如何处理缺失值
  9. 编写Java程序,模拟教练员和运动员出国比赛场景,其中运动员包括乒乓球运动员和篮球运动员。教练员包括乒乓球教练和篮球教练。为了方便出国交流,根乒乓球相关的人员都需要学习英语。
  10. 第十弹:网络公开课,免费学习资源,2020.07.05更新