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

/ Java / 没有评论 / 3920浏览

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

前言

在此之前,我们分析了FrameGrabber和FrameRecorder,对于音视频、图片和流媒体的输入输出相信大家已经基本掌握和了然于心了。那么接下来的本章,主要讲解和分析FrameFilter,让我们直接开始吧。

FrameFilter的介绍和结构

FrameFilter就是过滤音频和视频帧,并对音频和视频进行处理的一个帧处理器,用滤镜来描述可能更为贴切一点(但是由于FrameFilter还可以处理音频,所以我们还是使用“过滤器”更合适些,虽然有可能引起歧义就是了),在采集到解码后的音视频源或者图像、音频后,对解码后的数据源进行加工的过程就是FrameFilter做的事情了。

FrameFilter处理流程

FrameFilter的一般调用处理流程

初始化和设置解码后的数据--->start()--->循环start| push(Frame frame)--->Farme pull() |循环end--->结束时调用stop释放内存

结合FrameGrabber和FrameRecorder后的FrameFilter处理流程,如下图所示 1

FrameFilter的子类

FrameFilter只有一个实现类就是FFmpegFrameFilter,所以本章主要分析FFmpegFrameFilter。

FFmpegFrameFilter剖析

FFmpegFrameFilter介绍

FFmpegFrameFilter本身就是FrameFilter的实现类, 结构基本相同,使用流程参考上面的流程结构图。

FFmpegFrameFilter的初始化及参数

视频和音频混合过滤器初始化

FFmpegFrameFilter(String videoFilters, String audioFilters, int imageWidth, int imageHeight, int audioChannels)

视频过滤器初始化

FFmpegFrameFilter(String filters, int imageWidth, int imageHeight)

音频过滤器初始化

FFmpegFrameFilter(String afilters, int audioChannels)

参数

if (filters != null && imageWidth > 0 && imageHeight > 0) {
    startVideoUnsafe();
}
if (afilters != null && audioChannels > 0) {
    startAudioUnsafe();
}

start方法

start()方法会对视频过滤器和音频过滤器进行判断,如果有视频过滤器和音频过滤器则就会初始化对应过滤器上下文。

push方法

可以同时送入视频图像像素和音频采样(Frame对象可以同时包含图像像素和音频采样数据)

push(Frame frame)

与上面一样,只不过可以设置视频图像像素格式

push(Frame frame, int pixelFormat)

上面两个方法都是下面这个方法的语法糖,也是一样同时支持送入视频和音频, 还支持更多参数,比如视频的宽度(width)、高度(height)、图像深度(depth),图像通道(channels)、图像跨度(stride)、像素格式(pixelFormat),图像像素缓存数据

pushImage(int width, int height, int depth, int channels, int stride, int pixelFormat, Buffer ... image) 

只送入音频采样数据,音频通道(audioChannels), 采样率(sampleRate), 音频编码格式(sampleFormat)和音频采样缓存

pushSamples(int audioChannels, int sampleRate, int sampleFormat, Buffer ... samples)

补充:

pull方法

拉取经过视频和音频过滤器处理后的视频图像Frame,如果同时设置了音频和视频过滤器,会同时通过Frame返回,如果只设置了其中一个,则Frame中存放的也是只有其中一个处理后的图像像素或者音频采样。

pull()

只拉取经过视频过滤器处理后的图像像素

Frame pullImage()

只拉取经过音频过滤器处理后的音频采样

Frame pullSamples()

FFmpegFrameFilter的使用

使用示例参考javaCV开发详解之13:使用FFmpeg Filter过滤器处理音视频