<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[吾皇的博客]]></title><description><![CDATA[小闫的心情日记本～～～ 开玩笑啦～～       嵌入式uboot，linux驱动，Andorid底层。 i.MX6 IPU专栏，GStreamer专栏^_^~]]></description><link>https://blog.youkuaiyun.com/yanbixing123</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; yanbixing123]]></copyright><item><title><![CDATA[20. Android MultiMedia框架完全解析 - OMX组件解析与状态机简介]]></title><link>https://blog.youkuaiyun.com/yanbixing123/article/details/127247406</link><guid>https://blog.youkuaiyun.com/yanbixing123/article/details/127247406</guid><author>yanbixing123</author><pubDate>Mon, 10 Oct 2022 16:42:26 +0800</pubDate><description><![CDATA[State类中会做一些常规的操作，而不同类中处理不同的状态类型转换，这句话是什么意思呢？参照上一篇文章中讲的OMX的使用例子，首先通过OMX_Init()函数来初始化OMX的环境，在这个函数中会去注册组件，注册content pipe，之后就会通过OMX_GetHandle()函数来构建组件，并获取这个组件的Handler，在这个函数中会通过上述的ConstructComponent()函数来构建组件，并通过SetCallbacks来设置组件的回调函数，此时就完成了组件的加载，状态为Loaded。]]></description><category></category></item><item><title><![CDATA[19. Android MultiMedia框架完全解析 - 如何使用OpenMAX组件]]></title><link>https://blog.youkuaiyun.com/yanbixing123/article/details/127247149</link><guid>https://blog.youkuaiyun.com/yanbixing123/article/details/127247149</guid><author>yanbixing123</author><pubDate>Mon, 10 Oct 2022 16:30:40 +0800</pubDate><description><![CDATA[Android MultiMedia框架完全解析 - 如何使用OpenMAX组件]]></description><category></category></item><item><title><![CDATA[18. Android MultiMedia框架完全解析 - OpenMAX介绍]]></title><link>https://blog.youkuaiyun.com/yanbixing123/article/details/88937614</link><guid>https://blog.youkuaiyun.com/yanbixing123/article/details/88937614</guid><author>yanbixing123</author><pubDate>Mon, 10 Oct 2022 16:23:25 +0800</pubDate><description><![CDATA[OpenMAX IL API通过C语言致力于打造可移植媒体组件的阵列平台。这些组件可以是来源（source）、汇出（sink）、编解码器（codec）、过滤器（filter）、分离器（splitter）、混频器（mixers），或任何其他操作。

OpenMAX IL API允许用户加载，控制，连接和卸载各个组件。Android主要的多媒体引擎StageFright是通过IBinder使用Open...]]></description><category></category></item><item><title><![CDATA[2019年终总结]]></title><link>https://blog.youkuaiyun.com/yanbixing123/article/details/104529820</link><guid>https://blog.youkuaiyun.com/yanbixing123/article/details/104529820</guid><author>yanbixing123</author><pubDate>Wed, 01 Apr 2020 08:05:00 +0800</pubDate><description><![CDATA[这篇总结一直拖到2/27号才写, 希望能在2/29号之前写完吧, 啊哈哈哈.



按照国际惯例, 肯定是先记录一年的流水帐~

美好的日子总是过的很匆忙的, 依稀记得过完年后就正式开始离职流程了, 这一个月内好像没有啥新的工作要做了. 然后就开始了上班打卡, 下班打游戏的小日子, 过的也美滋滋. 大约过了两周后, 就感觉有些许的空虚, 想着以后不深入的多媒体方向了, 不总结一下, 感觉对不起自...]]></description><category></category></item><item><title><![CDATA[17. Android MultiMedia框架完全解析 - MediaClock分析与音视频同步]]></title><link>https://blog.youkuaiyun.com/yanbixing123/article/details/88937527</link><guid>https://blog.youkuaiyun.com/yanbixing123/article/details/88937527</guid><author>yanbixing123</author><pubDate>Mon, 01 Apr 2019 21:28:45 +0800</pubDate><description><![CDATA[这里的代码分析流程就是《15. Android MultiMedia框架完全解析 - Render流程分析》中的代码流程，上次主要关注的是buffer的交互流程，这次主要分析的是音视频同步，即AVsync。



（一）音视频同步概念与方法

音视频同步是一个播放器要处理的基本问题，音视频同步的好坏直接影响到播放效果。

解码后的音频片段和视频片段，都分别带有 pts 时间戳信息。回放时需要做的...]]></description><category></category></item><item><title><![CDATA[16. Android MultiMedia框架完全解析 - ACodec详细解析]]></title><link>https://blog.youkuaiyun.com/yanbixing123/article/details/88937517</link><guid>https://blog.youkuaiyun.com/yanbixing123/article/details/88937517</guid><author>yanbixing123</author><pubDate>Mon, 01 Apr 2019 21:18:40 +0800</pubDate><description><![CDATA[之前的文章中，已经多次分析过ACodec，但是我仍然认为有必要单独拿出来一节分析其中的一些机制与流程，下面先来看看ACodec在整个NuPlayer架构中的位置：



1、ACodec消息机制：

ACodec有一个BaseState和派生出来的其他State，如 UninitializedState,LoadedToIdleState, ExecutingState等。当有消息过来时，如果派生...]]></description><category></category></item><item><title><![CDATA[15. Android MultiMedia框架完全解析 - Render流程分析]]></title><link>https://blog.youkuaiyun.com/yanbixing123/article/details/88937441</link><guid>https://blog.youkuaiyun.com/yanbixing123/article/details/88937441</guid><author>yanbixing123</author><pubDate>Mon, 01 Apr 2019 21:11:58 +0800</pubDate><description><![CDATA[先来看Render在NuPlayer框架中所处的位置：



Renderer的作用就是根据传过来数据帧的时间来判断这一帧是否需要渲染，并进行音视频的同步。但是真正硬件渲染的代码在MediaCodec和ACodec中。



Renderer的位置是在NuPlayerDecoder后面，他俩之间的交互是从NuPlayer::Decoder::handleAnOutputBuffer()函数开始的...]]></description><category></category></item><item><title><![CDATA[14. Android MultiMedia框架完全解析 - NuPlayerDecoder与MediaCodec的交互]]></title><link>https://blog.youkuaiyun.com/yanbixing123/article/details/88937355</link><guid>https://blog.youkuaiyun.com/yanbixing123/article/details/88937355</guid><author>yanbixing123</author><pubDate>Mon, 01 Apr 2019 21:10:11 +0800</pubDate><description><![CDATA[上一篇文章中详细分析了MediaCodec，以及由它向下的内容，但是在MediaCodec外面包裹的是一层NuPlayerDecoder，这里就看看它们两者之间是如何沟通的。

从理论上来讲，既然NuPlayerDecoder包裹在MediaCodec外层，所以它相对于MediaCodec也可以理解为App，它调用MediaCodec的API来完成一些任务。下面就详细看看这个流程：



1. ...]]></description><category></category></item><item><title><![CDATA[13. Android MultiMedia框架完全解析 - MediaCodec解析]]></title><link>https://blog.youkuaiyun.com/yanbixing123/article/details/88937193</link><guid>https://blog.youkuaiyun.com/yanbixing123/article/details/88937193</guid><author>yanbixing123</author><pubDate>Mon, 01 Apr 2019 21:08:23 +0800</pubDate><description><![CDATA[MeidaCodec API: https://developer.android.com/reference/android/media/MediaCodec

MediaCodec是一个Codec，通过硬件加速解码和编码。它为芯片厂商和应用开发者搭建了一个统一接口。MediaCodec几乎是所有安卓播放器硬解的标配，要深入分析一个播放器的源码，如NuPlayer, ijkplayer，有必要了...]]></description><category></category></item><item><title><![CDATA[12. Android MultiMedia框架完全解析 - 从NuPlayer到MediaCodec到ACodec到OMX的整体流程与状态转换]]></title><link>https://blog.youkuaiyun.com/yanbixing123/article/details/88937106</link><guid>https://blog.youkuaiyun.com/yanbixing123/article/details/88937106</guid><author>yanbixing123</author><pubDate>Mon, 01 Apr 2019 21:05:19 +0800</pubDate><description><![CDATA[之前的文章中，讲了那么多细节的东西，已经对概况没有一个大致的了解，所以这里缕一下整体的流程，同时也分析MediaCodec，ACodec与OMX Plugin之间的状态切换关系。



（一）初始化过程（从NuPlayer开始）：



1. NuPlayer::start()时产生一个kWhatStart，在消息处理函数中如果是暂停后的开始就调用NuPlayer::onResume()【只需m...]]></description><category></category></item><item><title><![CDATA[11. Android MultiMedia框架完全解析 - start流程分析]]></title><link>https://blog.youkuaiyun.com/yanbixing123/article/details/88936033</link><guid>https://blog.youkuaiyun.com/yanbixing123/article/details/88936033</guid><author>yanbixing123</author><pubDate>Mon, 01 Apr 2019 20:59:57 +0800</pubDate><description><![CDATA[还是从mediaplayer.cpp开始分析，看start函数的实现：


status_t MediaPlayer::start()
{
mPlayer-&gt;setLooping(mLoop);
    mPlayer-&gt;setVolume(mLeftVolume, mRightVolume);
    mPlayer-&gt;setAuxEffectSendLevel(mSendLe...]]></description><category></category></item><item><title><![CDATA[10. Android MultiMedia框架完全解析 - MediaExtractor::Create函数的解析和FslExtractor分析]]></title><link>https://blog.youkuaiyun.com/yanbixing123/article/details/88927577</link><guid>https://blog.youkuaiyun.com/yanbixing123/article/details/88927577</guid><author>yanbixing123</author><pubDate>Mon, 01 Apr 2019 20:53:54 +0800</pubDate><description><![CDATA[先来看看MediaExtractor所处的位置：



（一）创建流程

在GenericSource.cpp的NuPlayer::GenericSource::initFromDataSource()函数中调用了：




extractor = MediaExtractor::Create(mDataSource,
                mimeType.isEmpty() ? N...]]></description><category></category></item><item><title><![CDATA[9. Android MultiMedia框架完全解析 - MediaExtractor和MediaMuxer介绍]]></title><link>https://blog.youkuaiyun.com/yanbixing123/article/details/88927503</link><guid>https://blog.youkuaiyun.com/yanbixing123/article/details/88927503</guid><author>yanbixing123</author><pubDate>Sun, 31 Mar 2019 13:19:23 +0800</pubDate><description><![CDATA[MediaExtractor API： https://developer.android.com/reference/android/media/MediaExtractor



Android中Native层抽象出来MediaMuxer类和MediaExtractor类，MediaMuxer类主要用于将音频和视频数据进行混合生成多媒体文件（如：mp4文件），而MediaExtractor则...]]></description><category></category></item><item><title><![CDATA[8. Android MultiMedia框架完全解析 - prepareAsync的过程分析]]></title><link>https://blog.youkuaiyun.com/yanbixing123/article/details/88927383</link><guid>https://blog.youkuaiyun.com/yanbixing123/article/details/88927383</guid><author>yanbixing123</author><pubDate>Sun, 31 Mar 2019 13:14:33 +0800</pubDate><description><![CDATA[还是从mediaplayer.cpp文件开始分析：


status_t MediaPlayer::prepareAsync()
{
    ALOGV("prepareAsync");
    Mutex::Autolock _l(mLock);
    return prepareAsync_l();
}

基本没做什么，设置了一个自动锁，然后就直接跳到MediaPlayer::prepare...]]></description><category></category></item><item><title><![CDATA[7. Android MultiMedia框架完全解析 - ALooper-AHandler-AMessage机制分析]]></title><link>https://blog.youkuaiyun.com/yanbixing123/article/details/88927323</link><guid>https://blog.youkuaiyun.com/yanbixing123/article/details/88927323</guid><author>yanbixing123</author><pubDate>Sun, 31 Mar 2019 13:04:35 +0800</pubDate><description><![CDATA[先来看整个框架图：



NuPlayer基于Stagefright的基础类构建，使用了更底层的ALooper-AHandler-AMessage机制来异步处理消息。

AMessage作为一个消息载体，保存这与这个消息有关的信息；

ALooper是一个循环，它运行着一个后台线程，来循环处理接收到的消息（将信息转给AHandler来处理，它相当于一个中转站）；

AHandler作为一个句柄，它...]]></description><category></category></item><item><title><![CDATA[6. Android MultiMedia框架完全解析 - NuPlayerDriver与NuPlayer的通信]]></title><link>https://blog.youkuaiyun.com/yanbixing123/article/details/88927268</link><guid>https://blog.youkuaiyun.com/yanbixing123/article/details/88927268</guid><author>yanbixing123</author><pubDate>Sun, 31 Mar 2019 12:59:06 +0800</pubDate><description><![CDATA[先解决NuPlayer与NuPlayerDriver的通信过程，在之前的文章中，都说了NuPlayerDriver是NuPlayer的一个Wrapper，上层的指令发送给NuPlayerDriver后，NuPlayer作为NuPlayerDriver的一个成员变量，NuPlayerDriver想调用NuPlayer的话，就相当简单。当NuPlayer完成一个指令后，如何通知NuPlayerDriv...]]></description><category></category></item><item><title><![CDATA[5. Android MultiMedia框架完全解析 - 再谈Playback框架及一些学习方法的讨论]]></title><link>https://blog.youkuaiyun.com/yanbixing123/article/details/88927124</link><guid>https://blog.youkuaiyun.com/yanbixing123/article/details/88927124</guid><author>yanbixing123</author><pubDate>Sun, 31 Mar 2019 12:53:53 +0800</pubDate><description><![CDATA[经过前面的分析，我们大概知道了一些概念，但是这个StageFright在整个playback的位置是什么样的：



Android Media这一块的知识杂乱，而且有深度，有广度。深度的话，从app-&gt;JNI-&gt;C++-&gt;底层的OMX驱动，广度的话，每个播放器在播放的时候，会执行seek操作，快进，快退，暂停等等操作，同时，需要涉及读取源文件（从网络读取，从文件读取），解码（软...]]></description><category></category></item><item><title><![CDATA[4. Android MultiMedia框架完全解析 - MediaPlayerFactory中OMX_Player的实现]]></title><link>https://blog.youkuaiyun.com/yanbixing123/article/details/88927013</link><guid>https://blog.youkuaiyun.com/yanbixing123/article/details/88927013</guid><author>yanbixing123</author><pubDate>Sun, 31 Mar 2019 12:42:17 +0800</pubDate><description><![CDATA[这里的实现，可以参照C++设计模式中的工厂模式，：http://blog.youkuaiyun.com/wuzhekai1985/article/details/6660462

这里插讲一下厂商定制Player的过程，可以参考NuPlayer的创建过程，通过这个过程，也能够对MediaPlayerFactory类有个比较深入的理解。



（这里需要注意，代码是KK442版本的，FSL在那个版本使用OMX...]]></description><category></category></item><item><title><![CDATA[3. Android MultiMedia框架完全解析 - setDataSource继续分析]]></title><link>https://blog.youkuaiyun.com/yanbixing123/article/details/88926921</link><guid>https://blog.youkuaiyun.com/yanbixing123/article/details/88926921</guid><author>yanbixing123</author><pubDate>Sun, 31 Mar 2019 12:34:18 +0800</pubDate><description><![CDATA[在上一节中，我们分析到从服务端返回后，函数的执行流程

(NO_ERROR != player-&gt;setDataSource(fd, offset, length)))

这里继续执行，从服务端返回后，这个player就对应的是MediaPlayerService::Client，同时需要注意的是，在《Android中C/S架构以及C++层调用步骤分析》中介绍了创建了一个IMediaPlay...]]></description><category></category></item><item><title><![CDATA[2. Android MultiMedia框架完全解析 - MediaPlayer的C/S架构与Binder机制实现]]></title><link>https://blog.youkuaiyun.com/yanbixing123/article/details/88926819</link><guid>https://blog.youkuaiyun.com/yanbixing123/article/details/88926819</guid><author>yanbixing123</author><pubDate>Sun, 31 Mar 2019 12:27:14 +0800</pubDate><description><![CDATA[在Android中大量使用到了C/S架构来实现应用层和底层服务交互，而Binder机制无处不在。

同样MediaPlayer也使用了这种机制，MediaPlayer在运行的时候，同样可以分为Client/Server两个部分，他们分别在不同的进程中运行，不同进程间的通信使用Binder机制，我们这里就以setDataSource()为例，讲解一下他们是如何建立关系的，架构图如下：





1）...]]></description><category></category></item></channel></rss>