欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA音视频解决方案----JavaCV--FFmpeg

程序员文章站 2022-07-01 17:45:04
...

序言

做好了前面的准备工作后,开始进入音视频处理的java 相关工具介绍

JavaCV

        javacv是对各种常用计算机视觉库的封装后的一组jar包,其中封装了ffmpeg、OpenCV、libdc1394、OpenKinect、videoInput和ARToolKitPlus等计算机视觉编程人员常用库的接口,可以通过其中的utility类方便的在包括Android在内的Java平台上调用这些接口。其中使用最多的应该就是ffmpeg了。
 

JavaCPP

      FFmpeg是C语言中著名的音视频库(注意,不是c++。使用c++调用ffmpeg库的性能损失与Java方式调用损耗相差并不大)。JavaCV利用JavaCPP在FFmpeg和Java之间构建了桥梁,我们通过这个桥梁可以方便的调用FFmpeg,当然这并不是没有损失的,性能损失暂且不提,最主要问题在于调用ffmpeg之于jvm是native方法,所以通过ffmpeg创建的结构体实例与常量、方法等等都是使用堆外内存,都需要像C那样手动的释放这些资源(jvm并不会帮你回收这部分),以此来保证不会发生内存溢出/泄露等风险。

 

JAVACV 与 JavaCPP关系

  可以简单的理解为JavaCV利用了JavaCPP和JavaCPP Presets做支持

 

JAVACV封装的一些关键对象与流程

   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采样数据)
 

~~~~待续后面增加代码实例.主要解决 视频流和音频流合并的问题[email protected]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关标签: 音视频