全方位解读Android多媒体框架源码

深入解析Android播放器源码:构建多功能媒体播放器 本文还有配套的精品资源,点击获取 简介:在Android平台上开发自定义播放器是一项挑战,本篇深入探讨如何从底层构建一个视频和音频播放应用。文章详细解析了MediaPlayer API的使用,包括初始化、播放控制、音量和音频焦点处理、视频渲染、多格式支持、缓冲和网络流媒体处理、错误处理、自定义控件、性能优化和兼容性考虑。通过理解这些知识点,开发者将能够构建出功能丰富、高效稳... 阅读详情

Android多媒体框架的代码在以下目录中:external/opencore/。这个目录是Android多媒体框架的根目录,其中包含的子目录如下所示:

* android:这里面是一个上层的库,它基于PVPlayer和PVAuthor的SDK实现了一个为Android使用的Player和Author。

* baselibs:包含数据结构和线程安全等内容的底层库

* codecs_v2:这是一个内容较多的库,主要包含编解码的实现,以及一个OpenMAX的实现

* engines:包含PVPlayer和PVAuthor引擎的实现

* extern_libs_v2:包含了khronos的OpenMAX的头文件

* fileformats:文件格式的据具体解析(parser)类

* nodes:编解码和文件解析的各个node类。

* oscl:操作系统兼容库

* pvmi: 输入输出控制的抽象接口

* protocols:主要是与网络相关的RTSP、RTP、HTTP等协议的相关内容

* pvcommon:pvcommon库文件的Android.mk文件,没有源文件。

* pvplayer:pvplayer库文件的Android.mk文件,没有源文件。

* pvauthor:pvauthor库文件的Android.mk文件,没有源文件。

* tools_v2:编译工具以及一些可注册的模块。

Splitter的定义与初始化

以wav的splitter为例,在fileformats目录下有解析wav文件格式的pvwavfileparser.cpp文件,在nodes目录下有pvmf_wavffparser_factory.cpp,pvmf_wavffparser_node.h, pvmf_wavffparser_port.h等文件。

我们由底往上看,vwavfileparser.cpp中的PV_Wav_Parser类有InitWavParser(),GetPCMData(),RetrieveFileInfo()等解析wav格式的成员函数,此类应该就是最终的解析类。我们搜索PV_Wav_Parser类被用到的地方可知,在PVMFWAVFFParserNode类中有PV_Wav_Parser的一个指针成员变量。

再搜索可知,PVMFWAVFFParserNode类是通过PVMFWAVFFParserNodeFactory的CreatePVMFWAVFFParserNode()成员函数生成的。而CreatePVMFWAVFFParserNode()函数是在PVPlayerNodeRegistry::PVPlayerNodeRegistry()类构造函数中通过PVPlayerNodeInfo类被注册到Oscl_Vector<PVPlayerNodeInfo, OsclMemAllocator> 的vector中,在这个构造函数中,AMR,mp3等node也是同样被注册的。

由上可知,Android多媒体框架中对splitter的管理也是与ffmpeg等类似,都是在框架的初始化时注册的,只不过Opencore注册的是每个splitter的factory函数。

综述一下splitter的定义与初始化过程:

每个splitter都在fileformats目录下有个对应的子目录,其下有各自的解析类。

每个splitter都在nodes目录下有关对应的子目录,其下有各自的统一接口的node类和node factory类。

播放引擎PVPlayerEngine类中有PVPlayerNodeRegistry iPlayerNodeRegistry成员变量。

在PVPlayerNodeRegistry的构造函数中,将 AMR, AAC, MP3等splitter的输入与输出类型标示和node factory类中的create node与release delete接口通过PVPlayerNodeInfo类push到Oscl_Vector<PVPlayerNodeInfo, OsclMemAllocator> iType成员变量中。

当前Splitter的匹配过程

PVMFStatus PVPlayerNodeRegistry::QueryRegistry(PVMFFormatType& aInputType, PVMFFormatType& aOutputType, Oscl_Vector<PVUuid, OsclMemAllocator>& aUuids)函数的功能是根据输入类型和输出类型,在已注册的node vector中寻找是否有匹配的node,有的话传回其唯一识别标识PVUuid。

从QueryRegistry这个函数至底向上搜索可得到,在android中splitter的匹配过程如下:

android_media_MediaPlayer.cpp之中定义了一个JNINativeMethod(JAVA本地调用方法)类型的数组gMethods,供java代码中调用MultiPlayer类的setDataSource成员函数时找到对应的c++函数

  1. {"setDataSource", "(Ljava/lang/String;)V", (void *)
    android_media_MediaPlayer_setDataSource},  
  2. static void android_media_MediaPlayer_setDataSource
    (JNIEnv *env, jobject thiz, jstring path) 

此函数中先得到当前的MediaPlayer实例,然后调用其setDataSource函数,传入路径

  1. status_t MediaPlayer::setDataSource(const char *url)  

此函数通过调getMediaPlayerService()先得到当前的MediaPlayerService, const sp<IMediaPlayerService>& service(getMediaPlayerService());

然后新建一个IMediaPlayer变量, sp<IMediaPlayer> player(service->create(getpid(), this, fd, offset, length));

在sp<IMediaPlayer> MediaPlayerService::create(pid_t pid, const sp<IMediaPlayerClient>& client, const char* url)中

调status_t MediaPlayerService::Client::setDataSource(const char *url)函数,Client是MediaPlayerService的一个内部类。

在MediaPlayerService::Client::setDataSource中,调sp<MediaPlayerBase> MediaPlayerService::Client::createPlayer(player_type playerType)

生成一个继承自MediaPlayerBase的PVPlayer实例。

android多媒体框架分析 NULL 博文链接:https://skyline888.iteye.com/blog/814367 立即下载

相关推荐

Android开发 多媒体开发之MediaPlayer源码

Android开发 多媒体开发之MediaPlayer源代码

android多媒体发布 源代码,全方位解读Android多媒体框架源码

该楼层疑似违规已被系统折叠隐藏此楼查看此楼全方位解读Android多媒体框架源码,Android中对于图形界面以及多媒体的相关操作比较容易实现。而且对于大多数手机用户来说,他们主要也就是根据这些方面的功能来对系统那个进行修改。我们可以通过本文介绍的Android多媒体框架源码解读,来具体分析一下这方面Android中对于图形界面以及多媒体的相关操作比较容易实现。而且对于大多数手机用户来说,他们...

weixin_39905695的博客 1053

Android多媒体框架

找了好多关于Android多媒体框架的电子书籍,用了我好多的积分,很好的Android多媒体框架资料

Android多媒体播放器源码解析(stagefright框架)

一、android多媒体播放的调用步骤: a) android中定义一个MediaPlayer类 b) 在MediaPlayer中使用JNI技术调用的是android_media_MediaPlayer.cpp(media\jni,在这个类中对标准的JNI函数名称进行的转换) c) 以下涉及的都是C++,android_media_MediaPlayer中调用的是mediaplayer.cp

Cumu Blog 1万+

android多媒体协议,全方位解读Android多媒体框架源码

Android中对于图形界面以及多媒体的相关操作比较容易实现。而且对于大多数手机用户来说,他们主要也就是根据这些方面的功能来对系统那个进行修改。我们可以通过本文介绍的Android多媒体框架源码解读,来具体分析一下这方面的基本知识。Android多媒体框架的代码在以下目录中:external/opencore/。这个目录是Android多媒体框架的根目录,其中包含的子目录如下所示:* andro...

weixin_33068055的博客 386

Android多媒体框架(1)——MediaCodec.java源代码分析

概述 MediaCodec勇于访问底层的编解码器,是Android底层多媒体支持框架的一部分。它可以操作三种数据:压缩后的,原始的音频数据,以及原始的视频数据。 MediaCodec以异步的方式处理数据,会用到一组输入和输出缓冲区,后文会详细介绍。MediaCodec有内部类BufferInfo来描述缓冲区。 BufferInfo的代码如下: public final static class B...

hunter800421的专栏 3709

Android多媒体实战_源码

Android多媒体实战书籍的源码; 实际编译运行时修复了各种bug 可实际运行

Android多媒体应用开发实战详解:图像、音频、视频、2D和3D 源代码.rar )

Android多媒体应用开发实战详解:图像、音频、视频、2D和3D 源代码

Android多媒体框架(4)—— AMessage,AHandler和ALooper源码分析

AMessage源码分析 AMessage继承自RefBase类,它有AHandler和ALooper的成员mHandler和mLooper,并且ALooper还是它的友元。成员变量mWhat是消息id,成员变量mTarget指明消息的handler(只用于调试)。成员函数setWhat和setTarget分别设置这两个属性。 void AMessage::setWhat(uint32_t wha...

hunter800421的专栏 6528

Android多媒体框架(7)—— stagefright中MediaMuxer源码分析

stagefright中MediaMuxer源码分析 私有属性定义 MediaMuxer.h中定义了一些类的属性: const OutputFormat mFormat; sp&amp;lt;MediaWriter&amp;gt; mWriter; Vector&amp;lt; sp&amp;lt;MediaAdapter&amp;gt; &amp;gt; mTrackList; // Each track has its...

hunter800421的专栏 953

Android多媒体框架(5)—— MediaMuxer.jara源码分析

MediaMuxer.jara源码分析 音视频通过Codec(编码器)编码之后,还需要经过MediaMuxer(混合器)“混合”。混合器在framework的实现就是MediaMuxer类。MediaMuxer中又个内部类OutputFormat: public static final class OutputFormat { 80 /* Do not change these v...

hunter800421的专栏 3107

Android MediaPlayer源码分析

梳理应用层到framework层,MediaPlayer的处理流程,以便于工作中多媒体相关问题的分析处理,以下是整个流程的时序图,可对照时序图看下面的内容,会更加直观。

这个人很懒,什么都没留下... 3299

Android系统源码分析/多媒体框架/音频子系统/常用结构体分析-audio.h

audio_stream_type_t 定义音频流类型,主要是手机系统各类典型的音频流做出属性上的区分,举个例子:电话和媒体2种类型的音频不管从输出的设备(耳机、功放、还是蓝牙)都是存在明显的不同。把这些明显不同的音频区分并加以定义,可以说对音频策略管理(AudioPolicyManager,在我后续的技术文章会具体jiang)和代码开发实现都存在很大必要性 /* Audio stream ...

cx_chess的博客 2665

Android4.0源码目录结构详解

Android4.0源码目录结构详解 Android4.0与2.1目录差不多 alsa这块,注意external/tinyalsa下有: include/tinyalsa/asoundlib.h mixer.c pcm.c Readme Tinycap.c Tinymix.c Tinyplay.c 这个uevent是什么? hardware/libha...

weixin_30835649的博客 374

android源码解析------Media多媒体framework层分析

1.packages\providers\MediaProvider :含以下 java 文件 MediaProvider.java MediaScannerReceiver.java MediaScannerService.java MediaThumbRequest.java 2.查看该目录下AndroidMainfest.xml,从MediaScannerService...

guanhuaing 320

Android 多媒体框架(2)—— android_media_MediaCodec.cpp源码分析

android_media_MediaCodec.cpp源码分析 这里我们来分析和MediaCodec.java对应的native层类:android_media_MediaCodec.cpp的源代码。 在该类的最后,我们会看到这样的代码: static const JNINativeMethod gMethods[] = { 1881 { "native_release", "()V", ...

hunter800421的专栏 2512
上一篇: Android判断网络状态方法详解
下一篇: Android系统架构基本模式解析
曹纪乾
博客等级 码龄19年 775粉丝 1327原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值