
Android媒体
文章平均质量分 88
丽萨的托马斯
这个作者很懒,什么都没留下…
展开
-
OMX标准接口OMX_EmptyThisBuffer机制详解
OMX标准接口OMX_EmptyThisBuffer机制详解。原创 2022-05-18 15:15:38 · 2103 阅读 · 0 评论 -
OMX标准接口OMX_FillThisBuffer机制详解
OMX标准接口OMX_FillThisBuffer机制详解。原创 2022-05-17 15:55:48 · 2820 阅读 · 2 评论 -
OMX组件消息回调机制详解
OMX与ACodec消息回调机制详解。原创 2022-05-10 20:39:02 · 1453 阅读 · 0 评论 -
OMX服务启动及加载
OMX服务的启动原创 2022-05-09 14:05:08 · 2988 阅读 · 0 评论 -
ACodec状态机分析
本文详细描述了ACodec的状态机原理,并配有完整的状态机总概图。原创 2022-05-06 15:51:47 · 1791 阅读 · 0 评论 -
MediaCodec(native)状态机分析
本文详细阐述了MediaCodec的各个状态机的发起及完成,并在末尾配备了一张状态机的总概图,用于帮助读者快速了解MediaCodec是如何维护其状态机的。原创 2022-05-05 11:41:56 · 1427 阅读 · 1 评论 -
MediaPlayer的消息机制分析
一、引子:先贴一段log:08-18 21:57:20.110 11775 11812 V MediaPlayer: resetDrmState: mDrmInfo=null mDrmProvisioningThread=null mPrepareDrmInProgress=false mActiveDrmScheme=false08-18 21:57:20.110 11775 11775 E MediaPlayerNative: error (-38, 0)08-18 21:57:20.110原创 2021-10-08 20:52:56 · 1052 阅读 · 0 评论 -
ijkplayer播放器剖析(六)视频同步与渲染机制分析
一、引言:在前面的博客中,将音频解码播放及视频解码都分析了,这篇博客将单独针对视频同步及渲染来分析,看下ijkplayer是如何做的。本博客分析的同步方式为以音频为主,视频去同步音频。二、同步前提的确认:ijkplayer的同步前提跟其他的播放器略有不同,在ijkplayer中,会创建用于维护音频,视频的时钟及一个外部时钟,所有的同步操作都是基于这三个时钟来进行的。具体的变量如下:Clock audclkClock vidclkClock extclk那么,对于同步而言,我们需要确认的是,音频原创 2021-05-06 14:43:10 · 1766 阅读 · 0 评论 -
ijkplayer播放器剖析(五)视频解码线程分析
一、引言:在上一篇博客中,将音频的解码和输出放在了一起分析,文章显得又长又冗杂,考虑到视频渲染及同步也是一个重点分析点,所以这篇博客仅分析视频解码相关的内容。因为ijkplayer和FFmpeg在音频和视频的处理上有很多共用代码,并且在上一篇博客中讲解的足够详细,所以对于视频解码的分析就直接以重点代码来分析了。二、MediaCodec解码通路分析:先来看下视频解码相关的通路,ijkplayer有一个option叫“async-init-decoder”,可以通过上层apk设置到底层中。这个option原创 2021-04-20 17:06:12 · 1403 阅读 · 0 评论 -
ijkplayer播放器剖析(四)音频解码与音频输出机制分析
一、引言:在前面的博客中,我们对ijkplayer整个jni的流程及消息机制都详细的分析了一遍,分析流程机制有助于我们对整个架构有一个大致的了解,便于后续对音视频解码与输出渲染的分析,消息机制的分析有助于我们理解FFmpeg是如何处理输入输出buffer的。接下来,我们先梳理下read_thread这个线程,然后再分析音频是如何解码和输出的。二、read_thread分析:read_thread函数非常长,我们只罗列出重点代码:static int read_thread(void *arg){原创 2021-04-19 16:18:57 · 2092 阅读 · 0 评论 -
ijkplayer播放器剖析(三)消息机制分析
一、引言:上一篇博客中分析了ijkplayer的整个流程,相信大家对其中的消息队列看的也是云里雾里的,所以这里单独会ijkplayer的消息机制做一个分析。二、代码分析:先看下消息机制是怎么创建起来的。创建的发起是native_setup函数:static voidIjkMediaPlayer_native_setup(JNIEnv *env, jobject thiz, jobject weak_this){ MPTRACE("%s\n", __func__); IjkMedi原创 2021-04-16 16:56:17 · 897 阅读 · 0 评论 -
ijkplayer播放器剖析(二)从应用层分析至Jni层的流程分析
一、引言:在上一篇博客中,介绍了ijkplayer的编译及demo的使用,这篇博客将从应用层入手分析,看ijkplayer是如何调入到jni层的。二、Java层代码分析:选择码流进行播放时,将会跳转到VideoActivity,看一下onCreate:onCreate@ijkplayer\android\ijkplayer\ijkplayer-example\src\main\java\tv\danmaku\ijk\media\example\activities\VideoActivity.jav原创 2021-04-15 17:03:11 · 993 阅读 · 3 评论 -
ijkplayer播放器剖析(一)让ijkplayer播起来
一、引言:ijkplayer是一款对FFmpeg封装非常好的第三方开源播放器,遗憾的是,ijkplayer2.0似乎不开源,并且1.0版本更新也基本停止了,很多公司都会采用ijkplayer作为其播放应用的内核,这款集合软硬件编解码功能的播放器确实备受青睐,从这篇文章开始,将对ijkplayer播放器做一个剖析,希望对大家理解ijkplayer有一定的帮助,当然,不对的地方还望指正。二、环境搭建及编译:1.环境搭建:ijkplayer的GitHub地址如下:https://github.com/原创 2021-04-13 16:11:47 · 2245 阅读 · 1 评论 -
MediaCodec对接到OMX的简单分析
一、引言:nuplayer播放器是使用MediaCodec来进行编解码的,而OMX组件则是MediaCodec的解码核心,但是因为涉及的面太过底层,往往是芯片公司才会涉及到这一块,所以就做一个简单分析,对通路有个大致了解。二、...原创 2021-03-01 14:30:58 · 2033 阅读 · 1 评论 -
NuPlayer源码分析(四)NuPlayer在Android Q与Android 5.1版本上的差异对比
一、引言:因为之前方便本地调试,所以对于nuplayer的分析是基于Android5.1版本的,在熟悉了整个架构之后,在AndroidQ版本上对nuplayer的所有流程做了一个分析,发现变动不是特别大,主要体现在三个方面:1.将5.1版本用于协调解码及渲染的主动循环改为了MediaCodec的消息回调方式; 2.handleAnInputBuffer和handleAnOutputBuffer均变为了MediaCodec的消息回调方式; 3.修正了视频帧校准的bug;二、消息回调的分析:Androi原创 2021-02-23 17:08:07 · 479 阅读 · 0 评论 -
NuPlayer源码分析(三)视频帧处理分析及部分同步机制分析
一、引言:在上一篇博客中,分析了音频部分的buffer处理。nuplayer在音视频buffer的处理上共用了很多代码,这篇博客将直接从差异上开始分析,nuplayer的同步机制整体来说,和exoplayer大同小异,都是基于码流中的pts和系统时间来进行预估,并结合垂直同步信号时间点来确定最终的送显时间。不同点在于nuplayer对于送显时间的校准太过复杂,很多都看不懂,但是如果不重点关注校准的内容的话,其他部分还是很好理解的。二、确定视频帧送显时间:音视频的buffer处理函数很多都共用,我们直接原创 2021-02-22 16:33:03 · 1568 阅读 · 1 评论 -
NuPlayer源码分析(二)NuPlayer的音频buffer处理机制
一、引言:在上一篇博客,对nuplayer的创建流程有了一个分析,并且在末尾引入了输入输出buffer的处理出处,这篇博客将分析nuplayer对音频buffer的处理机制。先贴出输入输出buffer的核心处理函数:--------------------------------------------------------------------------onMessageReceived@frameworks\av\media\libmediaplayerservice\nuplayer\N原创 2021-02-04 16:04:32 · 2086 阅读 · 4 评论 -
NuPlayer源码分析(一)梳理NuPlayer的创建流程
一、前言:之前的博客,有分析过Awesome player,但是随着Android版本的升高,Awesome已经被淘汰,现在的消费电子产品,更青睐于使用Android原生的NuPlayer,NuPlayer是一款native层的应用级播放器,使用的是Android更为推崇的MediaCodec组件,下层和Awesome一样,也是基于omx来解码的,从这篇博客开始,将基于Android5.1版本对NuPlayer源码进行一个分析。本博客先来梳理NuPlayer的创建流程,看下nuplayer是如何调用到Me原创 2021-01-29 17:09:06 · 2804 阅读 · 0 评论 -
ExoPlayer播放器剖析(七)ExoPlayer对音频时间戳的处理
一、前言:在exoplayer的同步机制分析制中,我们知道所有的处理前提都是基于音频的时间戳来执行的。因为exoplayer对音频的时间戳处理很繁琐,所以,单独编写一篇博客来分析。二、代码分析:1.音视频时间戳的更新点:时间戳的更新是在doSomeWork那个大循环里面去执行的,也就是说,每10ms进行一次更新:doSomeWork@ExoPlayer\library\core\src\main\java\com\google\android\exoplayer2\ExoPlayerImplInt原创 2021-01-26 16:05:08 · 4024 阅读 · 2 评论 -
ExoPlayer播放器剖析(六)ExoPlayer同步机制分析
一、引言:在上篇博客中,分析了exoplayer对audiotrack的操作,包括创建过程,读取媒体流数据到codec,codec再将解码出来的pcm数据送到audiotrack等。这篇博客分析视频送显机制,实际上也是整个ExoPlayer的同步机制。二、同步机制分析:1.得到精确的音视频时间间隔:exoplayer的同步原理是视频去追音频,音频pts的获取是通过调用audiotrack的api接口拿到音频的时间戳,然后经过了比较复杂的校准之后,作为最终的音频时间戳送去给视频同步的,本博客不讨论音频原创 2021-01-22 09:55:32 · 4957 阅读 · 5 评论 -
ExoPlayer播放器剖析(五)ExoPlayer对AudioTrack的操作
一、引言:上一篇博客中,分析了doSomeWork中的renderer.render接口和startRenderers方法,其中,在介绍后者的时候有提过对音频的操作实际上调用了AudioTrack的play()方法进行播放,缺并没有提到audiotrack的创建过程,所以这篇博客着重介绍下ExoPlayer对AudioTrack的操作。二、AudioTrack的创建:audiotrack的创建是在renderer.render中完成的,回到render方法, 我们层贴出过下面的代码片段: @Ove原创 2021-01-20 16:20:41 · 4884 阅读 · 2 评论 -
ExoPlayer播放器剖析(四)从renderer.render函数分析至MediaCodec
关联博客ExoPlayer播放器剖析(一)进入ExoPlayer的世界ExoPlayer播放器剖析(二)编写exoplayer的demoExoPlayer播放器剖析(三)流程分析—从build到prepare看ExoPlayer的创建流程ExoPlayer播放器剖析(四)从renderer.render函数分析至MediaCodecExoPlayer播放器扩展(一)DASH流与HLS流简介一、引言:在上一篇博客中,我们对exoplayer的流程做了一个分析,可以看到,exoplayer的初原创 2021-01-19 14:19:05 · 5263 阅读 · 0 评论 -
ExoPlayer播放器剖析(三)流程分析---从build到prepare看ExoPlayer的创建流程
一、前言:上一篇博客介绍了exoplayer的简单demo,对流程有了一个大致的了解,我们都知道exoplayer的本质是调用Android原生的MediaCodec接口,这篇博客将着重分析其内部实现逻辑,看exoplayer是如何层层封装至MediaCodec的。二、源码分析:先贴出下上篇博客中讲exoplayer初始化的五步曲: private fun initPlayer(playUri: String?) { if (playUri == null){原创 2021-01-19 09:53:12 · 5518 阅读 · 3 评论 -
ExoPlayer播放器剖析(二)编写exoplayer的demo
一、原创 2021-01-18 11:45:35 · 4646 阅读 · 3 评论 -
ExoPlayer播放器扩展(一)DASH流与HLS流简介
一、前言:exoplayer主要针对网络自适应流进行播放,从官方文档我们了解到,exoplayer支持的网络自适应流包括DASH、HLS和SmoothStreaming,下面对网络自适应流做一个简单介绍。二、DASH流简介:DASH流是基于HTTP的动态自适应流。MPEG-DASH通过把内容分割成小的基于HTTP的文件段序列,来进行流媒体播放。各个文件段可以设置成不同的比特率进行编码,以满足不同的客户端的网络需求。比如,DASH客户端可以根据当前的网络状况,自动选择对应的最匹配的比特率文件段下载,进行原创 2021-01-14 17:20:37 · 3831 阅读 · 0 评论 -
ExoPlayer播放器剖析(一)进入ExoPlayer的世界
一、前言ExoPlayer播放器是一款Google推出的应用级播放器,其本质是调用了MediaCodec组件进行音视频的解码及播放。ExoPlayer的源码非常复杂,抽空看了几周的源码过后,决定以博客的形式将之前整理的笔记同大家分享,希望对于刚接触ExoPlayer的新人能有一定的帮助和指导作用,当然,本人能力有限,有些分析不对的地方也恳请大家指正。先贴出一些重要的网址:GitHub工程地址ExoPlayer官方开发网址ExoPlayer的API查询网址二、官方资料总结:exoplayer原创 2021-01-14 14:52:31 · 7024 阅读 · 1 评论 -
Android原生MediaPlayer调用时序图
一、引言:最近公司的同事经常会问我apk调用mediaplayer接口之后,native层的调用逻辑是什么样的,什么时候去打分播放器,什么时候创建native层的播放器等等,虽说mediaplayer在Android系统仅仅是一个“壳”,但是因为同时涉及apk和下层native,况且,这里面又借助了mediaplayerservice这么个binder服务,所以我花了些时间对整个mediapla...原创 2019-12-18 11:52:58 · 1694 阅读 · 1 评论 -
MediaCodec的简单测试sample及部分代码摘要
一、引言:mediacodec在framework层的代码逻辑确实比较复杂,因为对整个通路还不是很熟悉,所以这里摘要一些代码的查看心得,并在网上找了一个demo来了解一下mediacodec是怎么工作的。二、测试demo:测试代码摘录自何俊林,demo主要演示了如何渲染一个视频流文件到显示设备上:MediaCodec测试demo三、代码心得:1.mediacodec与omx的调用逻辑:...原创 2019-11-05 10:38:01 · 1059 阅读 · 0 评论 -
ACodec从UninitializedState状态到LoadedState状态分析
一、引言:mediacodec在应用层的逻辑时序图如下(create->start):进入到native层之后,mediacodec会先去实例化本对象,然后执行init操作,init函数关键代码贴出如下:MediaCodec.cppstatus_t MediaCodec::init(const AString &name, bool nameIsType, bool e...原创 2019-10-25 10:06:06 · 764 阅读 · 0 评论 -
Acodec是如何通过其维护的状态来处理AMessage的?
一、问题引言:初读mediacodec的代码,分析了stagefright框架中大量使用的AHandler、ALooper和AMessage组成的消息机制,我们知道每个AHandler都会通过ALooper去发送消息,然后,最终通过ALooper的loop函数将AMessage分发到各自的AHandler进行处理,但在Acodec中,明明仅ACodec是一个AHandler,为什么处理消息的时候...原创 2019-10-24 11:11:12 · 705 阅读 · 1 评论 -
MediaCodec中的AHandler、ALooper和AMessage机制简单分析
一、 前言:Android媒体通路中,大量充斥着AHandler、ALooper和AMessage的消息机制,之前简单分析了一下java层的消息机制,而native层的消息机制同java层原理类似,但又有一些区别,所以单独拿来分析一下,在nuplayer和mediacodec中随处可见这种异步机制。三者的简单概括:AMessage:我们要发送的消息,类似于一个“包裹”,“邮件”;AHand...原创 2019-10-17 17:58:42 · 1657 阅读 · 2 评论 -
AwesomePlayer架构梳理三:音频处理
一、 简介:awesomeplayer中的音频处理是如下分级的:AwesomePlayer/└── AudioPlayer ├── AudioSink └── AudioTrack二、 awesomeplayer流程:上层mediaplayer调用start指令之后,stagefrightplayer调用的是awesomeplayer的play指令:status_t ...原创 2019-10-09 16:12:56 · 558 阅读 · 0 评论 -
AwesomePlayer架构梳理二:解码器创建
一、上层prepare动作:frameworks\av\media\libstagefright\AwesomePlayer.cppmediaplayer调用prepare操作,awesomeplayer执行prepare动作,函数调用顺序如下:prepare()->prepare_l()->prepareAsync_l():status_t AwesomePlayer::p...原创 2019-10-09 12:00:31 · 257 阅读 · 0 评论 -
AwesomePlayer架构梳理一:构造与解析器的创建
一、 stagefrightplayer引入:mediaplayerservice会在MediaPlayerFactory.cpp中根据URL进行打分,选择出最适合的播放器,对于Android原生的播放器,有stagefrightplayer和nuplayerdriver,Stagefrightplayer是对awesomeplayer的封装,nuplayerdriver是对nuplayer的封...原创 2019-10-09 11:10:11 · 380 阅读 · 0 评论 -
mediaplayer在native层的C/S架构关系
一、前言:本文内容旨在分析native层中mediaplayer是如何获取mediaplayerservice服务的以及他们之间是如何建立联系的,内容前提是建立在你已经知道mediaplayer从java到jni的调用并且熟悉Android中的binder机制。二、mediaserver的建立:还是老生常谈的mediaserver的建立:frameworks\av\media\media...原创 2019-10-08 16:43:28 · 807 阅读 · 0 评论