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

Android设备中几种YUV420p转rgb视频帧方法效率比较

Android设备中几种YUV420p转rgb视频帧方法效率比较编者:李国帅qq:9611153微信lgs9611153时间:202

Android设备中几种YUV420p转rgb视频帧方法效率比较

编者:李国帅

qq:9611153 微信lgs9611153

时间:2020-03-30

背景原因:

从android的camera之中获取视频帧,或者从第三方ipc比如海康大华的sdk api获取的视频帧,往往都是yuv格式的,比如yv12,i420。

这些视频帧要想显示到android的view/surface中,需要把yuv格式转换为rgb格式,通过view的canvas绘制到界面上。

正在上传…重新上传取消

中间碰到了这么个问题:因为java语言自身的效率问题,要处理高频率,大数据的数据转换往往效率很低。普通的操作很容易造成视频回显的阻塞,影响用户使用。

 

 

YUV420p转rgb通常有几个方法:

(华为平板2g内存下)

         1、常见的就是使用YuvImage间接实现,但是这种方案效率很低,通常一帧640*480的转换需要40~50毫秒。

         此方法仅可以转NV21和YUY2,还需要从先转换为NV21.

        

2、据说使用 renderscript.ScriptIntrinsicYuvToRGB效率很高,内部原理不明,实测大概20毫秒左右。不过问题是只能从nv12转rgb,要添加从yv12转nv12的操作。

        

3、yv12和rgb之间的鸿沟并不是很深,并且可以直接使用代码实现转换。如果使用java代码直接转换,大约也就40毫秒。

        

4、当然了,如果能使用jni方法嵌入程序的c语言转换函数,效率会有所提高。记得以前总结过一篇《使用ffmpeg中的转换库进行颜色转换》,应该速度比renderscript快。

 

使用代码进行测试:

写一个程序,使用纯java代码测试,创建随机图像,对几种方法进行对比。

正在上传…重新上传取消

测试结果:

正在上传…重新上传取消

03-30 11:44:20.421 32436-32436/? D/MainActivity: YuvImage处理1帧耗时=82

03-30 11:44:20.471 32436-32436/? D/MainActivity: 直接转换处理1帧耗时=49

03-30 11:44:20.491 32436-32436/? D/MainActivity: 使用renderscript.ScriptIntrinsicYuvToRGB处理1帧耗时=20

03-30 11:44:21.511 32436-32436/? D/MainActivity: YuvImage处理1帧耗时=85

03-30 11:44:21.561 32436-32436/? D/MainActivity: 直接转换处理1帧耗时=47

03-30 11:44:21.581 32436-32436/? D/MainActivity: 使用renderscript.ScriptIntrinsicYuvToRGB处理1帧耗时=23

 

正在上传…重新上传取消

 

总结:

方法没有好坏,使用在恰当的地方就是好方法。追求都是要付出成本的,就看值不值得了。

如果设定帧率在10以下,使用yuv转换也未尝不可。

 

 

 


推荐阅读
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • Flutter 2.* 路由管理详解
    本文详细介绍了 Flutter 2.* 中的路由管理机制,包括路由的基本概念、MaterialPageRoute 的使用、Navigator 的操作方法、路由传值、命名路由及其注册、路由钩子等。 ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • 版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。本文链接:https:blog.csdn.netweixin_43171186art ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • String字符串与字符数组#includeStringintmain(){char*strhello;字符串与字符数组的关系:字符串是 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 你的问题在于:1. 代码格式混乱,缺乏必要的缩进,导致可读性极低;2. 使用 `strlen()` 和 `malloc()` 函数时,必须包含相应的头文件;3. `write()` 函数的返回值处理不当,建议检查并处理其返回值以确保程序的健壮性。此外,建议在编写代码时遵循良好的编程规范,增加代码的可维护性和可读性。 ... [详细]
  • 在C语言程序开发中,调试和错误分析是确保代码正确性和效率的关键步骤。本文通过一个简单的递归函数示例,详细介绍了如何编写和调试C语言程序。具体而言,我们将创建一个名为 `factorial.c` 的文件,实现计算阶乘的功能,并通过逐步调试来分析和解决可能出现的错误。此外,文章还探讨了常见的调试工具和技术,如GDB和断点设置,以帮助开发者高效地定位和修复问题。 ... [详细]
author-avatar
mobiledu2502861465
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有