热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java过滤器工作原理图_JavaCV入门指南:帧过滤器(FrameFilter)的原理与应用

JavaCV入门指南:帧过滤器(FrameFilter)的原理与应用前言在此之前,我们分析了FrameGrabber和FrameRecorder

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

前言

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

FrameFilter的介绍和结构

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

FrameFilter处理流程

FrameFilter的一般调用处理流程

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

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

994bb1caccfbcbef7e1759de91174c8f.png

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)

参数

视频需要至少三个参数:videoFilter、imageWidth和imageHeight。也就是说必须保证这三个参数(视频过滤器,图像宽度,高度)都不能为空,且图像高度和宽度大小不能太离谱。

音频过滤器需要至少两个参数:afilters 和 audioChannels。音频过滤器和音频通道

参考FFmpegFrameFilter源码:

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)

补充:

关于图像深度(depth),图像深度是图像里用来表示一个像素点的颜色由几位构成,比如24位图像深度的1920x1080的高清图像,就表示这个高清图像它所占空间是(1920x1080x24bit/8)kb也就是:1920x1080x3 kb

关于图像通道(channels),channels*8=depth,也就说图像深度除8Bit就是图像通道数,图像跨度(stride)就是图像一行所占长度,一般大于等于图像的宽度。

pull方法

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

pull()

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

Frame pullImage()

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

Frame pullSamples()

FFmpegFrameFilter的使用

本文由 创作,采用 知识共享署名4.0 国际许可协议进行许可。本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为:

2020/07/16 08:51



推荐阅读
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • 抽空写了一个ICON图标的转换程序
    抽空写了一个ICON图标的转换程序,支持png\jpe\bmp格式到ico的转换。具体的程序就在下面,如果看的人多,过两天再把思路写一下。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 1、Ipv4只能用于内网,外网只能用2、DNS:把域名解析成ip地址3、MAC地址就是物理地址(网卡序列号)   IP地址:电脑序列号4、不同电脑,微信之间互相通信,靠的是端口;  ... [详细]
  • STM32 IO口模拟串口通讯
    转自:http:ziye334.blog.163.comblogstatic224306191201452833850647前阵子,调项目时需要用到低波 ... [详细]
  • 重组蛋白/细胞因子的实验操作
    在我们进行抗体制备、ELISA、药物研究、免疫实验、细胞培养、晶体结构分析等实验时,免不了要和重组蛋白打交道。MCE重组蛋白产品涵盖超过2000种不同功能的重组蛋白& ... [详细]
  • Nginx Buffer 机制引发的下载故障
    Nginx ... [详细]
author-avatar
Utopia
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有