Android的多媒体.docx

上传人:b****7 文档编号:8783516 上传时间:2023-02-01 格式:DOCX 页数:27 大小:89.48KB
下载 相关 举报
Android的多媒体.docx_第1页
第1页 / 共27页
Android的多媒体.docx_第2页
第2页 / 共27页
Android的多媒体.docx_第3页
第3页 / 共27页
Android的多媒体.docx_第4页
第4页 / 共27页
Android的多媒体.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

Android的多媒体.docx

《Android的多媒体.docx》由会员分享,可在线阅读,更多相关《Android的多媒体.docx(27页珍藏版)》请在冰豆网上搜索。

Android的多媒体.docx

Android的多媒体

机构图标

{项目名称}

关于Android的多媒体报告

文件状态:

[√]草稿

[]正式发布

[]正在修改

文件标识:

Company-Project-MediaPlay-MODULE

当前版本:

0.1

作者:

XXX

完成日期:

2011-5-5

XXXXXX

信息工程中心嵌入式与RFID实验室

版本历史

版本/状态

作者

参与者

起止日期

备注

0.1

XXX

2011/5/3

草稿

0.1

XXX

2011/5/4

0.1

XXX

2011/5/5

格式规范化

0.1

XXX

2011/5/7

正文中文改为非倾斜

0.1

XXX

2011/8/9

审阅修正

0.1

XXX

2011/8/9

根据审阅结果修订

目录

0.文档介绍4

0.1文档目的4

0.2文档范围4

0.3读者对象4

0.4参考文献4

0.5术语与缩写解释4

1.系统环境5

2.Android的多媒体架构5

2.1多媒体架构所处系统的位置5

2.2多媒体架构5

2.3OpenCore介绍5

2.4OpenCore软件层次分层6

2.5OpenCore上层代码7

2.6MediaPlayer常用方法介绍7

3.文件格式处理和编解码部分简介9

3.1文件格式的处理9

3.2编解码10

3.3简单的例子10

3.3.1播放一个文件10

3.3.2播放rawresource10

3.3.3录音10

3.3.4alarmclock调用Media11

4.VedioView11

4.1VedioView与MedioPlay之间的关系11

4.2VedioView常用方法介绍12

4.3VedioView类的简单例子15

5.总结21

0.文档介绍

0.1文档目的

本文档主要介绍Android的多媒体,使读者对Android播放器有关的使用有所了解,并通过一些小的实例,使读者加深对其理解和灵活运用。

0.2文档范围

本文档主要用于介绍Android的播放器以及与之相关的一些基本内容,主要包括以下几个方面:

多媒体架构、文件编解码及文件格式、VedioView类的方法和接口、Surface类,还有一些简单的实例等。

0.3读者对象

本文适合于对Android系统开发和对系统自带播放器有关内容有兴趣的读者,文档涉及到Android系统,因此要求读者具有一些Android的基本概念,如,一些常用类和方法的使用等。

0.4参考文献

【eoeAndroid特刊】第十五期:

android多媒体

0.5术语与缩写解释

缩写、术语

解释

Android

JNI

JavaNativeInterface

OSCL

OperatingSystemCompatibilityLibrary(操作系统兼容库)

PVMF

PacketVideoMultimediaFramework(PV多媒体框架)

1.系统环境

提示:

软件移植人员需明确说明移植软件所依赖的基础软硬件环境。

宿主机

AndroidSDK2.2

补充说明

2.Android的多媒体架构

2.1多媒体架构所处系统的位置

MediaFramework处于系统的Libraries层,这层的Library不是用Java实现的,一般是C/C++实现的,通过Java的JNI方式调用。

2.2多媒体架构

基于第三方PacketVideo公司的OpenCOREplatform来实现,支持所有通用的音频,视频,静态图像,格式包括:

MPEG4、H.264、MP3、AAC、AMR、JPG、PNG、GIF等。

OpenCore多媒体框架有一套通用的可扩展的接口,针对第三方的多媒体便解码器、输入、输出设备等,可实现如下功能:

●多媒体文件的播放,下载,包括3GPP,MPEG-4,ACCandMP3containers;

●流媒体文件的下载,实时播放,包括:

3GPP,HTTPandRTSP/RRTP;

●动态视频和静态图像的编码,解码,例如:

MPEG-4,H.263,JPEG;

●语音编码格:

ARM-NBandARM-WB;

●音乐编码格式:

MP3,AAC,AAC+;

●视频和图像格式:

3GPP,MPEG-4andJPEG;

●视频会议:

基于H324-Mstandard。

2.3OpenCore介绍

OpenCore是Android多媒体框架的核心,所有的Android平台的音视频采集,播放的操作都是通过它来实现的。

通过OpenCore程序员可以方便快捷的开发出多媒体应用程序,例如:

音视频的采集,回放,视频会议,实时的流媒体播放等应用。

相对于Android的其他程序库,OpenCore的代码非常庞大,它是一个基于C++实现的,定义了全功能的操作系统移植层,各种基本的功能均被封装成类的形式,各层次之间的接口多使用继承方式。

OpenCore是一个多媒体的框架,从宏观上来看,主要包含两方面的内容:

●PVPlayer:

提供媒体播放器的功能,完成各种音频、视频流的以及静态图像捕获功能。

●PVAuthor:

提供媒体流记录的功能,完成各种音频、视频流的以及静态图像捕获功能。

PVPlayer和PVAuthor以SDK的形式提供给开发者,可以在这个SDK之上构建多种应用程序服务。

在移动终端中常常使用的多媒体应用程序,例如媒体播放器、照相机、录像机、录音机等。

2.4OpenCore软件层次分层

为了更好的组织整体的架构,OpenCore在软件层次在宏观上分成几个层次:

图2-1OpenCore软件层次

(1)OSCL:

包含了一些操作系统底层的操作,为了更好地在不同操作进行系统移植。

包含了基本数据类型、配置、字符串工具、IO、错误处理、线程等内容,类似一个基础的C++库。

(2)PVMF:

在框架内实现一个文件解析(parser)和组成(composer)、编解码的Node,也可以继承其通用的接口,在用户层实现一些Node。

PVMF下面挂载的基本组件就是Node,就是实现一个具体功能的单元,在OpenCore中使用Node来完成某个指定的功能。

PVPlayer引擎:

从播放的角度,PVPlayer的输入的(Source)是文件或者网络媒体流,输出(Sink)是音频视频的输出设备,其基本功能包含了媒体流控制、文件解析、音频视频流的解码(Decode)等方面的内容。

除了播放媒体文件之外,还包含了与网络相关的RTSP流(RealTimeStreamProtocol,实时流协议)。

PVAuthor引擎:

在媒体流记录的方面,PVAuthor输入的(Source)是照相机、麦克风等设备、输出的(Sink)是各种文件,包含了流的同步,音频视频流的编码(Encode)以及文件的写入等功能。

(3)适配层和应用程序:

在使用OpenCore的SDK的时候,有可能需要在应用程序层实现一个适配器(Adaptor),然后在适配器之上实现具体的功能,对于PVMF的Node也可以基于通用的接口,在上层实现,以插件的形式使用。

2.5OpenCore上层代码

在实际开发中不需要关注OpenCore的实现,Android提供了上层的MediaAPI给开发人员使用,MediaPlayer和MediaRecorder。

引用其原文如下:

“AndroidMediaAPIs

TheAndroidplatformiscapableofplayingbothaudioandvideomedia.Itisalsocapableofplayingmediacontainedintheresourcesforanapplication,orastandalonefileinthefilesystem,orevenstreamingmediaoveradataconnection.Playbackisachievedthroughtheandroid.media.MediaPlayerclass.TheAndroidplatformcanalsorecordaudio.Videorecordingcapabilitiesarecominginthefuture.Thisisachievedthroughtheandroid.media.MediaRecorderclass.”

简单的使用例子如下:

MediaRecorderrecorder=newMediaRecorder();

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

recorder.setOutputFile(PATH_NAME);

recorder.prepare();

recorder.start();//Recordingisnowstarted...recorder.stop();

recorder.reset();//Youcanreusetheobjectbygoingbackto

setAudioSource()step

recorder.release();//Nowtheobjectcannotbereused

2.6MediaPlayer常用方法介绍

●方法:

create(Contextcontext,Uriuri)

解释:

静态方法,通过Uri创建一个多媒体播放器。

●方法:

create(Contextcontext,intresid)

解释:

静态方法,通过资源resid创建一个多媒体播放器。

●方法:

create(Contextcontext,Uriuri,SurfaceHolderholder)

解释:

静态方法,通过Uri和指定SurfaceHolder【抽象类】创建一个多媒体播放器。

●方法:

getCurrentPosition()

解释:

返回Int,得到当前播放位置。

●方法:

getDuration()

解释:

返回Int,得到文件的时间。

●方法:

getVideoHeight()

解释:

返回Int,得到视频的高度。

●方法:

getVideoWidth()

解释:

返回Int,得到视频的宽度。

●方法:

isLooping()

解释:

返回boolean,是否循环播放。

●方法:

isPlaying()

解释:

返回boolean,是否正在播放。

●方法:

pause()

解释:

无返回值,暂停。

●方法:

prepare()

解释:

无返回值,准备同步。

●方法:

prepareAsync()

解释:

无返回值,准备异步。

●方法:

release()

解释:

无返回值,释放MediaPlayer对象。

●方法:

reset()

解释:

无返回值,重置MediaPlayer对象。

●方法:

seekTo(intmsec)

解释:

无返回值,指定播放的位置(以毫秒为单位的时间)。

●方法:

setAudioStreamType(intstreamtype)

解释:

无返回值,指定流媒体的类型

●方法:

setDataSource(Stringpath)

解释:

无返回值,设置多媒体数据来源【根据路径】

●方法:

setDataSource(FileDescriptorfd,longoffset,longlen

解释:

无返回值,设置多媒体数据来源【根据FileDescriptor】。

●方法:

setDataSource(FileDescriptorfd)

解释:

无返回值,设置多媒体数据来源【根据FileDescriptor】。

●方法:

setDataSource(Contextcontext,Uriuri)

解释:

无返回值,设置多媒体数据来源【根据Uri】。

●方法:

setDisplay(SurfaceHoldersh)

解释:

无返回值,设置用SurfaceHolder来显示多媒体。

●方法:

setLooping(booleanlooping)

解释:

无返回值,设置是否循环播放。

●事件:

setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener

listener)

解释:

监听事件,网络流媒体的缓冲监听。

●事件:

setOnCompletionListener(MediaPlayer.OnCompletionListenerlistener)

解释:

监听事件,网络流媒体播放结束。

●事件:

setOnErrorListener(MediaPlayer.OnErrorListenerlistener)

解释:

监听事件,设置错误信息监听。

●事件:

setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener

listener)

解释:

监听事件,视频尺寸监听。

●方法:

setScreenOnWhilePlaying(booleanscreenOn)

解释:

无返回值,设置是否使用SurfaceHolder显示。

●方法:

setVolume(floatleftVolume,floatrightVolume)

解释:

无返回值,设置音量。

●方法:

start()

解释:

无返回值,开始播放。

●方法:

stop()

解释:

无返回值,停止播放。

3.文件格式处理和编解码部分简介

在多媒体方面,文件格式的处理和编解码(Codec)是基础。

多媒体应用主要包括媒体的播放(PlayBack)和媒体的记录(Recording)。

在媒体的播放过程中,通常情况是对媒体文件的播放,必要步骤是文件的解析和媒体流的解码。

例如对于一个MP4的文件,其中可能包括AMR和AAC的音频流,H263、MPEG4以及AVC(H264)的视频流,这些流被封装在3GP的包当中,媒体播放器要做的就是从文件中将这些流解析出来,然后对媒体流进行解码,解码后的数据才可以播放。

在媒体的记录过程(Recording)中,涉及到视频、音频、图像的捕获功能。

对于将视频加音频录制成文件功能,其过程与播放刚好相反,首先从硬件设备得到视频和音频的媒体流,然后对其进行编码,编码好的流还需要被分层次写入到文件之中,最终得到组成好的文件。

OpenCore有关文件格式处理和编解码两部分的内容,分别在目录fileformats和

codecs_v2当中。

这两部分都属于基础性的功能,不涉及具体的逻辑,因此它们可被别的模块调用,例如:

构建各种Node组件。

3.1文件格式的处理

由于同时涉及播放文件和记录文件两种功能,因此OpenCore中的文件格式处理有两种类型,一种是parser(解析器),另一种是composer(组成器)。

如果想进一步了解的话,请查阅相关的资料。

3.2编解码

编解码部分主要针对Audio和Video。

在audio和video目录中,对应了针对各种流的子目录,其中可能包含dec和enc两个目录,分别对应解码和编码。

如果想进一步了解的话,请查阅相关的资料。

3.3简单的例子

3.3.1播放一个文件

MediaPlayermp=newMediaPlayer();

mp.setDataSource(“/sdcard/test.mp3”);

mp.prepare();

mp.start();

3.3.2播放rawresource

MediaPlayermp=MediaPlayer.Create(context,R.raw.sound_file_1);

mp.start();

3.3.3录音

MediaRecorderrecorder=newMediaRecorder();

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

recorder.setOutputFile(“/sdcard/test.amr”);

recorder.prepare();

recorder.start();

...

3.3.4alarmclock调用Media

...

mMediaPlayer=newMediaPlayer();

mMediaPlayer.setVolume(IN_CALL_VOLUME,IN_CALL_VOLUME);

//检查是否是在通话中,若是,就换用较小的声音提示。

if(tm.getCallState()!

=TelephonyManager.CALL_STATE_IDLE){

Log.v("Usingthein-callalarm");

mMediaPlayer.setVolume(IN_CALL_VOLUME,IN_CALL_VOLUME);

setDataSourceFromResource(context.getResources(),

mMediaPlayer,R.raw.in_call_alarm);

}

else

{

mMediaPlayer.setDataSource(context,Uri.parse(mAlert));

}

mMediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);

mMediaPlayer.setLooping(true);

mMediaPlayer.prepare();

...

4.VedioView

在Android中,播放视频可以用VideoView,也可以用SurfaceView。

VideoView可以很容易地播放视频,虽然其播放位置和播放大小并不受我们控制,但已足够满足我们平常的调用;而Surface一般是用在游戏开发中的,我们仅在下一节中做简要的介绍。

现在我们将详尽的介绍VedioView。

4.1VedioView与MedioPlay之间的关系

首先我们要搞清楚VedioView和MedioPlay之间的关系?

在调用androidapi播放视频时,分别使用VideoView和MediaPlayer播放视频,这两个类到底是什么关系呢?

那么最简单的办法就是看看VideoView的源代码,是否调用MediaPlayer。

可以通过如下命令获取androidsdk源代码:

gitclonegit:

//android-api

sudoapt-getinstallgit

这要求首先安装git,一种版本控制工具:

VideoView的源代码在:

android-api/core/java/android/widget

从中可以发现,是VideoView调用MediaPlayer实现视频播放的,并提供了一些辅助功能。

接下来我们将介绍一些与VedioView有关的知识。

4.2VedioView常用方法介绍

VedioView类用于播放一个视频文件。

这个VideoView类可以从不同的来源(例如资源文件或内容提供器)读取图像,从它使用的任何一个布局资源管理器中取出视频文件并维护计算它的尺寸,并提供一些显示选项,例如缩放比例或者着色。

(1)VedioView类的公共构造函数如下:

●publicVideoView(Contextcontext)

创建一个默认属性的VideoView实例。

●publicVideoView(Contextcontext,AttributeSetattrs)

创建一个带有attrs属性的VideoView实例。

●publicVideoView(Contextcontext,AttributeSetattrs,intdefStyle)

创建一个带有attrs属性,并且指定其默认样式的VideoView实例。

(2)VedioView类的公共方法如下:

●publicbooleancanPause()

判断是否能够暂停播放视频。

●publicbooleancanSeekBackward()

判断是否能够倒退。

●publicbooleancanSeekForward()

判断是否能够快进。

●publicintgetBufferPercentage()

获得缓冲区的百分比。

●publicintgetCurrentPosition()

获得当前的位置。

●publicintgetDuration()

获得所播放视频的总时间。

●publicbooleanisPlaying()

判断是否正在播放视频。

●publicbooleanonKeyDown(intkeyCode,KeyEventevent)

默认实现KeyEvent.Callback.onKeyMultiple():

如果视图已启用并且可点击,当KEYCODE_DPAD_CENTER或者KEYCODE_ENTER被释放时,执行按下(Down)视图的操作。

其参数解释如下:

ØkeyCode  KeyEvent中用于表示按键被按下的识别码;

Øevent       按键操作中定义的KeyEvent对象。

返回值:

假如你已经处理了当前事件,返回true。

假如你想继续让下一个事件接收者(receiver)处理,则返回false。

●publicbooleanonTouchEvent(MotionEventev)

实现这个方法来处理触摸屏幕引发的事件。

  参数:

  event       动作事件。

  返回值:

  如果事件

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1