视频播放-SurfaceView
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的更多相关文章
- Android视频播放-SurfaceView和Mediaplayer
好几天没写博客了,处理了一点个人私事加上平时加班,基本上时间不充裕,上篇文章讲了一下用Mediaplayer来播放音乐,这次就讲讲使用Mediaplayer来和SurfaceView配合播放一个视频流 ...
- 我的Android学习之旅(转)
去年大概在七月份的时候误打误撞接触了一阵子Android,之后由于工作时间比较忙,无暇顾及,九月份的时候自己空闲的时间比较多,公司相对来说加班情况没以前严重.开启了个人的Android学习之旅,初衷是 ...
- Android学习资料总结
从事ASP.NET Web开发两年了,主要是做Web项目(ASP.NET WebForm和ASP.NET MVC),也做过C/S架构的企业内部系统,偶然接触Android,学艺不精,项目没做出什么,倒 ...
- Android 学习笔记之SurfaceView的使用+如何实现视频播放...
学习内容: 1.掌握Surface的使用... 2.Android中如何实现视频播放... 1.SurfaceView类的使用 在Android中,一般播放音频时我们可以去使用Android提供的 ...
- android 全屏视频播放(SurfaceView + MediaPlayer)
介绍个第三方: JieCaoVideoPlayer 实现Android的全屏视频播放,支持完全自定义UI.手势修改进度和音量.hls.rtsp,设置http头信息,也能在ListView.ViewPa ...
- MediaPlayer+SurfaceView 视频播放 示例
SurfaceView的原理 SurfaceView在视频播放中起到显示画面的作用,而视频的播放主要通过MediaPlayer来控制. SurfaceView 允许我们 ...
- Android几种视频播放方式,VideoView、SurfaceView+MediaPlayer、TextureView+MediaPlayer,以及主流视频播放器开源项目
简单的说下一Android的几种视频播放功能: 1.VideoView:最简单的视频播放 <FrameLayout xmlns:android="http://schemas.andr ...
- Android之SurfaceView实现视频播放
1.案例一 布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns: ...
- Android开发之MediaPlayer和SurfaceView组成视频播放器
SurfaceView 使用双缓冲技术 是个重量级的组件 只要不可见,就不会创建,可见时,才会创建 只要不可见,就会销毁 SurfaceView一旦不可见,就会被销毁,一旦可见,就会被创建,销毁时停止 ...
随机推荐
- C函数调用与栈--代码真相
前面详细的说了,C函数调用的过程中,栈的变化情况的原理部分,这里在看一下汇编代码的真正的实现. 有关前面的那一片博客,主要记住的就是函数调用时栈的变化,4+3+2的步骤: (1)设置栈帧边界 (2)开 ...
- jquery选择器控制Html元素
1.JQuery中有addClass,removeClass,toggleClass addClass(class):为每个匹配的元素添加指定的类名 removeClass(class):从所有匹配的 ...
- Introduction to REST #Reprinted#
from http://www.cnblogs.com/shanyou/archive/2012/05/12/2496959.html dudu的 HttpClient + ASP.NET Web A ...
- [Android文档翻译]设备兼容性
原文地址:Device Compatibility Android设计于运行在多种不同类型的设备上,从手机.平板到电视.作为一名开发者,设备的涵盖范围为你的app提供了广大的潜在用户.为了让你的app ...
- 基于QtQuick2.0应用程序运行于XP系统的诸多问题
客户端 使用QtQuick技术开发酷炫的XP客户端经常遇到白屏或者无界面 if Qt is built using ANGLE, its shared libraries and the requir ...
- spring jdbc 笔记3
spring JDBC 加入对commons-dbcp spring-jdbc spring-tx的依赖 1.数据源的配置 获取数据源在spring中的Bean管理默认已经是单例模式 关闭数据源d ...
- Hadoop Hive与Hbase整合+thrift
Hadoop Hive与Hbase整合+thrift 1. 简介 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句 ...
- JavaEE Tutorials (7) - 在会话bean中使用异步方法调用
7.1异步方法调用88 7.1.1创建异步业务方法88 7.1.2从企业bean客户端调用异步方法897.2async示例应用90 7.2.1async—war模块的架构91 7.2.2运行async ...
- 大Q品牌故事_大Q官网_腾讯旗下买卖宝公司倾力打造
大Q品牌故事_大Q官网_腾讯旗下买卖宝公司倾力打造 走在大路上的改变者,有态度的互联网手机品牌
- 经典switch