视频播放-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一旦不可见,就会被销毁,一旦可见,就会被创建,销毁时停止 ...
随机推荐
- YII2 Gridview
YII2 Gridview 部分使用规则 1.页面显示的时间戳转换 a. [ 'label'=>'创建日期', 'attribute' => 'created_at', 'filter' ...
- C# Thread Programming Start
引言 1.理解多线程 2. 线程异步与线程同步 3.创建多线程应用程序 3.1通过System.Threading命名空间的类构建 3.1.1异步调用线程 3.1.2并发问题 3.1.3线程同步 3. ...
- C语言之三大查找算法
查找算法 1.二分查找 二分查找就是折半查找,其基本思想是:首先选取表中间位置的记录,将其关键字与给定关键字key进行比较,若相等,则查找成功.若key值比该关键字值大,则要找的元素一定在右子表中,则 ...
- Go与Docker的几本书的作者
http://thenewstack.io/ebookseries/http://thenewstack.io/building-a-web-server-in-go/
- KBMMW SampleService/SampleClient方式传输数据集
马上周末了,趁着下午这会儿回顾一下这几天对旧项目的升级过程,一些重要但不常用的东西记录下来是很有必要的.其中一个项目中对KBMMW的远程数据通讯方式做了改进,利用SampleService/Sampl ...
- 用PHP编写Hadoop的MapReduce程序
用PHP编写Hadoop的MapReduce程序 Hadoop流 虽然Hadoop是用Java写的,但是Hadoop提供了Hadoop流,Hadoop流提供一个API, 允许用户使用任何语言编 ...
- vs使代码可以折叠的方法
set [工具]->[选项]->[文本编辑器]->[C/C++]->[查看]->[大纲显示]->[大纲语句块] = True
- Linux malloc大内存的方法
本博文为原创,遵循CC3.0协议,转载请注明出处:http://blog.csdn.net/lux_veritas/article/details/9963199 ------------------ ...
- 获取系统的emoji表情定制键盘
首先 ,想要获取系统的表情,要首先知道表情对应的UTF8 的编码方式,我将其中一部分的图片展示出来 ,然后用UIButton 排列,iOS 7后又增加了300多个表情符号,这些都可以百度查到,现在上代 ...
- 素数环(C - 暴力求解)
素数环(暴力)(紫书194页) Description A ring is composed of n (even number) circles as shown in diagram. Put ...