热门标签 | 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



推荐阅读
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • 如何使用 `org.apache.tomcat.websocket.server.WsServerContainer.findMapping()` 方法及其代码示例解析 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 在本文中,我们将详细介绍如何构建一个用于自动回复消息的XML类。当微信服务器接收到用户消息时,该类将生成相应的自动回复消息。以下是具体的代码实现:```phpclass We_Xml { // 代码内容}```通过这个类,开发者可以轻松地处理各种消息类型,并实现高效的自动回复功能。我们将深入探讨类的各个方法和属性,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 提升Android开发效率:Clean Code的最佳实践与应用
    在Android开发中,提高代码质量和开发效率是至关重要的。本文介绍了如何通过Clean Code的最佳实践来优化Android应用的开发流程。以SQLite数据库操作为例,详细探讨了如何编写高效、可维护的SQL查询语句,并将其结果封装为Java对象。通过遵循这些最佳实践,开发者可以显著提升代码的可读性和可维护性,从而加快开发速度并减少错误。 ... [详细]
  • JVM钩子函数的应用场景详解
    本文详细介绍了JVM钩子函数的多种应用场景,包括正常关闭、异常关闭和强制关闭。通过具体示例和代码演示,帮助读者更好地理解和应用这一机制。适合对Java编程和JVM有一定基础的开发者阅读。 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 深入解析Java虚拟机的内存分区与管理机制
    Java虚拟机的内存分区与管理机制复杂且精细。其中,某些内存区域在虚拟机启动时即创建并持续存在,而另一些则随用户线程的生命周期动态创建和销毁。例如,每个线程都拥有一个独立的程序计数器,确保线程切换后能够准确恢复到之前的执行位置。这种设计不仅提高了多线程环境下的执行效率,还增强了系统的稳定性和可靠性。 ... [详细]
  • 本文深入解析了 Kuangbin 数学训练营中的经典问题——Ekka Dokka,并通过详细的代码示例和数学推导,探讨了该问题的多种解法及其应用场景。通过对算法的优化和扩展,本文旨在为读者提供全面的理解和实用的参考。 ... [详细]
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社区 版权所有