javaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装了FFmpeg的音视频操作?
通过“javaCV入门指南:序章 ”大家知道了处理音视频流媒体的前置基本知识,基本知识包含了像素格式、编解码格式、封装格式、网络协议以及一些音视频专业名词,专业名词不会赘述,自行搜索即可。
本章将正式开始javaCV之旅,先看一下官方文档里的介绍
JavaCV是计算机视觉领域的开发人员(OpenCV、FFmpeg、libdc1394、PGR FlyCapture、OpenKinect、li.lsense、CL PS3 Eye Driver、videoInput、ARToolKitPlus、flandmark、Leptonica和Tesseract)常用库的JavaCPP预置的包装器,并提供实用的程序类使它们的功能更容易在Java平台上使用,包括Android。
JavaCV还提供了硬件加速的全屏图像显示(CanvasFrame和GLCanvasFrame)、在多核(并行)上并行执行代码的简便方法、照相机和投影机的用户友好的几何和颜色校准(GeometricCalibrator,ProCamometricCalibrato)r,ProCamColorCalibrator),特征点的检测和匹配(ObjectFinder),一组用于实现投影仪-照相机系统的直接图像对齐的类(主要是GNImageAligner、ProjectiveTransformer、ProjectiveColorTransformer、ProCamTransformer和ReflectanceInitializer),一个blob分析包(BLUB),以及JavaCV类中的各种功能。其中一些类还具有OpenCL和OpenGL的对应类,它们的名称以CL结尾或以GL开始,即:JavaCVCL、GLCanvasFrame等。
要了解如何使用API,因为文档目前缺乏,请参考下面的示例用法部分以及示例程序,包括两个用于Android(FACEPREVIEW.Java和ReordActudio.java)的示例程序,它们也在示例目录中找到。您可能还发现参考ProCamCalib和ProCamTracker的源代码以及从OpenCV2 Cookbook和相关联的wiki页面移植的示例很有用。
请随时告诉我任何更新或修复你的代码,使我可以将它们集成到下一个版本。谢谢您!如果您遇到软件问题,请随时在邮件列表上提问。我相信这还远远不够完美…(我觉得这个最后一段才是最重要的,所以保留了这一段原话)
既然知道javaCV封装了这么多库,也不啰嗦了,直接开始吧。
支持eguid原创文章,欢迎一起交流讨论:
流媒体技术③群: 556722677(①②群已满,请加③群)
流媒体技术①群: 371249677(已满)
一、什么是JavaCPP
大家知道FFmpeg是C语言中著名的音视频库(注意,不是c++。使用c++调用ffmpeg库的性能损失与Java方式调用损耗相差并不大)。
JavaCV利用JavaCPP在FFmpeg和Java之间构建了桥梁,我们通过这个桥梁可以方便的调用FFmpeg,当然这并不是没有损失的,性能损失暂且不提,最主要问题在于调用ffmpeg之于jvm是native方法,所以通过ffmpeg创建的结构体实例与常量、方法等等都是使用堆外内存,都需要像C那样手动的释放这些资源(jvm并不会帮你回收这部分),以此来保证不会发生内存溢出/泄露等风险。
Javapp在Java内部提供了对本地C++的高效访问,这与一些C/C++编译器与汇编语言交互的方式不同。不需要发明新的语言,比如SWIG、SIP、C++、CLI、Cython或Rython。相反,类似于CPpyy为Python所做的努力,它利用了Java和C++之间的语法和语义相似性。在引擎盖下,它使用JNI,因此除了Java、SE和RoboVM(指令)之外,它还适用于Java SE的所有实现...
详细描述请参考:https://github.com/bytedeco/javacpp
二、javaCPP直接调用FFmpeg的API
我们通过《视频拉流解码成YUVJ420P,并保存为jpg图片》作为实例来阐述,实例地址:
https://blog.csdn.net/eguid_1/article/details/81369055
这部分内容主要是如何调用FFmpeg的API,本系列作为JavaCV入门不会讲解FFmpeg的具体用法,如果想要深入学习FFmpeg部分,可以选择通过查看FFmpeg的API手册ffmpeg.org,或者访问雷霄骅的博客详细学习FFmpeg的使用。
三、JavaCV是如何封装了FFmpeg的音视频操作?
JavaCV通过JavaCPP调用了FFmpeg,并且对FFmpeg复杂的操作进行了封装,把视频处理分成了两大类:“帧抓取器”(FrameGrabber)和“帧录制器”(又叫“帧推流器”,FrameRecorder)以及用于存放音视频帧的Frame(FrameFilter暂且不提)。
整体结构如下:
视频源---->帧抓取器(FrameGabber) ---->抓取视频帧(Frame)---->帧录制器(FrameRecorder)---->推流/录制---->流媒体服务/录像文件
1、帧抓取器(FrameGrabber)
封装了FFmpeg的检索流信息,自动猜测视频解码格式,音视频解码等具体API,并把解码完的像素数据(可配置像素格式)或音频数据保存到Frame中返回。
2、帧录制器/推流器(FrameRecorder)
封装了FFmpeg的音视频编码操作和封装操作,把传参过来的Frame中的数据取出并进行编码、封装、发送等操作流程。
3、帧(Frame)
用于存放音视频帧(图像像素和音频采样数据,如果没有配置FrameGrabber的像素格式和音频格式,那么默认解码后的视频格式是yuv420j,音频则是pcm采样数据)
下一章:帧抓取器(FrameGrabber)的原理与应用
javaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装了FFmpeg的音视频操作?的更多相关文章
- javaCV入门指南:序章
前言 从2016年6月开始写<javacv开发详解>系列,到而今的<javacv入门指南>,虽然仅隔了两年多时间,却也改变了很多东西. 比如我们的流媒体技术群从刚开始的两三个人 ...
- cordov vue项目中调用手机原生api
cordova不仅可以把vue项目打包成app,还可以让vue借助cordova调用手机原生的api 比如拍照 比如图片上传 比如定位 比如扫描二维码 比如支付等等 Vue Cordova教程-Vue ...
- 【转】NativeScript的工作原理:用JavaScript调用原生API实现跨平台
原文:https://blog.csdn.net/qq_21298703/article/details/44982547 -------------------------------------- ...
- C#进程调用FFmpeg操作音视频
项目背景 因为公司需要对音视频做一些操作,比如说对系统用户的发音和背景视频进行合成,以及对多个音视频之间进行合成,还有就是在指定的源背景音频中按照对应的规则在视频的多少秒钟内插入一段客户发音等一些复杂 ...
- yii2实战教程之新手入门指南-简单博客管理系统
作者:白狼 出处:http://www.manks.top/document/easy_blog_manage_system.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文 ...
- Web API 入门指南 - 闲话安全
Web API入门指南有些朋友回复问了些安全方面的问题,安全方面可以写的东西实在太多了,这里尽量围绕着Web API的安全性来展开,介绍一些安全的基本概念,常见安全隐患.相关的防御技巧以及Web AP ...
- AngularJS快速入门指南15:API
thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...
- Web API入门指南(安全)转
安全检测的工具站点:https://www.owasp.org/index.php/Category:Vulnerability_Scanning_Tools Web API入门指南有些朋友回复问了些 ...
- Web API 入门指南
Web API 入门指南 - 闲话安全2013-09-21 18:56 by 微软互联网开发支持, 231 阅读, 3 评论, 收藏, 编辑 Web API入门指南有些朋友回复问了些安全方面的问题,安 ...
随机推荐
- 数据库sql的join多表
摘录文章 SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据.注意,join后的数据记录数不一定就是左或右表的简单连接,图表只代表集合关系,在数量上并不准确,如这个条件后结果, ...
- caffe学习--cifar10学习-ubuntu16.04-gtx650tiboost--1g--03--20171103
classification ./examples/cifar10/cifar10_full.prototxt ./examples/cifar10/cifar10_full_iter_70000.c ...
- HTML5 2D平台游戏开发#1
在Web领域通常会用到一组sprite来展示动画,这类动画从开始到结束往往不会有用户参与,即用户很少会用控制器(例如鼠标.键盘.手柄.操作杆等输入设备)进行操作.但在游戏领域,sprite动画与控制器 ...
- struts2 Eclipse 中集成strust2开发框架实例
下面通过建立一个小的实例具体来说明Eclipse 集成struts2,以下实例采用的为 struts2 版本为 struts2 2.2.3.1 为应用. 1. 下载struts2的开发包 第一步: 在 ...
- iOS开发 僵尸调试
本文转载至 http://blog.sina.com.cn/s/blog_a843a8850101dxin.html 引自:http://blog.csdn.net/likendsl/articl ...
- TP框架---thinkphp使用ajax
thinkphp使用ajax和之前使用ajax的方法一样,不同点在于之前的ajax中的url指向了一个页面,而thinkphp里面的url需要指向一个操作方法. 一.thinkphp使用ajax返回数 ...
- EasyPlayer RTSP Android安卓播放器实现视频源快速切换
EasyPlayer现在支持多视频源快速切换了,我们介绍一下是如何实现的. 这个需求通常应用在一个客户端需要查看多个视频源的情况,比如多个监控场景轮播. 由于EasyPlayer的播放端已经放在Fra ...
- Hibernate连接池设置
在公司第一次做项目放到服务器上测试,发现每隔一段时间不用数据库就连接不上了(以前学过连接池,很久没用就忘了),在myeclipse上的时候没发现,网上搜索才发现是hibernate连接池配置问题. 1 ...
- pjax + tp5,实现局部无刷新返回数据
文件1:\application\admin\controller\Setting.php 最后一句代码:要fetch原页面 <?php namespace app\admin\controll ...
- centos7 安装php
http://blog.csdn.net/zhaozuosui/article/details/48394409