使用SurfaceView播放视频,其实很简单,但是经常会碰见有声音没图像的问题.
其实使用SurfaceView播放视频只需要主要下面几个地方就可以了
1. surfaceChanged也就是Suface是否创建成功
2. onPrepared 也就是MideoPlayer是否加载并准备完成
3. surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
类型必须是SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS
package VideoTest.Test;
import java.io.FileDescriptor;
import android.app.Activity;
import android.content.res.AssetFileDescriptor;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class VideoTest extends Activity implements SurfaceHolder.Callback,
OnBufferingUpdateListener, OnCompletionListener, OnPreparedListener{
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private MediaPlayer mediaPlayer;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.surfaceView = new SurfaceView(this);
this.surfaceHolder = this.surfaceView.getHolder();
this.surfaceHolder.addCallback(this);
//类型必须设置成SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS
this.surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
setContentView(this.surfaceView);
}
@Override
public void onDestroy() {
super.onDestroy();
if (this.mediaPlayer != null) {
this.mediaPlayer.release();
this.mediaPlayer = null;
}
}
public void PlayVideo(){
try {
//视频文件放在 assert中
AssetFileDescriptor aFD = this.getAssets().openFd("welcome.3gp");
FileDescriptor fileDescriptor = aFD.getFileDescriptor();
this.mediaPlayer = new MediaPlayer();
this.mediaPlayer.setDataSource(fileDescriptor, aFD.getStartOffset(), aFD.getLength());
aFD.close();
//视频放在SDCard中
//File sdFile = Environment.getExternalStorageDirectory();
//this.mediaPlayer = new MediaPlayer();
//this.mediaPlayer.setDataSource(sdFile.getAbsoluteFile() + File.separator + "welcome.3gp");
//视频放在res中
//this.mediaPlayer = MediaPlayer.create(this, R.raw.welcome);
//网上的视频,没有测试
//this.mediaPlayer
// .setDataSource("http://xy2.163.com/download/down/wukong.mp3");
this.mediaPlayer.setDisplay(this.surfaceHolder);
this.mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
//准备完成后才可以播放,另外如果文件特别大或者从网上获得的资源
//会在这里等待时间过长,造成堵塞,这样的话就得用
//this.mediaPlayer.prepareAsync(),然后监听是否准备完毕在开始
this.mediaPlayer.prepare();
this.mediaPlayer.start();
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
//SurfaceCreated 创建成功才可以播放视频
PlayVideo();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
//@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
// TODO Auto-generated method stub
}
//@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
}
//@Override
public void onPrepared(MediaPlayer mp) {
//MediaPlayer加载准备完毕才能开始播放
//mp.start();
}
}
但是,对于一些人可能会产生另一个问题就是
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
在设置成SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS类型后,无法画图了
SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS的意思是创建一个"PUSH"surface,这个surface没有自己的缓冲区,没有自己的缓冲Buffer.
分享到:
相关推荐
Android MediaPlayer使用方法简单介绍
android MediaPlayer的三种使用方法
使用VideoView播放视频简单、方便,但有些早期的开发者还是更喜欢使用MediaPlayer来播放视频,但由于MediaPlayer主要用于播放音频,因此它没有提供图像输出界面,此时就需要借助于SurfaceView来显示MediaPlayer播放...
使用MediaPlayer 制作一个 视频播放器 ,可指定视频的大小、预览的模式之外,还提供对 prepare,OnCompletionListener 等事件的判断。 通过创建SurfaceView 视图与控制SurfaceView 的 SurfaceHolder 对象,搭配 ...
本文实例讲述了Android MediaPlayer基本使用方法。分享给大家供大家参考,具体如下: 使用MediaPlayer播放音频或者视频的最简单例子: Java代码部分: public class MediaPlayerStudy extends Activity { private ...
介绍了vc2008里面MediaPlayer控件的用法,浅显易懂,额日益的缺陷就是m_control的功能用不了,不知道问什么
需要使用软件 yEd Graph Editor 打开,内容基于个人当时的知识理解分析。
本文章介绍MediaPlayer本地音乐播放器,而当应用程序不再位于前台且没有正在使用它的活动时,为了确保音频继续播放,我们需要建立一个服务Service。 Activity与绑定服务Service之间的交互是本文章的重点(这里需要...
本篇文章是对Android中MediaPlayer的使用方法进行了详细的分析介绍,需要的朋友参考下
主要介绍了Android编程视频播放API之MediaPlayer用法,结合实例形式分析了基于Android API实现视频播放功能的多媒体文件读取、判断、事件响应及流媒体播放等相关实现技巧,需要的朋友可以参考下
MediaPlayer是用于播放音频和视频的,它支持多种格式音频文件(3gp、mp4),并提供了非常全面的控制方法。 方法名称 功能描述 setDataSource() 设置要播放的音频文件的位置 prepare() 在开始播放之前调用这个方法...
4、练习MediaPlayer的使用方法 三、实验原理 Service的启动和停止方式,Activity与Service的通信,前台Service,MediaPlayer。 一、实验目的 掌握Service的启动和停止方式,掌握Activity与Service的通信,了解前台...
本文主要介绍了Android的mediaplayer类作用和用法,并附上了关键代码,有需要的朋友可以参考下
收集到的一个非常好的安卓组件播放声音的小实例,区分了MediaPlayer和SoundPool两种方法的不同用法,会给初学者带来很大的帮助
使用的方法是setPlaybackParams,传入一个代表播放属性的类PlaybackParams。 本文介绍如何使用MediaPlayer调整播放速度。 MediaPlayer.setPlaybackParams 说明 播放速度设置在PlaybackParams对象中,再将此对象传入...
二、VideoView的使用方法 它主要有以下几种常用方法 步骤: 1.指定视频文件的路径, 2.接下来调用start()方法就可以开始播放视频,pause()方法就会暂停播放,resume()方法就会重新播放 注:获取视频文件也...
Cplusplusbuilder-Mediaplayer使用c ++ builder开发的简单音乐播放器运行方法点击Project1.exe
使用npm与npm install --save react-native-mediaplayer一起npm install --save react-native-mediaplayer 。 需要React Native> = 0.4.0。 使用Xcode打开项目导航器,右键单击并选择Libraries Add Files to [your ...