使用SurfaceView播放视频,其实很简单,但是经常会碰见有声音没图像的问题.

其实使用SurfaceView播放视频只需要主要下面几个地方就可以了

1. surfaceChanged也就是Suface是否创建成功

2. onPrepared 也就是MideoPlayer是否加载并准备完成

3. surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

类型必须是SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS

Java代码

packageVideoTest.Test;

importjava.io.FileDescriptor;

importandroid.app.Activity;

importandroid.content.res.AssetFileDescriptor;

importandroid.media.AudioManager;

importandroid.media.MediaPlayer;

importandroid.media.MediaPlayer.OnBufferingUpdateListener;

importandroid.media.MediaPlayer.OnCompletionListener;

importandroid.media.MediaPlayer.OnPreparedListener;

importandroid.os.Bundle;

importandroid.view.SurfaceHolder;

importandroid.view.SurfaceView;

publicclassVideoTestextendsActivityimplementsSurfaceHolder.Callback,

OnBufferingUpdateListener, OnCompletionListener, OnPreparedListener{

privateSurfaceView surfaceView;

privateSurfaceHolder surfaceHolder;

privateMediaPlayer mediaPlayer;

@Override

publicvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

this.surfaceView =newSurfaceView(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

publicvoidonDestroy() {

super.onDestroy();

if(this.mediaPlayer !=null) {

this.mediaPlayer.release();

this.mediaPlayer =null;

}

}

publicvoidPlayVideo(){

try{

//视频文件放在 assert中

AssetFileDescriptor aFD = this.getAssets().openFd("welcome.3gp");

FileDescriptor fileDescriptor = aFD.getFileDescriptor();

this.mediaPlayer =newMediaPlayer();

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

publicvoidsurfaceChanged(SurfaceHolder holder,intformat,intwidth,

intheight) {

}

@Override

publicvoidsurfaceCreated(SurfaceHolder holder) {

//SurfaceCreated 创建成功才可以播放视频

PlayVideo();

}

@Override

publicvoidsurfaceDestroyed(SurfaceHolder holder) {

}

//@Override

publicvoidonBufferingUpdate(MediaPlayer mp,intpercent) {

// TODO Auto-generated method stub

}

//@Override

publicvoidonCompletion(MediaPlayer mp) {

// TODO Auto-generated method stub

}

//@Override

publicvoidonPrepared(MediaPlayer mp) {

//MediaPlayer加载准备完毕才能开始播放

//mp.start();

}

}

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.

Java中mediaplayer_MediaPlayer 用法(一) - 一切皆有可能 - JavaEye技术网站相关推荐

  1. java中import用法

    java中import用法 单类型导入(single-type-import),例如import java.io.File; 按需类型导入(type-import-on-demand),例如 impo ...

  2. java中extends用法_JAVA的extends用法

    理解继承是理解面向对象程序设计的关键.在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类).在Java中不允许多继承. (1)继承 cla ...

  3. java中continue用法

    java中continue用法 有时强迫一个循环提早反复是有用的,也就是,你可能想要继续运行循环,但是要忽略这次重复剩余的循环体的语句,所以 java提供了 continue 语句.continue ...

  4. java中switch用法举例范围_Java中Switch用法代码示例

    一.java当中的switch与C#相比有以下区别 注:在java中switch后的表达式的类型只能为以下几种:byte.short.char.int(在Java1.6中是这样), 在java1.7后 ...

  5. java中Iterator用法总结

    Java中Iterator用法 迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为"轻量级& ...

  6. java中nextInt()用法

    java中nextInt用法 功能 函数实现 三级目录 功能 给定一个参数n,nextInt(n)将返回一个大于等于0小于n的随机数,即:0 <= nextInt(n) < n. 函数实现 ...

  7. cal java中的用法_Java中static用法

    Java中static用法 转自 http://blog.pfan.cn/sword2008/13772.html 一.static 请先看下面这段程序: public class Hello{ pu ...

  8. JAVA中throw用法例子,Java Optional orElseThrow()用法及代码示例

    Java中的java.util.Optional类的orElseThrow()方法用于获取此Optional实例(如果存在)的值.如果此Optional实例中不存在任何值,则此方法将引发从指定供应商生 ...

  9. JAVA中this用法小结

    我知道很多朋友都和我一样:在JAVA程序中似乎经常见到"this",自己也偶尔用到它,但是到底"this"该怎么用,却心中无数!很多人一提起它,就说" ...

最新文章

  1. 21个高质量的Swift开源iOS App
  2. O(N) 求 1~N 逆元 模板及证明
  3. nginx mac 服务器 html,Mac上搭建 nginx 服务器
  4. 微服务架构的终极模式?
  5. 1816. 截断句子
  6. Asterisk标准通道变量
  7. Win7系统无法复制粘贴怎么解决
  8. 编写运行java的步骤,【简答题】编写运行Java程序需要经过哪些主要步骤? (30.0分)...
  9. GCC 常见参数配置
  10. LeetCode#70 Climbing Stairs
  11. 机器学习分类问题中_训练数据类别不均衡怎么解决
  12. 2022版史上最牛Java学习路线图(视频教程+配套资料)
  13. 我的开发环境配置经验
  14. 苹果电脑重装系统步骤
  15. 广义线性模型(Generalized Linear Model)之三:Poisson回归
  16. PHP解析大型Excel表格的库:box/spout
  17. 动漫插画培训班有哪些
  18. nginx配置https双向验证(ca机构证书+自签证书)
  19. ElasticSearch的_cat命令说明和其JavaAPI
  20. 【 同 余 定 理 (补充)】

热门文章

  1. 具有通配符?的模式匹配算法(BF)
  2. 这样做生意是亏了还是赚了
  3. 单片机编程思想指导【绝对值得仔细看】
  4. 5款CPQ报价管理系统测评,哪个值得用?
  5. 面向对象三大特征——extends继承性
  6. Runloop监控卡顿
  7. Spring4 AOP详解
  8. 为什么有时我们需要配置HOSTS来本地测试?和什么有关?若不配置HOSTS会影响什么?
  9. 一个案例告诉你,GIS技术与数据可视化结合能帮助我们什么?
  10. mysql_assoc函数_PHP函数返回mysql_fetch_assoc()结果基于索引的数组?