- 博客(52)
- 资源 (7)
- 收藏
- 关注

原创 Android中间层分析2.【media】Android 音视频学习路线总结 --总纲目录
我们这篇开始一起研究Android多媒体的框架,有兴趣的同学可以和我们一起学习多媒体的内容。下面给出大概学习的路径也就是知识点,从简单的多媒体知识,到Android多媒体框架是一个渐进的过程。中间有些内容不一定会写,但是大概学习的思路是这样的,如果没有写道的请大家脑部下。Android media在android架构中比较重要的一个服务框架,用的是cpp写的,不同于ams、wms等,需要大家有c语言的基础。我们这里重点会介绍mediaplayerservice,当然也会涉及到媒体扫描和audiofling
2020-08-19 20:52:38
516

原创 Android中间层分析1.【AMS】进程的启动-概述
我们知道进程的启动,最终都会进入到startProcessLocked函数中,如图我们看下有几种情况首先们关注有四个startProcessLocked接口重载的情况。但是他们最终都会调到统一的startProcessLocked。也就是最末尾的函数。下面一一介绍几种进程启动的情况:1、LocalService.startIsolatedProcess---->ams.startIsolatedProcessams为应用提供的local service 服务。启动一个孤立的进程。2、ams
2020-06-29 10:51:42
5524
原创 Android其他4-art相关的学习
Android art的学习一、代码分析1.1.Java环境启动过程1.1.1.从zygote开始1.1.2.JniInvocation 里面的初始化过程1.1.3.JavaVM 和 JNIEnv 的初始化-就是java环境的建立1.1.4.JNI_CreateJavaVM 对运行时 oat文件的加载1.1.5.JNI_CreateJavaVM 对运行时 classlinker的建立classlinker的建立1.2.java运行时环境的建立1.2.1.从Runtime.start开始1.2.2.jit的建
2021-10-25 16:00:57
1115
原创 操作系统学习-4.Linux进程调度学习3-调度整体过程
调度整体过程周期性调度过程我们从 在timer.c中开始分析 void update_process_times(int user_tick){ struct task_struct *p = current; /* Note: this timer irq context must be accounted for as well. */ account_process_tick(p, user_tick); run_local_ti
2021-10-21 15:05:00
180
原创 操作系统学习-4.Linux进程调度学习2-调度器源码分析
调度器源码分析入口核心函数分析主要函数__schedule分析pick_next_task 函数分析以cfs为例看看如何选取task代码分析根据3.10版本通过对前面的学习我们知道Linux的调度分为两种周期调度 完成周期性算法参数的更新和系统其它实际的检查主调的 真正的调度过程我们现在来看下主调的的代码框架。入口根《调度发生的情况》的学习,我们知道所有的调度最后都会到 schedule 函数中。因此我们就先从schedule函数入手。 asmlinkage void __sch
2021-10-21 14:56:08
255
原创 操作系统学习-4.Linux进程调度学习1-进程调度原理
进程调度原理简单分析多个调度算法加入组调度简单分析假设我的系统只有一种调度算法cfs那么有个调度的队列 cfs_rq所有running的进程都会 进入这个队列,不在running 或者其他情况会出队列,ok。则假设队列控制的算法有以下。cfs_rq_enqueuecfs_rq_dequeuecfs_rq_pick所操作的是进程描述符 task_struck.那么很简单可以理解上述过程scehed_pick ---->cfs_rq_pick就行了。多个调度算法那么如果除了cfs
2021-10-21 14:47:31
193
原创 操作系统学习-3.Linux文件系统学习4-IO调度算法
IO调度算法电梯算法简介基础原理基础函数梳理数据结构电梯初始化过程电梯算法noop电梯算法deadline初始化算法详解电梯算法简介电梯调度算法主要适用于LINUX I/O磁盘请求调度。磁盘结构如下图所示,磁盘主要由盘面和磁头组成。磁盘每次进读写请求时,需要给磁盘驱动器一个地址,磁盘驱动器根据给定地址计算出相应的扇区,然后将磁头移动到需要访问的扇区,开始进行读写。读写磁盘时,转动磁头实际上很耗费时间,如果不采用调度策略,磁头直接根据请求进行直接访问,则必定会造成时间的浪费。比如以下这种访问方式,
2021-10-21 14:32:39
347
原创 操作系统学习-3.Linux文件系统学习3-io的plug过程
io的plug过程io的plug过程:启动篇io的plug过程:request请求io的plug过程:blk_init_queue1、这个request_count 个数的统计2、blk_flush_plug_list进行泄洪我们还要继续看io的plug过程:blk_flush_plug_list的情况io的plug过程:queuelist的问题io的plug过程:启动篇include/linux/blkdev.hstruct blk_plug { struct list_head list; /
2021-10-21 12:04:09
507
原创 操作系统学习-3.Linux文件系统学习2-IO过程分析
IO过程分析io调度框架整体流程细节展开io的提交过程从pagecache到bio到requstsubmit_bioio调度框架整体流程细节展开io的提交过程从pagecache到bio到requst我们从read流程和write流程中都知道,最后都会到readpages或者writepages中来我们就从readpage开始分析,write的基本上和《Linux-块设备驱动之框架详细分析(详解)》讲的差不多,也就是会到ll_rw_block函数中,至于怎么到这个函数中,就不求甚解了。
2021-10-21 11:44:44
480
原创 操作系统学习-3.Linux文件系统学习1-初始化和read、write过程分析
初始化和read、write过程分析整体框架图vfs系统类关系图vfs层次关系通初始化过程文件read流程分析文件read和BIO调度分析文件write过程分析整体框架图vfs系统类关系图vfs层次关系通初始化过程在内核启动的主函数中start_kernel(){ vfs_caches_init_early(); vfs_caches_init(); rest_init();}rest_init() { kernel_init();}kernel_init() {
2021-10-21 11:32:32
612
原创 操作系统学习-2.操作系统的内存初始化和使用
2.操作系统的内存初始化和使用一.物理内存探测1.1.探测物理内存分布和大小的方法1.2.物理内存探测的实现二、内存划分2.1.使用页单位划分物理内存2.2.使能页机制2.3.寻址过程--关于段页和缺页异常当一个操作系统被启动后它还有多少内存可用,以及应用程序的地址如何去使用这部分内存就是目前要解决的问题。比如说,一个应用程序它没有被限定的时候在编译器里面他是可以寻址到4G的而实际上我们不可能给他这么多的内存。这里就需要一个关系映射。一.物理内存探测首先我们要对目前真实的物理内存进行探测。一般来
2021-10-18 15:17:53
866
原创 操作系统学习-1.操作系统的启动
操作系统的启动1、从BIOS到系统kernel1.1.开机取得BIOS1.2.BIOS干什么1.3. bootloader的512个字节做什么1.4.代码表现1、从BIOS到系统kernel1.1.开机取得BIOSBIOS 是存在一段掉电不丢失的rom中,或者说是内存中。计算机约定,上电后再所有硬件稳定后,到某个地方去取得BIOS的程序进行执行。(这里有点模糊,按照我学硬件想法BIOS应该是存在EEPROM(特点的掉电不丢失rom)中而不是内存中,因为内存关闭了就是会消失的,但是说成掉电不丢失内存也
2021-10-18 14:53:48
128
原创 Android其他4-Android优化2-启动加载
Android优化2-启动加载1、application的优化2、启动页的优化1.1.解决黑白屏问题1.2.在这个SpashAcivity中可以提前做一些事情3、View的优化1、application的优化尽可能的将第三方库的初始化工作,和一些业务代码延迟到后面初始化,比如ImageLoder的初始化,我们可以换成单例模式,在需要使用的时候初始化。将一些业务代码,放到单独的线程中优化。这些都市基于不影响业务的情况下的调优。2、启动页的优化1.1.解决黑白屏问题在启动MainActivity前,
2021-10-18 14:36:35
525
原创 Android其他4-Android优化
Android优化1-检测工具TraceView的使用1、启动TraceView2、标记进程3、分析SysTrace的使用1、打开2、操作3、分析5、快捷键AMS命令TraceView的使用工欲善其事必先利其器,TraceView工具是AndroidSDK自带的分析工具,使用该工具我们可以看到我们的app启动过程中cpu执行了那些代码以及函数调用的时间。1、启动TraceView在AndroidSDK/tools目录下打开monitor也就是DDMS。然后在设备中选择要做TraceView分析的自己
2021-10-15 17:01:20
316
原创 Android其他4-逆向工程
Android其他-逆向工程1.Android反编译重新打包假设你有个简单的apk名字叫ListViewDemoMy.apk。MainActivity里面就:setContentView(R.layout.activity_listview); Log.d("djh", "test");我们通过反编译,然后修改这个log。1.1.对apk反编译下载apk_tool:到官网google下载下。然后配置环境变量通过以下指令反编译apkapktool d ListViewDemoM
2021-10-15 16:36:12
422
原创 Android中间层分析3.【WMS】Android 显示相关的学习
Android 显示相关的学习概述三角关系Activity 启动流程surfaceFlinger的流程总结概述Android显示相关的内容学习,因为做的项目比较少,所以只是大概描述一下显示架构方面的知识。WMS这边activity的显示,之前做过了一个后台静默启动的项目,意思是进程后台偷偷的启动,然后用户点击到这个app的时候秒开。这个项目也是比较有意思的。进程启动方面之前的文章有讲过了,而进程启动后,肯定会调用wms显示界面,关于这个项目我们就需要把wms压制保存状态。所以就开始研究了一下wms相关
2021-10-15 16:12:11
541
1
原创 Android中间层分析2.【media】Android 音视频播放流程-4.MediaPlayer的setDataSource流程
2.3.MediaPlayer的setDataSource流程上面已经讲了创建流程,已经讲本地的MediaPlayer创建好了,接下来就是给数据。比如给个"/sdcard/test.mp3"或者"/sdcard/test.mp4" 其实在上面来说流程是一样的,想想都知道应该是从:java-》jni-》本地Mediaplayer。2.3.1JAVA层[-->MediaPlayer.java] public void setDataSource(String path)
2020-08-19 20:35:29
1012
原创 Android中间层分析2.【media】Android 音视频播放流程-3.MediaPlayer的创建
2.2.MediaPlayer的创建按照播放的流程我们先分析下MediaPlayer的创建[-->MediaPlayer.java]public class MediaPlayer extends PlayerBase{...private static native final void native_init();private native final void native_setup(Object mediaplayer_this);... static {
2020-08-19 20:33:04
337
原创 Android中间层分析2.【media】Android 音视频播放流程-2.nuplayer的启动
2.1启动上一章简介中讲到,Android7.0 在多媒体服务拆分成了多个进程,不在是以前的单个mediaserver进程。具体如下mediaservermedia.codecmedia.extractoraudioserver这些进程是管理那些服务,和那些进程相关联。我们一个个来看。2.1.1 mediaserver进程的启动我们直接来看下main_mediaserver.cpp文件[-->main_mediaserver.cpp]int main(int argc __
2020-08-19 20:31:32
475
原创 Android中间层分析2.【media】Android 音视频播放流程-1.简介
播放器原理以及基础知识相对应的Android播放器原理通过setDataSource 理解JAVA到Nuplayer层总结下从上层到Nupalyer都经过了哪些类。–>Mediaplayer.java–>android_media_MediaPlayer.cpp–>mediaplayer.cpp–>MediaPlayerService.cpp---->MediaPlayerFactory–>NuPlayerDirvier.cpp–>Nupla
2020-08-19 20:27:58
282
原创 Android中间层分析2.【media】音视频基础知识-10、Android自制简单音视频播放器
3、自制简单音视频播放器Android 音视频的代码好多都属于native层,Nupalyer和AweSomePlayer控制流程复杂, 学习难度比较大,作为app人员来说接触的机会又比较少,导致想学习知识的人门槛比较高。所以这边通过上层的控制,让大家慢慢熟悉播放器的原理。因此将非常简单的音视频播放器,拿出来练习,源码提供大家参考。本app采用上层的MediaCodec 、 MediaExtractor 将音视频播放,播放显示器采用常用的SurfaceView,声音输出采用AudioTrack,步
2020-06-30 09:01:10
203
原创 Android中间层分析2.【media】音视频基础知识-9、Android最简单的视频播放器
1、最简单的音频播放器Android 音视频的代码好多都属于native层,Nupalyer和AweSomePlayer控制流程复杂, 学习难度比较大,作为app人员来说接触的机会又比较少,导致想学习知识的人门槛比较高。所以这边通过上层的控制,让大家慢慢熟悉播放器的原理。因此将非常简单的视频播放器,拿出来练习,源码提供大家参考。本app采用上层的MediaCodec 、 MediaExtractor 将视频频播放,播放显示器采用常用的SurfaceView。步骤大概如下:1、在xml中创建S
2020-06-29 11:25:22
248
原创 Android中间层分析2.【media】音视频基础知识-8、Android最简单的音频播放器
1、最简单的音频播放器Android 音视频的代码好多都属于native层,Nupalyer和AweSomePlayer控制流程复杂, 学习难度比较大,作为app人员来说接触的机会又比较少,导致想学习知识的人门槛比较高。所以这边通过上层的控制,让大家慢慢熟悉播放器的原理。因此将非常简单的音频播放器,拿出来练习,源码提供大家参考。都有注释就不一一解释了。本app采用上层的MediaCodec 和 MediaExtractor 将音频播放。步骤大概如下:1、开启线程2、将输入源给分离器Medi
2020-06-29 11:24:43
268
原创 Android中间层分析2.【media】音视频基础知识-7.ffmpeg 简单音频播放器
哎,喜欢偷懒,这边直接抄袭下雷神的代码。雷神是个值得敬佩的程序员。vs代码下载链接:https://pan.baidu.com/s/1c2dIuYk 密码:ld4b/* *最简单的基于FFmpeg的音频播放器 *Simplest FFmpeg Audio Player * *雷霄骅 Lei Xiaohua *leixiaohua1020@126.com *中国传媒大学/数字电视技术 *Communication University of China / Digital TV .
2020-06-29 11:23:34
261
原创 Android中间层分析2.【media】音视频基础知识-6.ffmpeg 简单视频播放器
哎,喜欢偷懒,这边直接抄袭下雷神的代码。雷神是个值得敬佩的程序员。vs代码下载链接:/** * 最简单的基于FFmpeg的视频播放器2(SDL升级版) * Simplest FFmpeg Player 2(SDL Update) * * 雷霄骅 Lei Xiaohua * leixiaohua1020@126.com * 中国传媒大学/数字电视技术 * Communication University of China / Digital TV Technology * http.
2020-06-29 11:22:48
226
原创 Android中间层分析2.【media】音视频基础知识-5.ffmpeg yuv输出
开发环境vs2010 环境比较老。一下程序要求输出一个pcm数据,使用yuv工具可以打开播放。在这里简单介绍ffmpeg的api调用。后面还会写个整个video的播放,会提供统一的工程。AVFormatContext *pFormatCtx;int i, videoindex;AVCodecContext *pCodecCtx;AVCodec *pCodec;AVFrame *pFrame,*pFrameYUV;uint8_t *out_buffer;AVPacket *pack.
2020-06-29 11:21:37
187
原创 Android中间层分析2.【media】音视频基础知识-4.ffmpeg pcm输出
开发环境vs2010 环境比较老。一下程序要求输出一个pcm数据,使用pcm工具可以打开播放。在这里简单介绍ffmpeg的api调用。后面还会写个整个audio的播放,会提供统一的工程。cAVFormatContext *pFormatCtx;int i, audioStream;AVCodecContext *pCodecCtx;AVCodec *pCodec;首先定义一些变量。char url[]="WavinFlag.aac";av_register_all();.
2020-06-29 11:20:41
235
原创 Android中间层分析2.【media】音视频基础知识-3开源项目
3、主流的开源项目•Ffmpeg•VlC•mplayer•ijkplayer目前比较受欢迎的主流的项目,有上面几个。其中ffmpeg 是必须要了解的。http://ffmpeg.org/ 这个是官网。它是一个开源项目,里面包含各种解码编码格式,并通过一系列的框架,将其组合在一块,形成了非常好用的编解码内核。网上有好多学习的资料。接下来的 三个播放器都是以ffmpeg作为基础,而产生的。这边特别留意的是ijk播放器,是Android上app常使用的,因为其兼容了Android的接口,使用起来
2020-06-29 11:18:48
184
原创 Android中间层分析2.【media】音视频基础知识-2工具
2、需要认识的一些工具做音视频难么遇到些bug。一些有用的分析工具不仅能帮助我们解决问题,还能帮助我们在学习的时候有个客观的认识,使得知识变得不会难么抽象。借助工具,这是非常好的一个学习方法。这边介绍几个我自己常用的。2.1 码流分析工具 Elecard StreamEye Tools这个工具在分析图像运动适量的时候常用的,最近很少用了,又卸载了。就不上图了。2.2 视频格式分析工具 Elecard Video Format Analyzer视频格式分析工具,将一个视频里面的块结构,已经头里面的信
2020-06-29 11:16:35
411
原创 Android中间层分析2.【media】音视频基础知识-1概述
播放器原理基础数据 视频 yuv rgb yuv420 音频 pcm adpcm 编码格式 音频编码格式(AAC,MP3,AC-3) 视频编码格式(H.264,MPEG2,VC-1)封装格式(MP3 MP4 RMVB WAV)播放器原理基础数据通过上图 可以了解播放器的原理,其实就是将一个压缩数据还原成一个基础数据的过程。那么什么时基础数据,基础数据就是硬件所能识别的数据,音频硬件所能识别的是pcm。下面分开将。视频 yuv rgb yuv420 rgb视频的基本数据,就是显
2020-06-29 11:14:10
271
原创 Android中间层分析1.【AMS】进程的启动-广播的注册和发送
1.广播的注册public Intent registerReceiver(IApplicationThread caller, String callerPackage, IIntentReceiver receiver, IntentFilter filter, String permission, int userId) { enforceNotIsolatedCaller("registerReceiver"); ArrayList<I
2020-06-29 11:08:03
287
原创 Android中间层分析1.【AMS】进程的启动-startservice启动分析
1.启动的入口startservice无论怎么样,Activity的startservice最终都会到,ActivityManagerService的startService,函数中来。@Override public ComponentName startService(IApplicationThread caller, Intent service, String resolvedType, String callingPackage, int userId)
2020-06-29 10:58:25
367
原创 Android中间层分析1.【AMS】进程的启动-Process.start分析
进程创建前public static final ProcessStartResult start(final String processClass, final String niceName, int uid, int gid, int[] gids, int debugFlags, int mou
2020-06-29 10:56:11
808
原创 Android中间层分析1.【AMS】进程的启动-startProcessLocked函数分析
四个函数final ProcessRecord startProcessLocked(String processName, ApplicationInfo info, boolean knownToBeDead, int intentFlags, String hostingType, ComponentName hostingName, boolean allowWhileBooting, boolean isolated, bo
2020-06-29 10:53:35
1061
原创 Android基础Thread8.小例子
简单的一个例子class FFReaderThread :public Thread{ //FifoQueue *mAudioQueue; // FifoQueue *mVideoQueue; SingleQueue *mAvQueue; sp<FFMPEGExtractor> mExtractor; public: FFReaderThread(const sp<FFMPEGExtractor> &extractor,SingleQueue *av
2020-06-29 10:46:27
140
原创 Android基础Thread7.三种阻塞型消息循环
3种阻塞型消息循环1、LooperThreadclass LooperThread extends Thread{private Handler mHandler;public static finalint MSG_1 = 1;public static finalint MSG_2 = 2;public void run(){ Looper.prepare(); Log.v("djh","run()"); mHandler = new Hand
2020-06-29 10:45:20
435
原创 Andoird基础Thread6.Linux 循环sem_t实现 数字循环
#include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <semaphore.h> //int flag = 1; sem_t sem; sem_t sem1; void *thread_function(void *arg); int main() { int res; pthread_t a_threa
2020-06-29 10:41:19
124
原创 Android基础Thread5.Android native thread--stop and destroy
在 4章节中使用到如下的线程代码bool AbcThread::threadLoop(){ // Put what you want to do when thread is running here... ALOGD("ThreadLoop()"); while(true){ int cout =mAbcData.getCout(); ALOGD("ThreadLoop() wait release %d \n",cout); } return tr
2020-06-29 10:40:09
167
原创 Android基础Thread4、Android native thread--自己测试的队列线程加消息阻塞和通知
class AbcData { public: AbcData(); void addCout(); int getCout(); private: Condition mWorkChangedCondition; Mutex mLock; int cout;};AbcData::AbcData(){ cout =0;}int AbcData::getCout(){ mWorkChangedCondition.wait(mLock); return c
2020-06-29 10:39:20
270
原创 Android基础Thread3、Android native thread--WorkQueue多线程队列的学习
路径\frameworks\base\tools\aapt学习别人是怎写工作线程的.h#ifndef AAPT_WORK_QUEUE_H#define AAPT_WORK_QUEUE_H#include <utils/Errors.h>#include <utils/Vector.h>#include <utils/threads.h>namespace android {/* * A threaded work queue. * * Th
2020-06-29 10:38:09
277
自定义VIEW 流量统计 圆形圈
2015-11-18
自定义 球 + 波纹 View
2015-11-13
vhdl数字时钟
2013-06-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人