Android多媒体架构介绍
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android多媒体框架分析
------音视频播放与录制
Media Framework:Android系统提供的支持音频视频的播放和录制的接口
(图1) Android框架图
图中用黄线圈出的是Media Framework
从框架图可以看出Media Framework处于Libraries这一层,这层的Library不是用Java实现,一般是C/C++实现,它们通过Java的JNI方式调用。
Media Framework支持所有通用的音频,视频,静态图像格式
支持的格式包括:MPEG4、H.264、MP3、AAC、AMR、JPG、PNG等。
l 多媒体文件的播放,下载,包括3GPP, MPEG-4,AAC and MP3 containers l 流媒体文件的下载,实时播放,包括:3GPP, HTTP and RTSP/RTP
l 动态视频和静态图像的编码,解码,例如:MPEG-4, H.263 and AVC (H.264) JPEG
l 语音编码格式: AMR-NB and AMR-WB
l 音乐编码格式: MP3, AAC, AAC+
l 视频和图像格式: 3GPP, MPEG-4 and JPEG
l 视频会议:基于H324-M standard
在实际的应用开发中我们并不会过多的研究Media Framework的实现,Android提供了上层的Media API给开发人员使用,MediaPlayer和MediaRecorder
这两个类主要实现音频和视频的播放和录制。
int getCurrentPosition()
Gets the current playback position.
int getDuration()
Gets the duration of the file.
int getVideoHeight()
Returns the height of the video.
int getVideoWidth()
Returns the width of the video.
boolean isPlaying()
Checks whether the MediaPlayer is playing.
void pause()
Pauses playback.
void prepare()
Prepares the player for playback, synchronously.
void prepareAsync()
Prepares the player for playback, asynchronously.
void release()
Releases resources associated with this MediaPlayer object.
void reset()
Resets the MediaPlayer to its uninitialized state.
void seekTo(int msec)
Seeks to specified time position.
void setAudioStreamType(int streamtype)
Sets the audio stream type for this MediaPlayer.
void setDataSource(String path)
Sets the data source (file-path or http/rtsp URL) to use.
void setDisplay(SurfaceHolder sh)
Sets the SurfaceHolder to use for displaying the video portion of the media.
void setVolume(float leftVolume, float rightVolume)
Sets the volume on this player.
void start()
Starts or resumes playback.
void stop()
Stops playback after playback has been stopped or paused.
我们可以看出MediaPlayer类提供了一个多媒体播放器的基本操作,播放,暂停,停止,设置音量等等。
状态机:
音乐播放
参考代码:
Audiopreview.java
Mediaplaybackservice.java
1:音乐播放使用prepare():
mPlayer = new MediaPlayer();
try {
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
设置音频类型为Music 类型
mPlayer.setDataSource(soundFilePath);
设置音源
mPlayer.prepare();
准备好播放器
} catch(IOException e) {
Log.e(TAG, "Error setting up sound " + mSoundId, e);
异常处理
return;
}
try {
mPlayer.start();
开始播放音乐
} catch (Exception e) {
Log.e(TAG, "Error playing sound " + mSoundId, e);
}
2:使用prepareAsync
mPlayer = new PreviewPlayer();
mPlayer. setDataSource(uri);
mPlayer.prepareAsync();
异步任务,完成后会调用onPrepared()
需要先implements OnPreparedListener
public void onPrepared(MediaPlayer mp) {
mPlayer.start();
开始播放
…..
这边可以将其它需要做的加在这里,比如更新播放界面之类的操作。
}
音乐暂停或停止:
mPlayer.pause();
音乐暂停
mPlayer.Stop()
音乐停止
mPlayer.release();
释放音乐播放器资源。
监听音乐播放完成:
首先需要implements OnCompletionListener
再重写:onCompletion(MediaPlayer mp)方法
public void onCompletion(MediaPlayer mp) {
……….
updatePlayPause();
// 此处可以加入需要的操作,比如更新界面,播放下一首等。
}
视频播放
参考代码:MoviePlayer.java
VideoView.java
构造函数:
实际播放的动作:
可以看到真正播放视频的地方是:mVideoView.start();
private final VideoView mVideoView;
再来看下VideoView这个类
VideoView 是继承SurfaceView,播放视频的时候会不停地刷新界面,此时需要用SurfaceView。
从上面的代码中看到当isInPlaybackState时,就直接调用mMediaPlayer.start() 了,没有看到做准备的动作。
那么准备的工作在哪里做了呢:
这里是surface创建完成的回调函数,里面的OpenVideo函数:
这里面已将完成,出错,准备好等的处理函数配置好了。
此处的mMediaPlayer.prepareAsync();为异步,我们再来看下当准备好之后又做了什么事情:
后面的视频停止,暂停就直接调用:
mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer.pause();
MediaRecorder
嵌套、关联的类
Class MediaRecorder.AudioEncoder
定义音频编码
Class MediaRecorder.AudioSource
定义声音资源
Interface MediaRecorder.OnErrorListener
Interface definition for a callback to be invoked when an error occurs while recording.
Interface MediaRecorder.OnInfoListener
Interface definition for a callback to be invoked when an error occurs while recording. Class MediaRecorder.OutputFormat
定义输出格式
Class MediaRecorder.VideoEncoder
定义视频编码
Class MediaRecorder.VideoSource
定义视频资源
主要方法:
final static int getAudioSourceMax() Gets the maximum value for audio sources.
获取音频信号源的最高值。
int getMaxAmplitude()
Returns the maximum absolute amplitude that was sampled since the last call to this method.
最后调用这个方法采样的时候返回最大振幅的绝对值
void prepare()
Prepares the recorder to begin capturing and encoding data.
准备recorder 开始捕获和编码数据
void release()
Releases resources associated with this MediaRecorder object.
发布与此MediaRecorder对象关联的资源
void reset()
Restarts the MediaRecorder to its idle state.
重新启动mediarecorder到空闲状态
void setAudioChannels(int numChannels)
Sets the number of audio channels for recording.
设置录制的音频通道数。
void setAudioEncoder(int audio_encoder)
Sets the audio encoder to be used for recording.
设置audio的编码格式
void setAudioEncodingBitRate(int bitRate)
Sets the audio encoding bit rate for recording.
设置录制的音频编码比特率
void setAudioSamplingRate(int samplingRate)
Sets the audio sampling rate for recording.
设置录制的音频采样率。
void setAudioSource(int audio_source)
Sets the audio source to be used for recording.
设置用于录制的音源。
void setAuxiliaryOutputFile(String path)
Pass in the file path for the auxiliary time lapse video.
辅助时间的推移视频文件的路径传递。
void setAuxiliaryOutputFile(FileDescriptor fd)
Pass in the file descriptor for the auxiliary time lapse video. 在文件描述符传递的辅助时间的推移视频
void setCamera(Camera c)
Sets a Camera to use for recording.
设置一个recording的摄像头
void setCaptureRate(double fps)
Set video frame capture rate.
设置视频帧的捕获率
void setMaxDuration(int max_duration_ms)
Sets the maximum duration (in ms) of the recording session. 设置记录会话的最大持续时间(毫秒)
void setMaxFileSize(long max_filesize_bytes)
Sets the maximum filesize (in bytes) of the recording session.
设置记录会话的最大大小(以字节为单位)
void setOnErrorListener(MediaRecorder.OnErrorListener l)
Register a callback to be invoked when an error occurs while recording.
注册一个回调被调用发生错误时,同时录制
void setOnInfoListener(MediaRecorder.OnInfoListener listener)
Register a callback to be invoked when an informational event occurs while recording. 注册要同时记录一个信息事件发生时调用的回调。
void setOrientationHint(int degrees)
Sets the orientation hint for output video playback.
设置输出的视频播放的方向提示
void setOutputFile(FileDescriptor fd)
Pass in the file descriptor of the file to be written.
传递要写入的文件的文件描述符
void setOutputFile(String path)
Sets the path of the output file to be produced.
设置输出文件的路径
void setOutputFormat(int output_format)
Sets the format of the output file produced during recording.
设置在录制过程中产生的输出文件的格式
void setPreviewDisplay(Surface sv)
Sets a Surface to show a preview of recorded media (video).
表面设置显示记录媒体(视频)的预览
void setProfile(CamcorderProfile profile)
Uses the settings from a CamcorderProfile object for recording.
从一个记录CamcorderProfile对象的使用设置
void setVideoEncoder(int video_encoder)
Sets the video encoder to be used for recording.
设置视频编码器,用于录制
void setVideoEncodingBitRate(int bitRate)
Sets the video encoding bit rate for recording.
设置录制的视频编码比特率。
void setVideoFrameRate(int rate)
Sets the frame rate of the video to be captured.
设置要捕获的视频帧速率
void setVideoSize(int width, int height)
Sets the width and height of the video to be captured.
设置要捕获的视频的宽度和高度
void setVideoSource(int video_source)
Sets the video source to be used for recording.
void start()
Begins capturing and encoding data to the file specified with setOutputFile(). 开始捕捉和编码数据到setOutputFile(指定的文件)
void stop()
Stops recording.
停止recording
音频录制
参考代码:SoundRecorder.java
Record.java
首先在SoundRecorder的OnCreate函数中:
mRecorder = new Recorder();
后面的操作都是基于mRecorder。
我们来看下开始录音的地方:
从上面的code可以看到真正录音是调用mRecorder.startRecording(。
)函数
我们再来看下这个函数具体做了什么:
此时就开始录音了。
录音的的停止:
mRecorder.stop(); 停止录音
mRecorder.release(); 释放资源
视频录制:
参考代码:VideoCamera.java
这是我们在相机的界面上面的录制按钮的点击事件,可以看到当点击按钮的时候会调用startVideoRecording()来录像,
startVideoRecording():
再来看下initializeRecorder()这里做了什么:
此时视频录制开始。
停止视频录制:
mMediaRecorder.stop(); 停止录制视频
mMediaRecorder.release();释放资源。
Q&A。