1、视图

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" > <EditText
android:id="@+id/et_path"
android:hint="请输入视频文件"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="/sdcard/mm.mp4"
/> <SeekBar
android:id="@+id/sb"
android:layout_width="fill_parent"
android:layout_height="wrap_content" /> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<Button
android:id="@+id/bt_play"
android:layout_weight="1"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:text="播放"
/>
<Button
android:id="@+id/bt_pause"
android:layout_weight="1"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:text="暂停"
/>
<Button
android:id="@+id/bt_replay"
android:layout_weight="1"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:text="重播"
/>
<Button
android:id="@+id/bt_stop"
android:layout_weight="1"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:text="停止"
/> </LinearLayout> <SurfaceView
android:id="@+id/sv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/> </LinearLayout>

2、android代码

 package com.example.videoplay;

 import java.io.File;

 import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.Toast; public class MainActivity extends Activity implements OnClickListener{
private EditText et_path;
private Button bt_play,bt_pause,bt_replay,bt_stop;
private MediaPlayer mediaPlayer;
private SurfaceView sv;
private int currentPosition;
private SeekBar sb;
private boolean isplaying;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); et_path = (EditText) findViewById(R.id.et_path);
bt_play = (Button) findViewById(R.id.bt_play);
bt_pause = (Button) findViewById(R.id.bt_pause);
bt_replay = (Button) findViewById(R.id.bt_replay);
bt_stop = (Button) findViewById(R.id.bt_stop); sb = (SeekBar) findViewById(R.id.sb); //监听进度条拖动改变状态
sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
//当拖动停止时的调用的方法
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int process = sb.getProgress();
if(mediaPlayer != null && mediaPlayer.isPlaying()){
mediaPlayer.seekTo(process);
} } @Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub } @Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub }
}); sv = (SurfaceView) findViewById(R.id.sv); //为什么要增加这个回调?主要是监控holder的变化的;因为如果你按一下小房子,声音仍在,而holder容易被销毁,再次打开时,看不到画面
sv.getHolder().addCallback(new Callback(){ @Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
// TODO Auto-generated method stub
System.out.println("holder被改变了!"); } @Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
System.out.println("holder被创建了!");
if(currentPosition > 0){
play(currentPosition);
} } @Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
System.out.println("holder被销毁了!"); if(mediaPlayer != null && mediaPlayer.isPlaying()){
currentPosition = mediaPlayer.getCurrentPosition();//获取当前所播放的位置
stop();//holder被销毁时,就stop媒体
} } }); bt_play.setOnClickListener(this);
bt_pause.setOnClickListener(this);
bt_replay.setOnClickListener(this);
bt_stop.setOnClickListener(this);
} @Override
public void onClick(View v) {
switch(v.getId()){
case R.id.bt_play:
play(0);
break;
case R.id.bt_pause:
pause();
break;
case R.id.bt_replay:
replay();
break;
case R.id.bt_stop:
stop();
break;
} } private void pause() {
if("继续".equals(bt_pause.getText().toString().trim())){
mediaPlayer.start();
bt_pause.setText("暂停");
return;
}
if(mediaPlayer != null && mediaPlayer.isPlaying()){
mediaPlayer.pause();
bt_pause.setText("继续");
return;
} } private void replay() {
if(mediaPlayer != null && mediaPlayer.isPlaying()){
mediaPlayer.seekTo(0);
return;
}
play(0); } private void stop() {
// TODO Auto-generated method stub
if(mediaPlayer != null && mediaPlayer.isPlaying()){
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
bt_play.setEnabled(true);
isplaying = false;
}
} private void play(int currentPosition2){
String path = et_path.getText().toString().trim();
//File file = new File(path);
//if(file.exists() && file.length() > 0){
try {
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDisplay(sv.getHolder());//设置video以SurfaceHolder播放
mediaPlayer.setDataSource(path);
//mediaPlayer.seekTo(currentPosition2);//不能把这定位放在此,否则播放不了
mediaPlayer.prepare();
mediaPlayer.seekTo(currentPosition2);
mediaPlayer.start();
//获取视频总长度
int max = mediaPlayer.getDuration();
sb.setMax(max);
new Thread(){
public void run(){
isplaying = true;
while(isplaying){
int position = mediaPlayer.getCurrentPosition();
sb.setProgress(position);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
mediaPlayer.setOnCompletionListener(new OnCompletionListener() { @Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
bt_play.setEnabled(true);
isplaying = false; }
});
bt_play.setEnabled(false);
} catch (Exception e) {
// TODO Auto-generated catch block
Toast.makeText(this, "播放失败!", 0).show();
e.printStackTrace();
}
//}else{
//Toast.makeText(this, "音频文件不存在!", 0).show();
//}
} }

注意:

1)如果要播放互联网文件,则要加入网络权限: <uses-permission android:name="android.permission.INTERNET"/>

2)要注意和音频文件的播放代码进行比较,音频代码为:http://www.cnblogs.com/zhongyinghe/p/5354040.html

视频播放-SurfaceView的更多相关文章

  1. Android视频播放-SurfaceView和Mediaplayer

    好几天没写博客了,处理了一点个人私事加上平时加班,基本上时间不充裕,上篇文章讲了一下用Mediaplayer来播放音乐,这次就讲讲使用Mediaplayer来和SurfaceView配合播放一个视频流 ...

  2. 我的Android学习之旅(转)

    去年大概在七月份的时候误打误撞接触了一阵子Android,之后由于工作时间比较忙,无暇顾及,九月份的时候自己空闲的时间比较多,公司相对来说加班情况没以前严重.开启了个人的Android学习之旅,初衷是 ...

  3. Android学习资料总结

    从事ASP.NET Web开发两年了,主要是做Web项目(ASP.NET WebForm和ASP.NET MVC),也做过C/S架构的企业内部系统,偶然接触Android,学艺不精,项目没做出什么,倒 ...

  4. Android 学习笔记之SurfaceView的使用+如何实现视频播放...

    学习内容: 1.掌握Surface的使用... 2.Android中如何实现视频播放... 1.SurfaceView类的使用   在Android中,一般播放音频时我们可以去使用Android提供的 ...

  5. android 全屏视频播放(SurfaceView + MediaPlayer)

    介绍个第三方: JieCaoVideoPlayer 实现Android的全屏视频播放,支持完全自定义UI.手势修改进度和音量.hls.rtsp,设置http头信息,也能在ListView.ViewPa ...

  6. MediaPlayer+SurfaceView 视频播放 示例

    SurfaceView的原理         SurfaceView在视频播放中起到显示画面的作用,而视频的播放主要通过MediaPlayer来控制.         SurfaceView 允许我们 ...

  7. Android几种视频播放方式,VideoView、SurfaceView+MediaPlayer、TextureView+MediaPlayer,以及主流视频播放器开源项目

    简单的说下一Android的几种视频播放功能: 1.VideoView:最简单的视频播放 <FrameLayout xmlns:android="http://schemas.andr ...

  8. Android之SurfaceView实现视频播放

    1.案例一 布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns: ...

  9. Android开发之MediaPlayer和SurfaceView组成视频播放器

    SurfaceView 使用双缓冲技术 是个重量级的组件 只要不可见,就不会创建,可见时,才会创建 只要不可见,就会销毁 SurfaceView一旦不可见,就会被销毁,一旦可见,就会被创建,销毁时停止 ...

随机推荐

  1. ios 面试题 经典(比较全) 根据重点总结

    史上最全的iOS面试题及答案 1.写一个NSString类的实现 + (id)initWithCString:(c*****t char *)nullTerminatedCString encodin ...

  2. 取出js对象的所有属性的方式

    例子: //取出事件的所有属性 $('#id_btn').bind("click dbclick mouseout",{crdx:'我是传的值'},function(e){ var ...

  3. TC基础使用指南(基于xbeta的TC配置文件)

    所有常用目录都可以通过ctrl+d加一个或几个字母的超快捷方式直接跳转到位. 按下BackSpace键,就可以进入到上一级目录 Ctrl+q 在右侧打开左侧选定文件,再按一次Ctrl+q退出 按 Ct ...

  4. cocos2dx工程

    1. create-android-project.sh 进入 pro.android/ ln -s ../Resources ./Resources

  5. C# 一些小东东

    在C#中,如果有一个方法我们不想继续使用,需要废弃的时候,可以在该方法前面加上一个[Obsolete]. string[] arr={"a","b"} if $ ...

  6. 资源文件(.RES)的应用

    资源档有什麽用处呢?最重要的有两个地方1.国际发行:我们将Application中所有的文字从Resource用读取,那麽,只要更动            Resource档的内容,就可以用不同语言的 ...

  7. HDU 1862 EXCEL次序 (排序水问题)

    Problem Description Excel对能够记录一组由任意列排序指定.现在,请把你编译的代码类似特征.   Input 測试输入包括若干測试用例. 每一个測试用例的第1行包括两个整数 N ...

  8. likely() and unlikely()

    likely() and unlikely() http://www.cnblogs.com/yangzd/archive/2010/09/27/1837202.html 在linux中判断语句经常会 ...

  9. BZOJ 3282: Tree( LCT )

    LCT.. -------------------------------------------------------------------------------- #include<c ...

  10. 浏览器与服务器间的交互(客服端 <---> 服务器)

    浏览器与服务器间的交互(客服端 <---> 服务器) 请求--->处理--->响应 对类HttpContext 内部成员的使用 例如 :Request .Response .  ...