- 博客(96)
- 收藏
- 关注
原创 Android native层媒体通信架构AHandler/ALooper机制实现源码分析【Part 3】
承接上一章节分析:【若前一章节没看过,建议先看上一章节】Android native层媒体通信架构AHandler/ALooper机制实现源码分析【Part 2】本系列文章分析的安卓源码版本:【Android 10.0 版本】3.3、AMessage post发送事件消息实现分析其实在AMessage中可以有三种post方式,如下声明:// [frameworks/av/media/libstagefright/foundation/include/media/stagefright/founda
2021-04-01 16:37:47 697 1
原创 Android native层媒体通信架构AHandler/ALooper机制实现源码分析【Part 2】
[Android native层媒体通信架构AHandler/ALooper机制实现源码分析【Part 1】]本系列文章分析的安卓源码版本:【Android 10.0 版本】3、发送消息:ALooper内部线程或其他线程中均可发送消息。【以MediaClock为例】```cpp// [frameworks/av/media/libstagefright/MediaClock.
2021-03-31 23:12:43 554
原创 Android native层媒体通信架构AHandler/ALooper机制实现源码分析【Part 1】
彻底理解掌握native层媒体通信架构AHandler/ALooper消息循环机制实现源码分析很久前分析过android java端Handler机制实现源码分析,并手写了该Handler机制的简单实现——【[教你手写android底层Handler消息机制实现框架]】此章节的AHandler机制实现原理和java端大同小异,当然还有另外对应于java层Handler的native层对应实现,以后有时间可以考虑分析下,但实现原理都类似的。[Android native/C++层Thread线程实现源码
2021-03-31 22:26:00 1260
原创 Android native/C++层Thread线程实现源码分析
在Android native(C++)层若想要创建一个线程则可以使用android平台native实现的Thread类来创建【当然你也可以直接使用C++标准库实现的std::thread,需引入头文件 #include<thread>,后续有时间再分析该标准库的实现】,而该类做了跨平台线程调用接口的处理和封装,具备了跨平台运行能力。在native层使用该类必须引用android命名空间,因为该类是在android命名空间实现的,并引用该头文件【system/core/libutils/include/u
2021-03-30 11:05:56 2893
原创 Android native层DeathRecipient对关联进程(如相关Service服务进程)异常关闭通知事件的监听实现源码分析
Android DeathNotifier 死亡通知监听实现此部分是在分析multimedia整体架构时由于该内容是常用实现内容,因此被抽出来单独进行分析。要阅读本章节需有Binder机制实现原理的大致掌握,推荐可先补充另一章节内容:Android C++底层Binder通信机制原理分析总结【通俗易懂】死亡通知是为了让Bp端能知道Bn端的生死状态定义:DeathNotifier是继承IBinder::DeathRecipient类,主要需要实现其binderDied()来进行死亡通告。注册:bin
2021-03-23 16:27:27 2648
原创 Android MediaPlayer在seek视频时可能会黑屏卡顿好几秒且进度条不动但有声音播放的问题源码解析
根本原因:个别视频格式播放器【特别是video decoder软解码器】解码速度较慢导致的。从源码分析原因就是:一、当前视频支持seek到非关键帧,导致其seek位置前最近的一个关键帧开始到seek位置的视频帧数据将会被drop掉,并且延迟通知notifySeekCompleted事件给APP,直到解码数据到seek位置时才通知,但此时seek位置的视频帧播放时间已经错过了音频播放时间,延迟太长而被丢弃,一直解码出来的视频数据直到丢弃到当前音频播放时间点的4毫秒范围内,才认为是音视频同步播放数据,才可进
2021-02-26 12:11:36 4218 2
原创 【一】Android MediaRecorder整体架构源码浅析
资料:本文基于android 7.1.2 版本源码分析。功能:MediaRecorder即可以录制音频,也可以录制视频。一、 MediaRecorder整体框架图1.1、 MediaRecorder整体层级关系图 – 各个具体类之间的依赖关系图:概要总结:如上在运行时,整个MediaRecorder大致上可以分为Client和Server两个部分,分别在两个进程中运行,它们之间使用Binder机制实现IPC通信。MediaPlayerService是多媒体框架中非常重要的一个服务,从框架图中可以
2020-12-09 22:01:56 3349 2
原创 Android C++底层Binder通信机制原理分析总结【通俗易懂】
Android C++层Binder通信:通过transact()方法可以向远端的IBinder对象发出调用,再通过onTransact()函数让你自己的远程对象能够响应接收到的调用。例如MediaRecorder的继承关系(向右箭头表示继承关系,#XXX#中间是关键方法,/斜线表示多继承):客户端:1、MediaRecorder->BnMediaRecorderClient#onTransact()#->BnInterface->BBinder#transact()#(->
2020-12-09 21:18:51 2529 1
原创 教你手写android底层Handler消息机制实现框架
源码分析android底层Handler消息机制,并且教你手写android底层Handler消息机制实现框架的一个简易版本首先看下android底层Handler消息机制的大致流程:1、发送消息:Handler——》sendMessage——》MessageQueue——》enqueueMessage (将消息添加到队列)2、处理消息:Loop——》MessageQueue——》next() (使用消息)——》dispatchMessage——》handleMessage还需要知道:Handle
2018-02-27 14:59:03 1217 3
原创 MVP模式项目架构:泛型高度解耦且避免Activity内存泄漏
MVP模式简介:简称:MVP 全称:Model-View-Presenter ;MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。 ————百度百科MVC和MVP的结构就不讲了,网上很多,简单说一下。MVC:view ---- controller ---- modelMVP:view ---- presenter ---- modelMVP相对于MVC的优点:1、Activ
2017-11-07 11:27:27 669
原创 Android MediaCodec加快解码和渲染处理方案及其源码分析
此处直接根据NDK实现来源码分析描述问题问题描述和原理分析:在我们直接使用MediaCodec进行解码和渲染时,一般情况下大家可以都习惯性在同一个线程中完成MediaCodec的解码和渲染,其实际我们应该拆分成两部分来处理,将解码和渲染放入不同线程完成,如此就会加快解码和渲染,其实现原理是,同一个线程中,解码和渲染将会被互相影响,而渲染是有一个Fence栅栏Buffer标记,可以简单理解为VSync屏幕刷新周期信号,若是60fps则VSync将会在16.67ms通知屏幕刷新信号一次,因此若在调用Medi
2021-07-31 15:05:57 3723
原创 Android native开发严重问题总结
本文用于总结开发过程中遇到的重要问题分析原因及其解决方案1、libnativeloader.so" is not accessible for the namespace “classloader-namespace”原因:安卓高版本中将会限制三方APP访问非NDK公开so库,即不能访问system/lib/lib64下面的私有so库。两种情况的解决方案:第一:若是系统system app,该问题的产生原因是app是通过install的,这样不可行,必须将该模块在编译产品后的system/app路径
2021-07-17 17:15:13 15767 4
原创 ffmpeg4.4在Linux下使用android NDK 21新版本编译及其问题解决
一、可参考英文官网https://trac.ffmpeg.org/wiki/CompilationGuide/Generic【安装编译、更新、移除】https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu#RevertingChangesmadebythisGuidehttps://trac.ffmpeg.org/wiki/CompilationGuidehttps://trac.ffmpeg.org/二、下载步骤备注:可参考官网【安装编译、更新、
2021-06-03 17:24:33 2670 3
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 13】
已消耗该Buffer完成通知事件消息接收处理:NuPlayerDecoder接收的【kWhatRenderBuffer】已渲染Buffer完成事件应答消息备注:此时此处的已渲染Buffer指的是音频Buffer,而当该流程处理视频Buffer时视频帧却还未真正渲染,因此此流程就是处理视频帧渲染流程。因此看此处处理逻辑时,建议先看完上面音频处理流程和后面【4.2】小节的视频消耗渲染处理流程后,再来统一看此处处理。// [frameworks/av/media/libmediaplayerservice
2021-05-22 15:48:06 1009 2
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 12】【03】
承接上一章节分析:【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 12】【02】本系列文章分析的安卓源码版本:【Android 10.0 版本】推荐涉及到的知识点:Binder机制实现原理:Android C++底层Binder通信机制原理分析总结【通俗易懂】ALooper机制实现原理:Android native层媒体通信架构AHandler/ALooper机制实现源码分析Binder异常关闭监听:Android native层Death
2021-05-22 15:45:12 1002 15
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 12】【02】
承接上一章节分析:【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 12】【01】本系列文章分析的安卓源码版本:【Android 10.0 版本】推荐涉及到的知识点:Binder机制实现原理:Android C++底层Binder通信机制原理分析总结【通俗易懂】ALooper机制实现原理:Android native层媒体通信架构AHandler/ALooper机制实现源码分析Binder异常关闭监听:Android native层Death
2021-05-22 15:43:59 1035
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 12】【01】
承接上一章节分析:【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 10】本系列文章分析的安卓源码版本:【Android 10.0 版本】推荐涉及到的知识点:Binder机制实现原理:Android C++底层Binder通信机制原理分析总结【通俗易懂】ALooper机制实现原理:Android native层媒体通信架构AHandler/ALooper机制实现源码分析Binder异常关闭监听:Android native层DeathReci
2021-05-22 15:42:13 704 1
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 11】
onOutputFormatChanged()实现分析:回调输出数据格式改变通知处理流程,此处理过程比较重要,它将会在软音频解码器即非offload音频播放模式时触发AudioSink的open打开处理流程。它将会回调【CB_OUTPUT_FORMAT_CHANGED】事件消息给NuPlayerDecoder,最后发出【kWhatVideoSizeChanged】事件给NuPlayer通知上层APP。并可能也会更改AudioSink侧的audio配置// [frameworks/av/media/li
2021-05-21 00:10:20 819 1
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 10】【02】
承接上一章节分析:【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 10】【01】本系列文章分析的安卓源码版本:【Android 10.0 版本】推荐涉及到的知识点:Binder机制实现原理:Android C++底层Binder通信机制原理分析总结【通俗易懂】ALooper机制实现原理:Android native层媒体通信架构AHandler/ALooper机制实现源码分析Binder异常关闭监听:Android native层Death
2021-05-21 00:06:35 1061 6
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 10】【01】
【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 8】推荐涉及到的知识点:Binder机制实现原理:Android C++底层Binder通信机制原理分析总结【通俗易懂】ALooper机制实现原理:Android native层媒体通信架构AHandler/ALooper机制实现源码分析Binder异常关闭监听:Android native层DeathRecipient对关联进程(如相关Service服务进程)异常关闭通知事件的监听实现源码分析
2021-05-21 00:04:41 686 2
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 9】
doRequestBuffers()实现分析:返回true时表示本次Buffer数据填充不足,因此必须请求填充更多数据备注:通过下面的分析可知,该方法会在fetchInputData执行时,若无解析数据Buffer时会进行线程wait,等待解析数据生产者端添加缓冲区队列后进行唤醒继续获取Buffer数据。也就是说对于NuPlayerDecoder中的线程可能会被此流程处理而阻塞。接下来关于GenericSource模块中的处理流程涉及早前流程已有分析时后续分析只会提醒一下,具体请参见前面prepare
2021-05-18 23:19:30 616
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 8】【02】
承接上一章节分析:【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 8】【01】本系列文章分析的安卓源码版本:【Android 10.0 版本】推荐涉及到的知识点:Binder机制实现原理:Android C++底层Binder通信机制原理分析总结【通俗易懂】ALooper机制实现原理:Android native层媒体通信架构AHandler/ALooper机制实现源码分析Binder异常关闭监听:Android native层DeathR
2021-05-18 23:17:46 512
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 8】【01】
onInputBufferFetched(msg)实现分析:输入Buffer获取请求// [frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp]bool NuPlayer::Decoder::onInputBufferFetched(const sp<AMessage> &msg) { if (mCodec == NULL) { ALOGE("[%s] onInputB
2021-05-18 23:16:28 719 2
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 7】【03】
承接上一章节分析:【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 7】【02】本系列文章分析的安卓源码版本:【Android 10.0 版本】【此章节小节编号就接着上一章节排列】1.2.1、/* size_t index = */updateBuffers(kPortIndexInput, msg)实现分析:更新填充(输入或输出)Buffer// [frameworks/av/media/libstagefright/MediaCodec.
2021-05-18 23:10:14 945
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 7】【02】
承接上一章节分析:【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 7】【01】本系列文章分析的安卓源码版本:【Android 10.0 版本】【此章节小节编号就接着上一章节排列】dequeueBufferFromNativeWindow()实现分析:// [frameworks/av/media/libstagefright/ACodec.cpp]ACodec::BufferInfo *ACodec::dequeueBufferFromNa
2021-05-18 23:07:27 824
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 7】【01】
承接上一章节分析:【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 4】【03】本系列文章分析的安卓源码版本:【Android 10.0 版本】【此章节小节编号将重新排序】onOMXEvent()接收处理执行:前面小节已分析过该方法可以是BaseState父类状态的具体子类状态实现者进行重写,处理自身业务。但也会有默认父类该方法处理。而对于该方法的所有涉及到的该方法实现的状态实现,如下截图中从上面的实现可知,有这么多个状态实现了该方法,而目
2021-05-18 23:04:00 871
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 3】【02】
承接上一章节分析:【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 3】【01】本系列文章分析的安卓源码版本:【Android 10.0 版本】【此章节小节编号就接着上一章节排列】10.1.1、new Decoder(notify, mSource, mPID, mUID, mRenderer, mSurface, mCCDecoder)实现分析:创建新的视频解码器。这几个参数前面章节已分析过。Decoder类声明:【省略其他代码】// [
2021-05-17 16:58:37 1358
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 6】【04】
承接上一章节分析:【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 6】【03】本系列文章分析的安卓源码版本:【Android 10.0 版本】【此章节小节编号就接着上一章节排列】6.1、setupRawAudioFormat(encoder ? kPortIndexInput : kPortIndexOutput, sampleRate, numChannels)实现分析:初始化原始音频格式(输入输出端口buffer格式)信息。备注:后续音
2021-05-15 13:53:40 831
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 6】【03】
承接上一章节分析:【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 6】【02】本系列文章分析的安卓源码版本:【Android 10.0 版本】【此章节小节编号就接着上一章节排列】5.5.1.1、getColorConfigFromFormat(format, &range, &standard, &transfer)实现分析:其实就是获取视频原始格式中对应的配置信息// [frameworks/av/media/li
2021-05-15 13:53:29 812 2
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 6】【02】
承接上一章节分析:【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 6】【01】本系列文章分析的安卓源码版本:【Android 10.0 版本】【此章节小节编号就接着上一章节排列】5.1、GetVideoCodingTypeFromMime(mime, &compressionFormat)实现分析:根据mime格式获取对应的OMX支持的视频编码类型枚举// [frameworks/av/media/libstagefright/AC
2021-05-14 20:50:18 752 8
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 6】【01】
3、setPortMode(kPortIndexOutput, IOMX::kPortModeDynamicANWBuffer)实现分析:设置输出缓冲区buffer端口模式为 kPortModeDynamicANWBuffer 即会使用ANativeWindowBuffer来传递已解码输出数据。
2021-05-14 20:47:59 2794 18
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 5】【02】
承接上一章节分析:【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 5】【01】本系列文章分析的安卓源码版本:【Android 10.0 版本】【此章节小节编号就接着上一章节排列】1、setComponentRole(encoder /* isEncoder */, mime)实现分析:设置组件角色信息// [frameworks/av/media/libstagefright/ACodec.cpp]status_t ACodec::set
2021-05-14 20:36:02 1453
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 5】【01】
承接上一章节分析:【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 4】本系列文章分析的安卓源码版本:【Android 10.0 版本】【此章节小节编号将重新排序】mCodec->configureCodec(mime.c_str(), msg)实现分析:ACodec配置编解码器。【备注:该章节分析的该配置处理流程非常长】// [frameworks/av/media/libstagefright/ACodec.cpp]status_
2021-05-14 20:33:17 1018 2
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 4】【06】
承接上一章节分析:【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 4】【05】本系列文章分析的安卓源码版本:【Android 10.0 版本】【此章节小节编号就接着上一章节排列】8.3.2.4.2、useGraphicBuffer_l(portIndex, omxBuffer.mGraphicBuffer, buffer)实现分析:使用图形Buffer从下面方法上英文注释非常明确该方法的使用提示,它只是个向后兼容方法,一旦OMX实现改变,该
2021-05-14 20:26:09 692
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 4】【05】
承接上一章节分析:【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 4】【04】本系列文章分析的安卓源码版本:【Android 10.0 版本】【此章节小节编号就接着上一章节排列】8.3.2.2、BufferInfo结构定义:缓冲区buffer信息结构定义,该结构非常重要,它将是编解码器工作时传递数据的载体。ACodec内部定义// [frameworks/av/media/libstagefright/include/media/stag
2021-05-14 20:23:56 721
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 4】【04】
承接上一章节分析:【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 4】【03】本系列文章分析的安卓源码版本:【Android 10.0 版本】【此章节小节编号就接着上一章节排列】8.3、mCodec->changeState(mCodec->mLoadedToIdleState)实现分析:扭转状态机状态为IDLE状态机实现者,根据最开始状态机实现分析可知,将会执行该状态实现的进入方法备注:该流程和前面的8.2流程将会在8.2流程
2021-05-14 20:21:38 1208
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 4】【03】
承接上一章节分析:【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 4】【02】本系列文章分析的安卓源码版本:【Android 10.0 版本】【此章节小节编号就接着上一章节排列】8.2.1、handleMessage(*it)处理消息实现分析:OMXNodeInstance的该方法返回true才表明自身处理该事件类型备注:FILL_BUFFER_DONE该事件其实就是编解码器将指定buffer id的buffer(已编码或已解码)数据填充完
2021-05-14 20:19:07 872
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 4】【02】
承接上一章节分析:【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 4】【01】本系列文章分析的安卓源码版本:【Android 10.0 版本】【此章节小节编号就接着上一章节排列】4、rememberCodecSpecificData(format)实现分析:读取缓存编解码器特殊数据,CSD其实对应Codec Specific Data的缩写。对于H.264来说,"csd-0"和"csd-1"分别对应sps和pps;对于AAC来说,"csd-
2021-05-14 20:17:30 891
原创 【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 4】【01】
承接上一章节分析:【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 3】本系列文章分析的安卓源码版本:【Android 10.0 版本】【此章节小节编号将重新排列】onConfigure(format)实现分析:解码器配置工作,创建MediaCodec处理流程。// [frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp]...
2021-05-14 20:14:21 1451 2
原创 Android MediaPlayer整体架构源码分析 -【MediaCodec编解码器插件模块化注册和创建处理流程】【Part 7】【02】
承接上一章节分析:Android MediaPlayer整体架构源码分析 -【MediaCodec编解码器插件模块化注册和创建处理流程】【Part 7】【01】本系列文章分析的安卓源码版本:【Android 10.0 版本】推荐涉及到的知识点:Binder机制实现原理:Android C++底层Binder通信机制原理分析总结【通俗易懂】ALooper机制实现原理:Android native层媒体通信架构AHandler/ALooper机制实现源码分析Binder异常关闭监听:Android n
2021-04-22 23:38:19 1043
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人