MediaScanner源码结构学习

合集下载

MediaScanner源码结构学习

MediaScanner源码结构学习
在看MediaScanner前,先看到MediaScanner.java文件开头处的注释,官方的流程介绍:
/**
* Internal service helper that no-one should use directly.
*
* The way the scan currently works is:
* - The Java MediaScannerService creates a MediaScanner (this class), and calls
* MediaScanner.scanDirectories on it.
* - scanDirectories() calls the native processDirectory() for each of the specified directories.
classmymediascannerclientpublicmediascannerclient这个类会一直被作为参数带到底层去因为底层做完由directory分析到file的操作后会调用这个类中的scanfile函数而这个类的scanfile函数会调用上面java层的scanfile以至于最终是从java层的scanfile走入到最底层从构造函数中可以看到其使用了java层传过来的mymediascannerclient类来构建此对象这一块有些jni函数我也没查过说下我知道的public
* Java MyMediaScannerClient.endFile(), which takes all the data that's been
* gathered and inserts an entry in to the database.

mediacodec 用法

mediacodec 用法

mediacodec 用法MediaCodec是Android平台上的一个多媒体编解码器API,它允许开发人员对音频和视频进行高效的编解码操作。

在本文中,我们将会详细介绍MediaCodec的用法,从实例代码到关键概念,并逐步回答相关问题。

MediaCodec用法MediaCodec的主要用法可以分为以下几个步骤:创建编解码器、配置编解码器、启动编解码器、处理输入数据、获取编解码后的数据、停止编解码器和释放资源。

一、创建编解码器首先需要实例化一个MediaCodec对象,通过createDecoderByType或createEncoderByType方法,传入对应的媒体类型(mime type)来创建对应的解码器或编码器。

例如,创建一个H.264解码器的实例可以使用以下代码:javaMediaCodec codec = MediaCodec.createDecoderByType("video/avc");二、配置编解码器在创建编解码器之后,需要对其进行配置。

首先,我们需要通过MediaFormat 来指定输入和输出格式。

对于解码器而言,输入格式通常是一个媒体文件的编码格式;而输出格式通常是原始的音频或视频格式。

例如,对于H.264解码器,可以使用如下代码来配置编解码器:javaMediaFormat format = MediaFormat.createVideoFormat("video/avc", width, height);codec.configure(format, null, null, 0);在配置编解码器后,我们还可以通过getInputBuffers和getOutputBuffers方法获取输入和输出缓冲区,并将其保存在一个缓冲区数组中,以供进一步处理。

三、启动编解码器在配置完成后,我们需要调用start方法来启动编解码器。

这将导致编解码器开始处理输入数据,并将编码后的数据写入输出缓冲区。

Avid_Media_Composer学习入门教程

Avid_Media_Composer学习入门教程

Avid Media Composer 学习入门《AVID》控制栏第一章基本知识一、概述多媒体作家(Media Composer)是美国AVID公司为广播电视行业开发的一种基于硬盘的非线性编辑系统。

所有视频数据处理都采用JPEG压缩,具有强大的特技效果制作和音频编辑功能,它把传统的编辑机、特技机、字幕机等的功能集于一身,使得在原来传统制作过程中的机械磨损、机械误差减小到最小。

Media Composer8000是基于苹果公司的Power Macintosh平台上,它把传统设备、数字技术和Macintosh的简明界面有机地结合了起来,强大的非线性编辑功能大大提高了工作效率,使得编辑和修改都非常方便。

在编辑的过程中,你可随意地重复使用素材,对图像质量不会产生任何影响。

Media Composer8000的硬件包括硬盘(若干)、主机(一个)、监视器(两个)、Video Slave Drive(一个)、Audio Interface(一个)、扬声器(两个)、3D Effect Mudole(一个)、键盘(一个)和鼠标(一个)。

系统连线如下:箭头表示的是数据或信号的走向。

虚框内是MC8000的系统连线,单机运行的情况下,一般是先从录像机中把素材录入硬盘,在MC8000中编辑完成之后,再输出到录像机的磁带上。

二、几个术语在MC中,有一些专用术语,大多都是第一次遇见,理解起来非常抽象,有些是名词术语,有些是操作术语,下面就把常见的那些作以解释,其它的等以后遇见时再做介绍。

(1)文件夹——是用来存放文件,文件夹有大有小,大的文件夹中可以包括小的文件夹,小的文件夹还可以包括更小的文夹。

(2)Media File——就是媒体文件,用来存放实际的视频数据和音频数据。

(3)Master Clip——指的是录入到MC中的素材的索引文件,其中只包括一些最基本的信息,诸如开始时码,结束时码,所包含的轨道等,便于你快速地调用它们,而实际上的视频和音频数据是存在Media Files中的,因而每一个Master Clip都指向一些特定的Media Files。

解析媒体矩阵(MediaMatrix)(四十七)NWare软件介绍(9)——Python编程基础(续3)

解析媒体矩阵(MediaMatrix)(四十七)NWare软件介绍(9)——Python编程基础(续3)

10 循环语句(while)while语句支持的单个表达式,只要测试结果是真,那么循环就持续执行,直到测试结果为假。

所以这个测试结果可以是一个表达式,也可以是一个常量,例如:while 1: m=inputs[0].value_get( ) outputs[0].value_set(m)这段脚本表示对第一个输入通道取值,并直接传递给第一个输出通道。

由于循环控制语句的控制条件是“1”,也就是说永远为“真”,所以这个循环就要永远持续下去。

当然也可以不使用“1”,而使用一个判断表达式作为循环建立的条件:value=inputs[0].value_get( )while value>=-12: outputs[0].value_set(inputs[1].value_get())else:outputs[0].value_set(-100)这个范例脚本其实可以用来作噪声门的控制电路,它的原理就是利用脚本的一个输入端重复侦测输入的电平大小,一旦输入电平超过了预先设定的“-12 dB”,则输出端电平就会跟随输入端电平的调整,达到1∶1的输出。

而当输入电平低于“-12 dB”时,输出电平被衰减“-100 dB”,也就是相当于被关闭了。

在NWare中可以创建一个图1所示的文件来运行。

图1的上半部分就是音频电路的连接,两个串联的电平控制器充当了噪声门的输入和输出电平调节,表头则是用来探测输入电平的大小;下半部分是实现噪声门控制的一个逻辑控制电路,其中脚本“Gate _Control”两侧的表头和电平旋钮是分别从上面的音频器件中“粘贴”过来的。

对比编写的“while”循环脚本可以看出,当探测到从“0”端口输入的电平表电平也就是[inputs[0].value_get()]为“-35 dB”时,低于预先的设定,所以输出端的输出电平也就是[outputs[0].value_set(-100)]被钳位到“-100 dB”的位置。

Android媒体库框架(mediascanner)

Android媒体库框架(mediascanner)

Android平台上的媒体文件管理和桌面系统不同。

在桌面系统上,不同目录下的媒体文件呈树状结构显示给用户,用户需要进入不同目录寻找该目录下的文件。

而在Android平台上,不同目录下的媒体文件则以一层列表方式显示给用户,用户不需进入子目录就可以列出(某种类型的)所有媒体文件。

在Android上,为了实现这种模式的媒体文件管理,对所有管理的媒体文件抽取其元数据,也就是ID3(mp3文件包含的元数据可参考/wiki/ID3),存储在数据库中,并作为一个content provider提供给其他应用使用。

用户的每一次显示媒体文件的操作,就是对这个数据库的一次查询操作。

在多媒体管理模块中,主要分成三个模块:多媒体数据库MediaStore这个类是android系统提供的一个多媒体数据库,android中多媒体信息都可以从这里提取。

这个MediaStore包括了多媒体数据库的所有信息,包括音频,视频和图像,android把所有的多媒体数据库接口进行了封装,所有的数据库不用自己进行创建,直接调用利用ContentResolver去掉用那些封装好的接口就可以进行数据库的操作,多媒体数据库的使用方法和SQLITE3的方法是一样的。

MediaStore中的数据是在MediaScanner扫描后通过MediaProvider中的一个service进行更新的。

框架图如下:MediaScanner在Android系统中,多媒体库是通过MediaScanner去扫描磁盘文件,对元信息的处理,并通过MediaProvider保存到MediaStore中。

下图为MediaScannerr 框架:图1-1 MediaScanner框架流程MediaScanner可以通过手动控制,在ANDROID系统中,已经定制了三种事件会触发MediaScanner去扫描磁盘文件:ACTION_BOOT_COMPLETED、ACTION_MEDIA_MOUNTED、ACTION_MEDIA_SCANNER_SCAN_FILE。

MediaScanner分析

MediaScanner分析

MediaScanner分析模块工作流程MediaScannerReceiverMediaScannerReceiver代码:packages\providers\MediaProvider\src\com\android\providers\media\MediaScannerReceiver. javaMediaScannerReceiver是用来接收广播任务的,它收到广播后,会启动MediaService进行扫描工作。

MediaScannerReceiver从BroadcastReceiver派生,主要用来接收广播任务。

ACTION_BOOT_COMPLETEDACTION_MEDIA_MOUNTEDACTION_MEDIA_SCANNER_SCAN_FILEMediaScannerReceive会在以上3个intent发出时启动 MediaScannerService。

MediaScannerServiceMediaScannerService代码:packages\providers\MediaProvider\src\com\android\providers\media\MediaScannerService.j avapublic class MediaScannerService extends Service implements Runnable MediaScannerService是一个service,在onCreate中单独启动一个带消息循环的子线程,主线程通过onStartCommand接收系统发送来的任务,再由mServiceHandler.sendMessage(msg)发送到子线程,子线程消息处理函数handleMessage(Message msg)通过解析消息,创建MediaScanner去执行扫描MediaScanner该部分代码在frameworks\base\media\目录下,包括jni和java文件,MediaScanner的调用过程复杂,而且和MediaProvider交互频繁。

mediacontroller方法

mediacontroller方法

mediacontroller方法1.引言1.1 概述概述在现代社会中,媒体播放器已成为人们日常生活中不可或缺的一部分。

随着手机和电脑等移动设备的普及,人们越来越多地使用这些设备来收听音乐、观看视频或玩游戏。

然而,如何在这些设备上方便地控制媒体播放成为了一个重要的问题。

为了解决这个问题,Android操作系统引入了一个重要的类——MediaController。

MediaController类是Android提供的一个用于控制媒体播放的工具类。

它提供了一系列的方法和功能,使用户可以方便地控制音乐或视频的播放。

此外,MediaController类还提供了一些额外的控制选项,如播放、暂停、快进、快退等功能,用户可以通过触摸屏幕或点击按钮来操作。

这使得用户可以根据自己的需要来调整音量、跳过特定的部分或切换到其他媒体文件。

在本文中,我们将详细介绍MediaController方法的定义与功能,并探讨它在不同场景下的使用方式。

我们还将总结MediaController方法的优势和应用,并展望其在未来的发展前景。

通过阅读本文,读者将了解到如何合理地使用MediaController类及其方法来提高媒体播放的操作性和用户体验。

1.2文章结构1.2 文章结构本文将围绕着"MediaController方法"展开讨论。

为了更好地探究MediaController方法的定义、功能以及其在实际应用中的使用场景,本文按照以下方式组织文章内容:第二部分将详细介绍MediaController方法的定义与功能。

首先,将给出MediaController方法的准确定义,解释它是什么以及它所具备的功能。

接下来,将详细讨论MediaController方法的各个组成部分以及它们之间的关系,以帮助读者全面了解这个方法的内涵。

第三部分将深入探讨MediaController方法的使用场景。

通过实际案例和经典示例,将展示MediaController方法在不同领域中的应用情况。

《深入理解Android(卷1)》笔记1.第二章深入理解JNI

《深入理解Android(卷1)》笔记1.第二章深入理解JNI

《深⼊理解Android(卷1)》笔记1.第⼆章深⼊理解JNI第⼀章就跳过了,⽐较基础。

第⼆章深⼊理解JNI知识点1:JNI概述JNI:Java Native Interface,中译为“java本地接⼝”。

Native语⾔⼀般指C/C++。

JNI技术可以实现java与C/C++之间的互通(java程序<----调⽤---->C/C++程序)。

虽然java语⾔是平台⽆关的,但JNI的推出基于以下⼏个⽅⾯的考虑:(1)java虚拟机是Native语⾔写的,所以虚拟机本⾝是平台相关的。

⽽有了JNI技术,就可以对java层屏蔽不同操作系统间的差异了。

java程序只管通过调⽤Native ⽅法实现相应功能就⾏,⽆需理会平台差异,就实现了java本⾝的平台⽆关性。

(ps:书中说“其实java⼀直在使⽤JNI技术,只是我们平时较少⽤到罢了”)(2)在⼀些要求效率和速度的场合还是需要Native语⾔参与其中的。

这也就说明了JNI技术的作⽤: Java世界 <------> JNI层 <-------> Native世界知识点2:通过分析MediaScanner源码来学习JNI⾸先来看⼀下涉及到的部分:Java(MediaScanner)JNI(libmedia_jni.so)Native(libmedia.so)分析:* Java层对应的是MediaScanner类。

这个类有⼀些函数需要Native层来实现。

* JNI层对应的是libmedia_jni.so。

medi_jni是JNI库的名字(Android⼀般⽤“lib模块名_jni.so”的命名⽅式来命名JNI库的名字)。

* Native层对应的是libmedia.so。

这个库完成了实际的功能。

MediaScanner将通过JNI库libmedia_jni.so和Native层的libmedia.so交互。

Java层的MediaScanner分析public class MediaScanner{static {//加载JNI库System.loadLibrary("media_jni");native_init();}......//声明native函数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
* native MyMediaScannerClient scanFile, which calls
* Java MyMediaScannerClient scanFile, which calls
* Java MediaScannerClient doScanFile, which calls
* Java MediaScanner processFile (native method), which calls
scanFile(context, path);//扫描单个文件
}
}
}
}
privatevoidscan(Contextcdontext,Stringvolume){
//启动MediaScannerService,扫描目录
Bundle args = new Bundle();
args.putString("volume",volume);
args.putString("filepath",path);
context.startService(
newIntent(context,MediaScannerService.class).putExtras(args));
}
}
倒是很简洁,其启动了MediaScannerService,打开android4.2/packages/providers/mediaprovider/src/com/android/providers/media/MediaScannerService.java
publicvoidonReceive(Contextcontext,Intentintent){
finalStringaction=intent.getAction();
finalUriuri=intent.getData();
if(Intent.ACTION_BOOT_COMPLETED.equals(action)){
// scan whenever any volume is mounted
// sd卡挂载后扫描,也可以看出,他只扫描external ----> external.db中
scan(context,MediaProvider.EXTERNAL_VOLUME);
}elseif(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE.equals(action)&&
path!=null&&path.startsWith(externalStoragePath+"/")){
//如果是有文件拷贝进入,且路径不为空,且是在第一存储设备上(手机存储有预先制定好的ExternalStorage
//与SecondStorage,并不是说外卡就是externalStorage,内卡就是SecondStorage,我在项目中犯过这个错误理解)
* Java MyMediaScanner handleStringTag.
* Once MediaScanner processFile returns, an entry is inserted in to the database.
*
* The MediaScanner class is not thread-safe, so it should only be used in a single threaded manner.
在看MediaScanner前,先看到MediaScanner.java文件开头处的注释,官方的流程介绍:
/**
* Internal service helper that no-one should use directly.
*
* The way the scan currently works is:
Stringpath=uri.getPath();
StringexternalStoragePath=Environment.getExternalStorageDirectory().getPath();
Log.d(TAG,"action: "+action+" path: "+path);
if(Intent.ACTION_MEDIA_MOUNTED.equals(action)){
*
* {@hide}
*/
MediaScannerReceiver.java文件用于接收系统重启后,已经插拔卡,以及文件复制与拷贝等消息,收到消息后会进行扫描。启动MediaScannerService,进行相关操作,MediaScannerService的主线程接收通知,然后单独启动一个handler去处理消息。
* native MyMediaScannerClient.scanFile() for every file whose extension matches.
* - native MyMediaScannerClient.scanFile() calls back on Java MediaScannerClient.scanFile,
//onCreate 函数
@Override
publicvoidonCreate()
{
PowerManagerpm=(PowerManager)getSystemService(Context.POWER_SERVICE);
mWakeLock=pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,TAG);
MediaScannerReceiver.java文件很简单,先看一下
publicclassMediaScannerReceiverextendsBroadcastReceiver{
privatefinalstaticStringTAG="MediaScannerReceiver";
@Override
scan(context,MediaProvider.INTERNAL_VOLUME);
scan(context,MediaProvider.EXTERNAL_VOLUME);
}else{
if(uri.getScheme().equals("file")){
// handle intents related to external storage
//系统启动完毕后会发送broadcast,MediaScannerReceiver收到消息开始扫描内外存储设备,
//在此,我的理解,internal是存储系统相关的,external存储的是所有的自带存储空间以及外面插入的sd卡等信息
// Scan both internal and external storage
* Java MyMediaScannerClient.endFile(), which takes all the data that's been
* gathered and inserts an entry in to the database.
*
* In summary:
* Java MediaScannerService calls
// Start up the thread running the service. Note that we create a
// separate thread because the service normally runs in the process's
// main thread, which we don't want to block.
* object (which got created when the Java MediaScanner was created).
* - native MediaScanner.processDirectory() calls
* doProcessDirectory(), which recurses over the folder, and calls
* - the processDirectory() JNI method wraps the provided mediascanner client in a native
* 'MyMediaScannerClient' class, then calls processDirectory() on the native MediaScanner
//获取屏幕常亮,扫描期间不停歇
StorageManagerstorageManager=(StorageManager)getSystemService(Context.STORAGE_SERVICE);
mExternalStoragePaths=storageManager.getVolumePaths();
Threadthr=newThread(null,this,"MediaScannerService");
//新起线程,防止主线程阻塞,其启动run函数
thr.start();
}
publicvoidrun()
* - The Java MediaScannerService creates a MediaScanner (this class), and calls
* MediaScanner.scanDirectories on it.
* - scanDirectories() calls the native processDirectory() for each of the specified directories.
相关文档
最新文档