繁体   English   中英

使用带有ffmpeg和opencv的ndk的android上的视频处理非常慢

[英]video processing on android using ndk with ffmpeg and opencv is very slow

我正在使用ndk在android上进行一些视频处理。

我现在正在做的是使用ffmpeg解码视频,抓取帧,将其转换为opencv mat,然后在其上覆盖一些图像,然后将其转换回avframe,将其编码回视频。

但这很慢! 以15 fps处理480 * 480视频大约需要50秒。

我尝试使用opengl es进行此操作,使用glReadPixels读取结果图像,但是据我了解,glReadPixels在某些设备上并没有真正起作用。 所以我不得不放弃。

据我了解,我目前的工作流程中有一些非常昂贵的操作,

  1. 将AVFrame从yuv转换为bgr色彩空间,然后转换为opencv mat
  2. 在另一个垫子上覆盖一个垫子
  3. 将opencv素材转换为AVFrame,然后将帧从bgr转换为yuv空间,然后将其编码为视频。

那么,有什么方法可以改善我目前的工作流程?

我要添加多线程功能,但是只有具有多核杯的设备才能从中受益。

OpenGL ES并非旨在直接处理视频。 您需要使用一些EGL扩展,并使用着色器代码将帧从YUV转换为RGB颜色空间。 这样可以最大程度地提高性能。 您也不得使用glTexImage2D()和glReadPixels()。 答案具有指向文章的链接,这些文章显示了如何将OpenGL ES用于视频。

您可以尝试NDK r10中提供的本地媒体API。 参见示例

我认为您遇到的问题与我的相同。

现在,我认为解决方案之一是添加一个缓冲区,并在开始时处理一些帧,然后显示一会儿。 我的线程继续将帧放入Mat进行缓冲,而另一个线程可以使用openCV在缓冲区中处理Mat。 使用缓冲区,您无需等待它即可处理整个视频。

让我知道它是否对您有用,但我同意您的观点,只有具有多核的设备才能受益。

看到从位图到Mat的Android处理视频帧有明显的延迟

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM