自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(73)
  • 收藏
  • 关注

原创 使用匿名binder实现client向server端的死亡通知

匿名binder的一个常见使用场景分析。

2022-09-27 16:21:26 1876 2

原创 OMX标准接口OMX_EmptyThisBuffer机制详解

OMX标准接口OMX_EmptyThisBuffer机制详解。

2022-05-18 15:15:38 1633

原创 OMX标准接口OMX_FillThisBuffer机制详解

OMX标准接口OMX_FillThisBuffer机制详解。

2022-05-17 15:55:48 2278 2

原创 OMX组件消息回调机制详解

OMX与ACodec消息回调机制详解。

2022-05-10 20:39:02 1133

原创 OMX服务启动及加载

OMX服务的启动

2022-05-09 14:05:08 2508

原创 ACodec状态机分析

本文详细描述了ACodec的状态机原理,并配有完整的状态机总概图。

2022-05-06 15:51:47 1453

原创 MediaCodec(native)状态机分析

本文详细阐述了MediaCodec的各个状态机的发起及完成,并在末尾配备了一张状态机的总概图,用于帮助读者快速了解MediaCodec是如何维护其状态机的。

2022-05-05 11:41:56 981 1

原创 音视频编解码:FLV封装格式笔记

一、简介:FLV是一种既可以做直播又可以做点播的封装格式。FLV应该算是3G时代到4G时代初期时的产物,因为那个时候受限于带宽能力及存储限制,FLV以其良好的画质效果,更小的体积而备受青睐,当然,随着5G时代短视频和直播领域的兴起,当存储空间不再是瓶颈,FLV终会被MP4/TS等取代,FLV封装有较为严格的音视频编码限制,即FLV封装的音频格式以AAC/MP3/SPEEX为主,视频则以H264为主。FLV的封装格式比较简单,均以FLVTAG的形式存在,并且每一个TAG都是独立存在的。二、FLVTAG介绍

2021-12-27 15:16:19 1731

原创 音视频编解码:MP4封装格式笔记

一、简介:MP4封装格式以其跨平台特性而成为当前最常见的媒体封装格式之一。MP4文件由多个box组成,每个box存储不同的信息,且box之间会出现嵌套。MP4的box有很多,但最重要的顶层box主要有如下三个:ftyp:File Type Box,描述文件遵从的MP4规范与版本moov:Movie Box,媒体的metadata信息,有且仅有一个mdat:Media Data Box,存放实际的媒体数据,一般有多个每个box有两部分组成:box header 和 box body。box h

2021-12-27 11:03:40 2332

原创 音视频编解码:AAC音频格式笔记

一、了解AAC:AAC是Advanced Audio Coding简写,即高级音频编码,其压缩后的音质效果比MP3要好,是目前主流的音频压缩格式。AAC单独编码出来的流后缀为aac或者m4a(iPhone等产品)。AAC有两种数据传输格式:ADIF和ADTS。ADIF:整个流数据仅含有一个文件描述头,必须从头的明确定义处开始解析,适合本地播放文件;ADTS:每一个packet都有同步字,可以从流中的任意位置开始播放,适合流媒体传输;常见的的 AAC规格有三种:LC-AAC(最基本的),HE-AAC(

2021-12-16 15:10:50 1705

原创 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 870

原创 ijkplayer播放器剖析(六)视频同步与渲染机制分析

一、引言:在前面的博客中,将音频解码播放及视频解码都分析了,这篇博客将单独针对视频同步及渲染来分析,看下ijkplayer是如何做的。本博客分析的同步方式为以音频为主,视频去同步音频。二、同步前提的确认:ijkplayer的同步前提跟其他的播放器略有不同,在ijkplayer中,会创建用于维护音频,视频的时钟及一个外部时钟,所有的同步操作都是基于这三个时钟来进行的。具体的变量如下:Clock audclkClock vidclkClock extclk那么,对于同步而言,我们需要确认的是,音频

2021-05-06 14:43:10 1428

原创 ijkplayer播放器剖析(五)视频解码线程分析

一、引言:在上一篇博客中,将音频的解码和输出放在了一起分析,文章显得又长又冗杂,考虑到视频渲染及同步也是一个重点分析点,所以这篇博客仅分析视频解码相关的内容。因为ijkplayer和FFmpeg在音频和视频的处理上有很多共用代码,并且在上一篇博客中讲解的足够详细,所以对于视频解码的分析就直接以重点代码来分析了。二、MediaCodec解码通路分析:先来看下视频解码相关的通路,ijkplayer有一个option叫“async-init-decoder”,可以通过上层apk设置到底层中。这个option

2021-04-20 17:06:12 1096

原创 ijkplayer播放器剖析(四)音频解码与音频输出机制分析

一、引言:在前面的博客中,我们对ijkplayer整个jni的流程及消息机制都详细的分析了一遍,分析流程机制有助于我们对整个架构有一个大致的了解,便于后续对音视频解码与输出渲染的分析,消息机制的分析有助于我们理解FFmpeg是如何处理输入输出buffer的。接下来,我们先梳理下read_thread这个线程,然后再分析音频是如何解码和输出的。二、read_thread分析:read_thread函数非常长,我们只罗列出重点代码:static int read_thread(void *arg){

2021-04-19 16:18:57 1701

原创 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 654

原创 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 838 3

原创 ijkplayer播放器剖析(一)让ijkplayer播起来

一、引言:ijkplayer是一款对FFmpeg封装非常好的第三方开源播放器,遗憾的是,ijkplayer2.0似乎不开源,并且1.0版本更新也基本停止了,很多公司都会采用ijkplayer作为其播放应用的内核,这款集合软硬件编解码功能的播放器确实备受青睐,从这篇文章开始,将对ijkplayer播放器做一个剖析,希望对大家理解ijkplayer有一定的帮助,当然,不对的地方还望指正。二、环境搭建及编译:1.环境搭建:ijkplayer的GitHub地址如下:https://github.com/

2021-04-13 16:11:47 1883 1

原创 MediaCodec对接到OMX的简单分析

一、引言:nuplayer播放器是使用MediaCodec来进行编解码的,而OMX组件则是MediaCodec的解码核心,但是因为涉及的面太过底层,往往是芯片公司才会涉及到这一块,所以就做一个简单分析,对通路有个大致了解。二、...

2021-03-01 14:30:58 1746 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 409

原创 NuPlayer源码分析(三)视频帧处理分析及部分同步机制分析

一、引言:在上一篇博客中,分析了音频部分的buffer处理。nuplayer在音视频buffer的处理上共用了很多代码,这篇博客将直接从差异上开始分析,nuplayer的同步机制整体来说,和exoplayer大同小异,都是基于码流中的pts和系统时间来进行预估,并结合垂直同步信号时间点来确定最终的送显时间。不同点在于nuplayer对于送显时间的校准太过复杂,很多都看不懂,但是如果不重点关注校准的内容的话,其他部分还是很好理解的。二、确定视频帧送显时间:音视频的buffer处理函数很多都共用,我们直接

2021-02-22 16:33:03 1283 1

原创 NuPlayer源码分析(二)NuPlayer的音频buffer处理机制

一、引言:在上一篇博客,对nuplayer的创建流程有了一个分析,并且在末尾引入了输入输出buffer的处理出处,这篇博客将分析nuplayer对音频buffer的处理机制。先贴出输入输出buffer的核心处理函数:--------------------------------------------------------------------------onMessageReceived@frameworks\av\media\libmediaplayerservice\nuplayer\N

2021-02-04 16:04:32 1689 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 2294

原创 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 3292 2

原创 ExoPlayer播放器剖析(六)ExoPlayer同步机制分析

一、引言:在上篇博客中,分析了exoplayer对audiotrack的操作,包括创建过程,读取媒体流数据到codec,codec再将解码出来的pcm数据送到audiotrack等。这篇博客分析视频送显机制,实际上也是整个ExoPlayer的同步机制。二、同步机制分析:1.得到精确的音视频时间间隔:exoplayer的同步原理是视频去追音频,音频pts的获取是通过调用audiotrack的api接口拿到音频的时间戳,然后经过了比较复杂的校准之后,作为最终的音频时间戳送去给视频同步的,本博客不讨论音频

2021-01-22 09:55:32 3960 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 4015 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 4533

原创 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 4577 3

原创 ExoPlayer播放器剖析(二)编写exoplayer的demo

一、

2021-01-18 11:45:35 3941 3

原创 ExoPlayer播放器扩展(一)DASH流与HLS流简介

一、前言:exoplayer主要针对网络自适应流进行播放,从官方文档我们了解到,exoplayer支持的网络自适应流包括DASH、HLS和SmoothStreaming,下面对网络自适应流做一个简单介绍。二、DASH流简介:DASH流是基于HTTP的动态自适应流。MPEG-DASH通过把内容分割成小的基于HTTP的文件段序列,来进行流媒体播放。各个文件段可以设置成不同的比特率进行编码,以满足不同的客户端的网络需求。比如,DASH客户端可以根据当前的网络状况,自动选择对应的最匹配的比特率文件段下载,进行

2021-01-14 17:20:37 3254

原创 ExoPlayer播放器剖析(一)进入ExoPlayer的世界

一、前言ExoPlayer播放器是一款Google推出的应用级播放器,其本质是调用了MediaCodec组件进行音视频的解码及播放。ExoPlayer的源码非常复杂,抽空看了几周的源码过后,决定以博客的形式将之前整理的笔记同大家分享,希望对于刚接触ExoPlayer的新人能有一定的帮助和指导作用,当然,本人能力有限,有些分析不对的地方也恳请大家指正。先贴出一些重要的网址:GitHub工程地址ExoPlayer官方开发网址ExoPlayer的API查询网址二、官方资料总结:exoplayer

2021-01-14 14:52:31 5978 1

原创 音频多声道数据的操作

一、前言:近期因为项目中没有和硬件沟通好,导致在Android的alsa中录制数据时,硬件给过来的数据参数和需要的不一样,没办法,需要进行重采样,故看了下网上的重采样介绍,这里简单记录下。二、重采样算法:首先对录制的数据,当两声道及以上时,需要确认一点就是是否交织,这将决定我们的算法如何剥离数据。这是网上找到的关于交织与非交织数据的图示,简单来说,交织的数据就是对每一个采样点都写上所有声道的数据之后才进行下一个采样点的数据写入,而非交织则是按到声道个数,一次性写入所有的采样数据。在我本次的项目中

2020-09-14 14:23:25 875

原创 整理使用RecyclerView控件在长按删除事件中的用法(使用Kotlin)

一、前言:在最近的学习中,使用Recyclerview控件时,遇到需要长按删除的场景,在测试过程中,遇到各种崩溃,在这里总结一下:在本博客汇中,使用了一个统计学生信息的demo,并且用到了SQLite,这样保证长按删除的同时数据库也能同步数据,先上一下长按删除的效果图:二、代码分析:长按删除item最重要的是要确保数据库的同步进行。1.Student类代码:class Student(val name: String, val gender: String, val age: Int) {}

2020-08-17 11:30:57 1386

原创 解决使用kotlin编写OkHttp的网络请求时遇到的OOM问题

一、背景介绍:问题的出现是因为我的代码中需要进行网络请求,而网络请求又是在一个线程中,间隔几秒就会请求一次,为了方便,就是用的OkHttp进行网络访问,本来,是没问题的,谁知道,某次测试时间长了一点,然后apk就突然闪退了,看了下log,是因为大量创建了线程,栈被撑爆了,OOM,遂卒~,通过网上找资料,最终查明原因是OkHttp的client没有进行单实例封装,每发一次请求,就会创建一个线程池,最终OOM,下面就这个问题,单独写了一个demo进行问题模拟及解决。二、模拟复现:1.OkHttp的异步访问

2020-07-15 17:29:41 1679

原创 Android中使用任意activity操作同一数据库的方法(使用kotlin编写)

一、引言:Android中经常会遇到在多个activity中需要对同一个数据库进行操作的场景,这里写了一个简单demo来说明这种情况的实现原理,下图是一个GIF(凑合看下效果,CSDN允许上传的git文件太小,经过多次丢帧勉强上传,但效果快失真了):编写了两个activity对同一数据库(student,包含name和age两个元素)进行增删改查的操作,Android中提供了SQLiteOpenHelper类对SQLite进行操作,下面对各个代码进行讲解。二、创建的一个继承SQLiteOpenHel

2020-06-30 15:49:08 1901

原创 Android中让控件在布局中任意位置摆放的xml配置方法

一、引入:Android中常用的布局方式有三种,LinearLayout、RelativeLayout和FrameLayout,相较于后面一种的场景局限性,前两者使用的场景更多。在实际开发中,我们经常会遇到下面一种情况,如何将控件在布局当中的任意位置进行摆放,前面两种布局都可以做到,当然,更加推荐使用相对布局(RelativeLayout),比如类似下面的这种控件摆放场景,直接上效果图:为了区别布局和控件,我们分别对其进行了背景色的设置,可以看到,所有的控件是垂直分布的,他们距离边框或者其它控件的位置

2020-06-28 14:55:51 8554

原创 设计模式之适配器模式

一、适配器模式概述:适配器模式不是在设计阶段考虑的,而是在系统服役阶段使用的,通常用于拓展新需求。这个模式跟装饰模式类似,都是做了一个包装,只不过该**模式的定义是将一个类的接口变换成客户端所期待的另一种接口, 从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。**在实际应用中,适配器分为类适配器和对象适配器。二、类适配器及其demo:图中的adapter就是适配器,其本质相当...

2020-01-14 09:50:47 124

原创 设计模式之责任链模式与装饰模式

一、责任链模式简介:责任链模式的核心就是“链”,使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。责任链模式的缺点是性能问题,每个请求都是从链头遍历到链尾,特别是在链比较长的时候, 性能是一个非常大的问题。二、责任链模式demo:责任链模式作者选取的demo是古代妇女的“三从”,也就是说一个妇女在古...

2020-01-13 09:49:47 1256 1

原创 设计模式之中介者模式与命令模式

一、引言:中介者模式用于处理多个类高耦合的场景,类似于星型拓扑结构,在该结构中抽象出一个中介者,并配备同事类,实现不同的业务逻辑。该模式有三部分组成:中介者-同事-业务实现类。抽象中介者定义统一的接口,用于各同事角色之间通信,具体中介者用于协调各同事角色最终的协作,必须依赖各个同事,同事角色不能与其他同事类有依赖,如果需要的话,必须通过中介者才能完成。中介者的模式好处是减少类中的依赖,降...

2020-01-09 16:34:50 841 1

原创 设计模式之原型模式及clone涉及的深拷贝与浅拷贝探究

一、原型模式介绍:原型模式的核心就一个clone方法。试想如下的场景,一个对象需要被多个修改者修改或者需要大量的对象但每个对象仅修改一些细节,比如,银行给不同客户发送的具有尊称的定制化信息。不通过new关键字来产生一个对象, 而是通过对象复制来实现的模式就叫做原型模式。原型模式理解上比较简单,但是难点在于正确理解java中的clone方法,需要注意clone对引用类型进行的是浅拷贝(数组,st...

2020-01-09 11:49:45 211

原创 设计模式之模板方法模式和建造者模式

一、引言:模板方法模式非常简单,每个人在java代码编写中都会用到,其方针图如下:实际上,模板方法模式核心就是java的继承机制,父类叫做抽象模板,里面的方法分为两类:一类是基本方法,就是需要子类具体实现的方法,这类方法如果不需要过多的暴露接口,通常使用protected关键字声明,另一类就是模板方法,这类都是具体实现方法,完成固定逻辑,由父类完成,通常,在前面会加上关键字final,防止覆...

2020-01-07 10:20:57 254

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除