Android2.2之前版本的视频音频的播放默认支撑库为OpenCore。OpenCore功能非常强大,可以支持多种媒体格式,并支持扩展。当然本文将要简单介绍一下怎样对OpenCore进行视频硬件加速,以提高其视频运行效率。
OpenCore的作用简单的说就是对媒体(音频视频)数据进行解码,并输出到终端设备。音频数据解码和输出比较简单,本文重点介绍视频数据的解码和输出。为了使OpenCore的视频播放支持Android系统,谷歌定义了两套视频输出方案,一种是由硬件厂商实现硬件加速的视频输出,硬件视频输出里面可以调用硬件Overlay模块对输出的视频数据进行硬件混叠,这样输出效率会非常的高;另外一种为谷歌定义的软视频输出,该软视频输出定义为AndroidSurfaceOutput类,这种方案中系统会调用SurfaceFilnger对输出视频数据进行混叠,该混叠为软件混叠,执行效率比较低。请看文件PlayerDriver.cpp中handleSetVideoSurface方法的代码:
// attempt to load device-specific video MIO
if (mLibHandle != NULL) {
VideoMioFactory f = (VideoMioFactory) ::dlsym(mLibHandle, VIDEO_MIO_FACTORY_NAME);
if (f != NULL) {
mio = f();
}
}
// if no device-specific MIO was created, use the generic one
if (mio == NULL) {
LOGW("Using generic video MIO");
mio = new AndroidSurfaceOutput();
}
可以看出如果mLibHandle不为空,则调用硬件库中的MIO(多媒体IO)工厂方法产生MIO(多媒体IO)。如果mLibHandle为空,则用通用视频MIO(AndroidSurfaceOutput类)。如果你仔细研究AndroidSurfaceOutput类你会发现,其底层调用的SurfaceFlinger来进行视频数据混叠,然后输出的,这部分有兴趣的朋友可以去查看代码。
那么mLibHandle那里初始化的呢?在文件PlayerDriver.cpp中PlayerDriver类的构造函数中有如下代码:
// running in emulation?
mLibHandle = NULL;
char value[PROPERTY_VALUE_MAX];
if (property_get("ro.kernel.qemu", value, 0)) {
mEmulation = true;
LOGV("Emulation mode - using software codecs");
} else {
// attempt to open h/w specific library
mLibHandle = ::dlopen(MIO_LIBRARY_NAME, RTLD_NOW);
if (mLibHandle != NULL) {
LOGV("OpenCore hardware module loaded");
} else {
LOGV("OpenCore hardware module not found");
}
}
我们可以看出mLibHandle为库MIO_LIBRARY_NAME的句柄。请参考下面的代码:
// library and function name to retrieve device-specific MIOs
static const char* MIO_LIBRARY_NAME = "libopencorehw.so";
static const char* VIDEO_MIO_FACTORY_NAME = "createVideoMio";
现在我们可以非常清楚的看到如果系统中有libopencorehw.so库,则OpenCore将会调用该库中的createVideoMio函数来创建MIO。由此我们可以知道对OpenCore的视频输出硬件加速,其实就是定义libopencorehw.so库。
那么libopencorehw.so定义在那里呢?因为libopencorehw.so这个库是和硬件相关的,不同的硬件会有不同的实现,所以这个库可以理解成硬件适配层(HAL)的一部分。请参考《怎样实现Android系统的HAL(硬件适配层)》。由于硬件的千变万化,这里就不给实现的例子了。这样的例子非常多,大部分基于ARM芯片,你可以“依葫芦画瓢”,定制成自己平台的库。
本文简单介绍了一下OpenCore视频输出的硬件加速的原理。搞清楚视频输出硬件加速的原理,对一些进行Android移植到新硬件平台的朋友会有帮助。如有纰漏之处,请各位朋友指正。
转载:http://my.unix-center.net/~Simon_fu/?p=748
分享到:
相关推荐
Android的多媒体框架OpenCore是Android系统中的核心组件之一,用于处理多媒体内容的播放和录制。OpenCore最初由PacketVideo公司开发,后来成为Android系统的一部分。本文将深入探讨OpenCore的结构、功能及其与...
Android的多媒体框架OpenCore是Android系统中用于处理多媒体数据的核心组件之一,它为开发者提供了丰富的多媒体功能支持,包括音频、视频的编码、解码、播放和录制等。OpenCore不仅在Android早期版本中扮演着重要...
Android的多媒体框架OpenCore是Android系统中用于处理多媒体内容的核心组件,它提供了全面的多媒体播放和录制功能。OpenCore最初由PacketVideo公司开发,后来成为Android系统的一部分。在Android开发者社区中,...
7. **硬件加速**:为了提高性能,OpenCore利用Android硬件抽象层(HAL)与硬件解码器进行交互,将部分计算密集型任务如视频解码交给硬件处理,降低CPU负载。 在实际开发中,理解OpenCore的工作原理对于优化多媒体...
opencore-amr-android, android中的opencore amr编解码器 opencore-amr-android一种带有解释功能的opencore amr编解码器及其封装amr音频文件的。中文文档请移步 README_CN QQ部落帮助: 453503476背景opencore 是...
4. **硬件加速**:OpenCore支持利用设备的硬件加速能力,提高多媒体处理效率,降低功耗。 四、OpenCore与Stagefright的关系 在Android 4.1版本之后,OpenCore逐渐被Stagefright框架取代,但OpenCore仍然存在于系统...
在实际开发中,Android的多媒体框架不仅涉及到播放和录制,还涵盖了文件管理、流媒体服务、硬件加速等多个方面。例如,MediaExtractor用于从多媒体文件中提取数据,MediaCodec则负责解码和编码,而MediaMuxer则用于...
Android的多媒体框架OpenCore是Android系统中的核心组件之一,它为Android设备提供了处理各种多媒体内容的能力,包括音频、视频和图像。OpenCore是Android早期版本中的一个关键组件,虽然在现代版本的Android中,它...
OpenCore是Android多媒体框架的核心部分,它是一个综合的多媒体处理库,负责解码、合成、流媒体控制等功能。OpenCore的设计目标是提供一种高效、灵活的解决方案,以支持多种多媒体格式和标准,满足Android设备对...
标题 "android中的opencore介绍" 指涉的是Android操作系统中的OpenCore组件,这是一个多媒体框架,用于处理音频和视频编码、解码以及播放。OpenCore是Android早期版本中的核心部分,它为Android设备提供了多媒体内容...