`
473687880
  • 浏览: 535681 次
文章分类
社区版块
存档分类
最新评论

Android 音频,视频资源管理与播放

 
阅读更多

本文出之于网络,非本人撰写

Android平台基于Linux和开放手机联盟(OHA)系统,经过中国移动的创新研发,设计出拥有新颖独特的用户操作界面,增强了浏览器能力和WAP 兼容性,优化了多媒体领域的OpenCORE、浏览器领域的WebKit等业内众多知名引擎,增加了包括游戏、Widget、Java ME等在内的先进平台中间件。本文主要介绍如何利用OPhone平台提供的多媒体编程环境进行音乐资源的管理与播放。

MediaScanner与音乐信息扫描
Android系统在SD卡插入后,MediaScanner服务会在后台自动扫描SD上的文件资源,将SD上的音乐媒体信息加入到MediaStore数据库中。程序可以直接从MediaStore中读取相应的媒体信息。通过注册监听MediaScanner广播的Intent,可以获知MediaScanner服务是否在进行后台的扫描工作:

Intent.ACTION_MEDIA_SCANNER_STARTED 表示MeidaScanner开始扫描;
Intent.ACTION_MEDIA_SCANNER_FINISHED 表示MediaScanner扫描结束;

当程序从网络下载媒体文件到终端后,MediaScanner服务并不会自动扫描刚刚下载的文件,需要程序主动去扫描这些新添加的媒体文件信息到MediaStore数据库中。在Android系统中有两种方式去主动扫描音乐媒体文件信息到MediaStore数据库:

1.启动MediaScanner服务,扫描媒体文件:
程序通过发送下面的Intent启动MediaScanner服务扫描指定的文件或目录:

Intent.ACTION_MEDIA_SCANNER_SCAN_FILE:扫描指定文件

public void scanFileAsync(Context ctx, String filePath) {
              Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
              scanIntent.setData(Uri.fromFile(new File(filePath)));
              ctx.sendBroadcast(scanIntent);
}

“android.intent.action.MEDIA_SCANNER_SCAN_DIR”:扫描指定目录

public static final String ACTION_MEDIA_SCANNER_SCAN_DIR = "android.intent.action.MEDIA_SCANNER_SCAN_DIR";
       public void scanDirAsync(Context ctx, String dir) {
              Intent scanIntent = new Intent(ACTION_MEDIA_SCANNER_SCAN_DIR);
              scanIntent.setData(Uri.fromFile(new File(dir)));
              ctx.sendBroadcast(scanIntent);
}

这种扫描方式中,由于扫描工作是在MediaScanner服务中进行的,因此不会阻塞当前程序进程。当扫描大量媒体文件且实时性要求不高的情况下,适合使用该扫描方式。

2.通过MediaScanner提供的API接口,扫描媒体文件。
这种扫描媒体文件的方式是同步的,扫描工作将会阻塞当前的程序进程。当扫描少量文件,且要求立即获取扫描结果的情况下,适合使用该扫描方式。
在扫描媒体文件前,程序应该根据终端当前的语言环境正确设置MediaScanner的语言环境设置, 避免产生编解码的错误:


    MediaScanner scanner = new MediaScanner(ctx);
    Locale locale   = ctx.getResources().getConfiguration().locale;
    String language = locale.getLanguage();
    String country  = locale.getCountry();
    scanner.setLocale(language + \"_\" + country);

媒体文件可以存储在手机终端的内存中,也可以存储在SD卡中,Android平台中称手机终端内存为内部存储空间,称SD卡为外部存储空间。针对内部和外部存储空间中的媒体文件信息是分开管理的,各自有独立的数据库管理。因此在扫描媒体文件时,要明确指明扫描的媒体文件是位于内部存储空间还是外部存储空间。外部存储空间和内部存储空间对应的卷标为”external”和”internal”。

    scanner.scanSingleFile(filePath, volumeName, mimeType);
    scanner.scanDirectories(directories, volumeName);

MediaStore与音乐信息查询
MediaScanner将扫描媒体文件获得的信息全部存储在MediaStore数据库中。MediaStore是基于SQLite数据库系统的,通过ContentProvider方式,程序可以对MediaStore数据库进行增删查改等操作。
MediaStore的数据库文件位于/data/data/com.android.providers/databases, 通常可以发现两个数据库文件
internal.db:对应内部存储空间的媒体数据库文件;
external-xxxxxxxx.db:对应外部存储空间的媒体数据文件,由于同一个手机终端可能使用多个SD卡,针对每一个SD卡,OPhone平台都会生成对应的媒体数据库文件。
两个数据库文件除了管理的文件所存储的位置不同外,没有其他区别。本文后续将默认以外部存储为例进行介绍。
使用SQLite命令打开数据库文件,可以看到Android多媒体数据库的基本结构:

>sqlite3 external-xxx.db
>.tables
>.schema
感兴趣的读者可以自己查看,本文不再一一列举。

MediaStore类是Android平台的多媒体数据库,它包含了音频,视频,图片等所有多媒体文件信息。本文将重点介绍如何管理和获取音频信息,视频和图片等信息的获取与管理与音频类似。
MediaStore以ContentProvider的形式向外提供媒体数据库信息。通过Android平台提供的ContentProvider接口,可以方便的访问数据库信息。

public Cursor query(Contex ctx, Uri _uri, String[] prjs, String selections, String[] selectArgs, String order) {
        ContentResolver resolver = ctx.getContentResolver();
        if (resolver == null) {
            return null;
        }
        return resolver.query(_uri, prjs, selections, selectArgs, order);
 }

_uri:指明要查询的数据库名称加上表的名称,从MediaStore中我们可以找到相应信息的参数,具体请参考SDK开发文档。
prjs: 指定查询数据库表中的哪几列,返回的游标中将包括相应的信息。Null则返回所有信息。
selection: 指定查询条件
selectionArgs:参数selection里有?这个符号时,这里可以以实际值代替这个问号。如果selection这个没有?的话,那么这个String数组可以为null
order:指定查询结果的排列顺序

MediaStore.Audio.Media类定义了媒体数据库中的歌曲信息
MediaStore.Audio.Artists类定义了媒体数据库中的歌手信息
MediaStore.Audio.Albums类定义了媒体数据库中的专辑信息
MediaStore.Audio.Playlists类定义了媒体数据库中的播放列表信息

读者可以通过OPhone SDK开发文档找到详细的信息,结合ContentProvider的查询接口,可以获取所有媒体信息。
MediaPlayer与音乐播放MediaPlayer是Android多媒体编程中最核心的类。它提供了一个多媒体播放器常用的基本操作如播放,暂停,停止,获取文件播放长度等等。它向下通过JNI封装,获取系统提供的多媒体播放能力。
MeidaPlayer提供了设计良好的多媒体接口,播放一个音频文件的步骤非常简单:
1.创建播放器: new MediaPlayer()
2.设置音频源: setDataSource(Audio_PATH)
3.准备音频源: prepare()
4.播放音频: start()
5.停止播放: stop()
6.释放资源: release();
其他MediaPlayer常用接口例如pause(), getDuration(), seekTo()等,大家可以自己查阅SDK文档,这里不在一一介绍。
音频的播放过程也就是MediaPlayer对象的状态转换过程。深入理解MediaPlayer的状态机是灵活驾驭Android多媒体编程的基础。读者在Android SDK 开发文档中可以查看到MediaPlayer的状态转换图。程序有必要监听这些变化,判断播放器所处的状态,Android平台提供了多种监听器,来监视 MediaPlayer的状态变化:
MediaPlayer.OnBufferingUpdateListener
MediaPlayer.OnCompletionListener
MediaPlayer.OnErrorListener
MediaPlayer.OnPreparedListener
MediaPlayer.OnSeekCompleteListener

Android平台可以从资源文件、文件系统和网络三种方式来播放多媒体文件。无论使用哪种播放方式,基本的流程都是类似的。

从资源文件播放
多媒体文件可以放在资源文件夹/res/raw目录下,然后通过MediaPlayer.create(Context ctx, int file)方法创建MediaPlayer对象,获得MediaPlayer对象后直接调用start()方法即可播放音乐。

从文件系统播放
从文件系统播放音乐,需要使用new操作符创建MediaPlayer对象。获得MediaPlayer对象之后,需要依次调用setDataSource() 和prepare()方法,以便设置数据源,让播放器完成准备工作,然后调用start()方法播放音乐。

从网络播放
Android平台支持在线播放媒体音乐,通过 progress download的方式播放在线音频资源。Progress download的支持由底层的OpenCore多媒体库提供支持,应用开发者不必关心具体实现细节,只需要设置网络音频资源的地址,就可以完成在线播放的工作,极大提高了开发效率。由于从网络下载播放音频资源需要较长的时间,在准备音频资源的时候,需要使用prepareAsync()方法,这个方法是异步执行的,不会阻塞程序的主进程。MediaPlayer通过MediaPlayer.OnPreparedListener通知 MediaPlayer的准备状态。
在特定的情况下,程序需要通过代理服务器访问在线资源,例如,通过APN CMWAP访问网络时,需要设置CMWAP的代理地址(10.0.0.172:80)。Android平台提供了非常方便的解决方案,使开发者可以非常简单的通知OpenCore使用指定的代理来访问网络音频资源:在网络媒体的url后,通过“x-http-proxy”指定代理服务器地址。另外,由于 Android平台支持Multi PDP,可以同时建立多个APN连接,所以开发者必须指明哪个连接端口需要使用代理服务器,通过“x-net-interface”指定连接端口(如何建立CMWAP数据连接,获取连接端口名,本文不再详细叙述,请读者查看相关的Android技术文章),下面的程序简单说明了通过代理服务器播放音频资源的步骤:

private void playFromNetwork() {
    String path = "http://website/path/test.mp3";
    String CMWAP_HOST = "10.0.0.172";
    String CMWAP_PORT = "80";
 
    //假设CMWAP连接的端口名
    String SOCKET_INTERFACE = "cminnet0";
 
    String urlWithProxy = path + "?x-http-proxy=" + CMWAP_HOST + ":" + CMWAP_PORT + "&" + "x-net-interface=" + SOCKET_INTERFACE ;
    try {
        MediaPlayer player = new MediaPlayer();
        player.setDataSource(path);
        player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
             public void onPrepared(MediaPlayer player) {
                 player.start();
             }
        });
        player.prepareAsync();
    } catch (Exception e) {
        e.printStackTrace();
    }
}









分享到:
评论

相关推荐

    android中音频和视频的播放

    在Android平台上,音频和视频的播放是移动应用开发中不可或缺的一部分。本文将深入探讨如何在Android中使用不同的组件和技术来实现音频和视频的播放功能,包括`MediaPlayer`媒体播放器、`SoundPool`音效池以及`...

    Android音频和视频播放

    在Android平台上,音频和视频播放是移动应用开发中不可或缺的一部分。Android Media API为开发者提供了强大的工具,用于处理各种媒体文件的播放、录制和处理。在这个主题中,我们将深入探讨Android中的音频和视频...

    android在线播放音频视频

    总结起来,在Android平台上实现在线播放音频视频,开发者需要掌握网络请求技术、多媒体处理、播放器组件的使用,以及相关UI设计和异常处理。随着技术的不断发展,如HLS、DASH等流媒体协议的应用,开发者也需要不断...

    android开发ExoPlayer播放视频和wav音频

    对于"android开发ExoPlayer播放视频和wav音频"这个主题,我们将深入探讨如何在Android应用中集成和使用ExoPlayer来播放视频和.wav音频文件。 首先,要添加ExoPlayer库到项目中,我们需要在build.gradle文件的...

    Android 视频音频播放 demo 实例源码下载

    这个"Android 视频音频播放 demo 实例源码下载"提供了一个宝贵的资源,帮助开发者理解和实现这一功能。下面我们将深入探讨相关知识点。 1. **Android Media Framework**: Android的Media Framework是系统级别的...

    Android播放在线音频文件

    在Android平台上,播放在线音频文件是一项常见的功能,尤其在音乐应用和有声读物应用中。本示例项目"OnlineMusicPlayer"旨在提供一个基础的...通过深入研究和实践,开发者可以进一步提升在Android音频播放领域的技能。

    Android Studio 视频播放

    开发者可以通过创建MediaPlayer对象,加载视频资源,设置播放状态,并处理播放事件。 2. **SurfaceView**:为了在屏幕上显示视频,通常会使用SurfaceView或其子类TextureView。SurfaceView提供了一个独立的渲染表面...

    Android音频实时传输与播放-客户端

    这个"Android音频实时传输与播放-客户端"源码例子旨在帮助开发者理解和实现这样的功能。让我们深入探讨一下这个话题,以及相关的知识点。 首先,我们要了解Android音频系统的基础。Android支持多种音频格式,如MP3...

    Android 音频降噪源码

    本主题将深入探讨Android音频降噪,特别是利用WebRTC(Web Real-Time Communication)技术来实现这一功能。 WebRTC是一个开源项目,旨在提供实时通信的能力,包括音频、视频和数据共享,直接在浏览器或其他应用程序...

    android 音频视频播放器

    总结,Android音频视频播放器的开发涉及到多媒体处理、生命周期管理、用户交互等多个方面。通过分析和实践提供的示例资源,你可以逐步提升在这一领域的专业技能,为用户提供更加丰富和流畅的多媒体体验。

    Android频繁播放简短音频Deom

    综上所述,`Android频繁播放简短音频Demo`涉及到的关键技术包括`SoundPool`的使用、音频资源的管理和TTS技术。通过这些技术,开发者能够构建出一个响应迅速、性能良好的音频播放功能,提高用户的使用体验。在实践中...

    Android音频与视频合并

    以下是对"Android音频与视频合并"这一主题的详细解释。 1. **基础知识**: - **媒体处理**:音频和视频是多媒体数据的两种主要形式,它们可以通过不同的编码标准(如H.264 for 视频, AAC for 音频)进行编码,并以...

    Android开发,实现播放本地MP3和播放链接MP3音频

    MediaPlayer是Android系统提供的一个核心组件,它可以处理各种音频和视频格式的播放。对于本地MP3文件,我们通常将其放在res/raw目录下,因为这个目录下的资源文件会被编译进APK,方便直接访问。 1. 创建...

    android 音频播放MP3 audio

    本教程将重点讲解如何在Android中播放MP3格式的音频文件,包括在线音乐的获取与播放控制。以下是相关的关键知识点: 1. **Android Media Framework**: Android系统提供了一套Media Framework,用于处理音频、视频的...

    android中的多媒体应用-音频和视频的播放

    在Android平台上,多媒体应用开发是不可或缺的一部分,涵盖了音频和视频的播放、录制等功能。本文将深入探讨Android多媒体应用的核心组件,包括MediaPlayer、SoundPool以及VideoView,并介绍如何设置媒体控制器来...

    android实现vlc播放本地视频

    在Android平台上,开发人员经常需要集成视频播放功能,而VLC(VideoLAN Client)是一个流行的开源多媒体播放器,它支持多种视频和音频格式以及流媒体协议。本教程将详细介绍如何在Android应用中实现使用VLC播放本地...

    Android实例之MediaPlayer播放音乐和视频

    首先,MediaPlayer是Android SDK提供的一个类,它可以播放本地或网络上的音频和视频资源。在Android应用中,使用MediaPlayer的基本步骤包括初始化、设置数据源、准备和开始播放。例如,初始化一个MediaPlayer对象,...

    Android应用开发mediaplayer播放音频,带有进度条

    在Android应用开发中,MediaPlayer类是用于播放各种音频和视频资源的核心组件。在这个特定的示例中,我们关注的是如何使用MediaPlayer与进度条(SeekBar)结合,创建一个简单的音频播放器。以下是对这个Android应用...

    android录制视频音频存储于sd卡并点击播放实例

    通过以上步骤,我们可以实现一个完整的Android应用程序,能够录制视频音频并将其存储到SD卡,同时以列表形式显示并点击播放。这个实例涵盖了Android多媒体处理的核心知识,对于理解和实践Android应用开发具有很高的...

    android 播放声音视频几种方法

    1. **使用MediaPlayer播放视频**:与播放音频类似,设置数据源为视频文件路径,然后准备并启动播放。 ```java MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setVideoSurface(surfaceHolder....

Global site tag (gtag.js) - Google Analytics