`
CrackRen
  • 浏览: 170806 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

MediaPlayer 用法(一)

阅读更多

使用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.

 

 

 

4
0
分享到:
评论
2 楼 tocute 2011-02-11  
請問  如果我只是單純地想要對surfaceview 做旋轉
我該怎麼做 ??
我試過用 animation , 外面再加個 layer , matrix
都沒有效果
不知道版主是否有建議
謝謝
tocute520@gmail.com
1 楼 lattimore 2010-10-21  
这个时候视频播放,视频绘制操作完全交给MediaPlayer的底层去做了。
这里我也还没有发现如何去自行 获取、修改、重绘图像。
继续跟踪!!!

相关推荐

    Android MediaPlayer使用方法简单介绍

    本篇文章将深入探讨`MediaPlayer`的使用方法,帮助开发者理解和掌握如何在Android应用中实现多媒体播放功能。 首先,创建`MediaPlayer`对象是使用它的第一步。通常,我们通过调用`MediaPlayer.create()`静态方法来...

    Android 使用MediaPlayer播放视频

    4. 将`Surface`传递给`MediaPlayer`:在`SurfaceHolder.Callback`的`surfaceCreated()`方法中,使用`setDisplay()`方法将`Surface`赋值给`MediaPlayer`。 以下是一个简单的视频播放示例: ```java MediaPlayer ...

    Android MediaPlayer 自定义循环次数

    这里需要注意的是,在MediaPlayer使用完毕后应该调用`release()`方法释放资源,避免内存泄漏。 ### 3. 注意事项 - **资源管理**:确保在MediaPlayer不再使用时释放资源,防止内存泄漏。 - **异常处理**:在尝试...

    MediaPlayer

    1. 初始化MediaPlayer:首先,你需要创建一个MediaPlayer对象,然后调用`setDataSource()`方法设置要播放的媒体文件路径或URL。 2. 准备与启动播放:使用`prepare()`或`prepareAsync()`方法来预加载媒体文件。如果...

    Android 使用MediaPlayer高级

    音量控制方面,`MediaPlayer`提供了`setVolume()`方法,接受两个参数,分别控制左右声道的音量。此外,还可以结合`AudioManager`类来全局调整音量或实现音效控制,如静音、音量渐变等。 错误处理是任何多媒体应用都...

    Android 中MediaPlayer使用详解源码

    本文将深入解析`MediaPlayer`的使用方法,并通过`VideoDemo`和`MusicDemo`两个示例来阐述其核心功能。 1. 初始化与创建 在使用`MediaPlayer`之前,首先需要实例化一个对象。通常,我们可以通过`MediaPlayer.create...

    Delphi使用MediaPlayer控件

    首先,我们需要了解MediaPlayer控件的基本用法。在Delphi的组件面板上找到MediaPlayer组件,将其拖放到Form上。这个控件包含了播放、暂停、停止等常用功能按钮,以及音量控制和播放进度条等元素。在设计阶段,可以...

    mediaplayer demo 播放暂停同一按钮

    8. **生命周期管理**: 如果mediaplayer demo是一个Activity或Fragment的一部分,那么在Activity的生命周期方法(如onResume()、onPause()、onDestroy())中,需要对MediaPlayer进行相应的操作,如重新开始播放、暂停...

    mediaplayer

    下面我们将深入探讨MediaPlayer的主要功能和使用方法: 1. 初始化和准备:首先,你需要创建一个MediaPlayer实例,并调用`setDataSource()`方法来指定要播放的媒体文件路径或URL。例如,如果文件存储在本地,可以...

    android MediaPlayer+SurfaceView实现播放

    在Android开发中,多媒体播放是常见的功能之一,`MediaPlayer` 和 `SurfaceView` 的结合使用是实现视频播放的标准方式。本篇文章将详细讲解如何利用这两个组件来构建一个视频播放器。 首先,`MediaPlayer` 是...

    使用MediaPlayer播放音频文件

    总的来说,`MediaPlayer`是Android开发中处理音频播放的核心工具,通过熟练掌握其使用方法,你可以创建功能丰富的音乐播放应用或者其他需要音频播放功能的应用。在实践中,可能会遇到各种问题,如文件格式不支持、...

    Mediaplayer做音乐播放

    2. **暂停**:使用`mediaPlayer.Pause()`方法暂停当前播放。 3. **停止**:`mediaPlayer.Stop()`方法会停止播放并重置到开始位置。 4. **音量控制**:通过`mediaPlayer.Volume`属性可以调整音量,值范围为0(静音)...

    一个用MediaPlayer播放网络视频案例

    在Android开发中,`MediaPlayer` 是一个非常重要的组件,它被用于播放各种音频和视频文件。这个案例将探讨如何利用 `MediaPlayer` 播放网络上的视频资源。首先,我们来了解一下 `MediaPlayer` 的基本概念。 `...

    android MediaPlayer播放视频网络URL,asset目录下文件,本地视频文件

    在本教程中,我们将深入探讨如何使用`MediaPlayer`播放网络URL、Asset目录下的文件以及本地视频文件。 一、播放网络URL视频 1. 首先,我们需要获取到网络视频的URL。这通常是一个HTTP或HTTPS链接,例如:`...

    测试mediaplayer的一个demo

    总结,这个“测试mediaplayer的一个demo”项目涵盖了Android Mediaplayer的基本用法,包括初始化、播放控制、状态监听以及UI交互。通过实践这个demo,开发者可以更深入地理解如何在Android应用中集成多媒体播放功能...

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

    在这个特定的示例中,我们关注的是如何使用MediaPlayer与进度条(SeekBar)结合,创建一个简单的音频播放器。以下是对这个Android应用开发知识点的详细解析: 1. **MediaPlayer类**: MediaPlayer是Android提供的...

    C#中利用mediaplayer打造mp3播放器 代码

    在C#编程环境中,开发一个基于MediaPlayer控件的MP3播放器是一项有趣且实用的实践。这个项目将涉及Windows Forms应用程序的设计,以及如何利用内置的MediaPlayer类来播放音频文件。以下是一些关键知识点: 1. **...

    MediaPlayer Demo_播放器简易代码_DEMO_

    下面将详细阐述 `MediaPlayer` 的核心概念、使用方法以及如何通过 DEMO 示例进行学习。 `MediaPlayer` 的主要功能包括: 1. **初始化和设置**:创建 `MediaPlayer` 对象后,通常需要调用 `setDataSource()` 方法...

    C#实现MediaPlayer播放器

    在C#编程环境中,开发一个MediaPlayer播放器是一项挑战性但有趣的任务。这涉及到对多媒体处理的理解,以及如何利用.NET Framework中的Microsoft.Xna.Framework.Media命名空间,尤其是MediaPlayer类。下面,我们将...

Global site tag (gtag.js) - Google Analytics