在Android上使用带有FFMPEG和OpenCV的NDK进行视频处理非常慢
video processing on android using ndk with ffmpeg and opencv is very slow
我正在使用ndk在Android上进行一些视频处理。
我现在正在做的是使用ffmpeg解码视频,抓住帧,将其转换为opencv mat,然后在上面叠加一些图像,然后将其转换回avframe,将其编码回视频。
但是它非常慢!以 50 fps 处理 480*480 的视频大约需要 15 秒。
我尝试使用 opengl es 来做到这一点,使用 glReadPixel 读取结果图像,但据我所知,glReadPixel 在某些设备上并不真正有效。所以我不得不放弃它。
据我了解,我在当前的工作流程中有一些非常昂贵的操作,
- 将AVFrame从yuv转换为bgr色彩空间,然后转换为opencv mat
- 将一个垫子覆盖在另一个垫子上
- 将opencv垫子隐藏为AVFrame,然后将帧从bgr转换为yuv空间,然后将其编码为视频。
那么,有没有办法改善我目前的工作流程?
我正在添加多线程功能,但只有具有多核杯的设备才能从中受益。
OpenGL ES不是为直接处理视频而设计的。 您需要使用一些 EGL 扩展并使用着色器代码将帧从 YUV 转换为 RGB 颜色空间。 这提供了最大的性能提升。 您也不得使用 glTexImage2D() 和 glReadPixels()。 此答案包含指向介绍如何将 OpenGL ES 用于视频的文章的链接。
您可以尝试 NDK r10 中的原生媒体 API。请参阅示例。
我认为你遇到了和我一样的问题。
目前,我认为解决方案之一是添加一个缓冲区,并在开始时处理一些帧,然后显示一段时间。我的线程继续将帧放到垫子上缓冲,而另一个线程可以使用 openCV 在缓冲区中处理垫子。使用缓冲区,您无需等待它处理整个视频。
让我知道它是否适合您,但我同意您的看法,只有具有多核的设备才能受益。
查看Android处理视频帧从位图到垫子有明显的延迟
相关文章:
- 如何使用ndk-build.cmd构建Android.so文件
- Android NDK传感器向事件队列报告奇怪的间隔
- 如何在c++中录制具有精确帧时间戳的视频
- 如何在QT中的自定义视频小工具t上绘制矩形
- Android NDK 编译 LAME HAVE_MPGLIB > 'interface.h' 文件未找到
- 如何使用OpenCV-C++编写*.mp4视频?
- NDK:如何通过ndkr15c包含"RefBase.h"?
- 开放 CV 中的动态内存分配,用于视频处理
- Android NDK clang 编译器错误在 Windows 上显示'No such file or directory'
- 为什么使用 NDK 不能存在不同的 stl 实现?
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- OpenCV QT,显示视频的帧(不使用while循环)
- FFmpeg——使用硬件加速进行视频解码
- 在 openCV 中手动停止视频
- 在 constexpr 构造函数 (c++17) 中赋值到 const char * 在使用 Android NDK 时
- 强制Qt相机视频格式
- 在macOS Mojave上尝试OpenCV视频捕获时"Abort Trap: 6"
- 如何在 android ndk 上链接 C 和 C++ 代码,以及 C 和 C++ 运行时库(包括 STL)?
- 应用程序在打开的简历中捕获视频后没有响应
- 在Android上使用带有FFMPEG和OpenCV的NDK进行视频处理非常慢