找过好过视频播放器的例子,但是都特么给一半代码,不给一半代码!
还有的给个 apk 例句?
我也是醉了!把自己以前的笔记发一下吧,
虽然有缺陷:
1,横屏切换的时候,线程会死掉,不能激活...
2,停止的时候,线程释放了资源,但是还是有一张图片在
3,待机状态,还有有声音播放的。
现在还没有解决,希望公布代码后,有人提出改进建议...
暂时实现了:
1,进度条绑定播放器的进度
2,三个按钮:播放,暂停,停止
3,视频从 SD 卡读取,就在根目录,当前是 hand.mp4(其他格式嘛?应该不支持吧....)
这是布局:
播放:
暂停:
TestVedioActivity.java
xml 布局:
- package com.open_open.android_ch14_2;
- import android.app.Activity;
- import android.media.AudioManager;
- import android.media.MediaPlayer;
- import android.os.Bundle;
- import android.os.Environment;
- import android.os.SystemClock;
- import android.view.SurfaceHolder;
- import android.view.SurfaceView;
- import android.view.View;
- import android.widget.Button;
- import android.widget.SeekBar;
- import android.widget.SeekBar.OnSeekBarChangeListener;
- / *视频播放器素材:1280x 720,来自sd卡
- 表面:原始图形缓冲区,
- Surface是管理显示内容的数据,储存数据的交换
- * /
- public class TestVedioActivity extends Activity {
- 私有SurfaceView sfview; //在Surface的基础上,显示视频
- 私人SurfaceHolder夹具; //在Surface的基础上,控制尺寸大小和格式
- private SeekBar sb; //进度条
- private MediaPlayer mp; //媒体播放器
- @覆盖
- protected void onCreate(Bundle savedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_test_vedio);
- sb =(SeekBar)findViewById(R.id.sb);
- sfview =(SurfaceView)findViewById(R.id.sfView);
- holder = sfview.getHolder();
- sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){
- @覆盖
- public void onStopTrackingTouch(SeekBar seekBar){
- if(mp!= null)
- mp.seekTo(seekBar.getProgress());
- }}
- @覆盖
- public void onStartTrackingTouch(SeekBar seekBar){
- }}
- @覆盖
- public void onProgressChanged(SeekBar seekBar,int progress,boolean fromUser){
- }}
- });
- }}
- public void doPlay(View view){
- if(mp!= null)
- 返回;
- mp = new MediaPlayer();
- String path = Environment.getExternalStorageDirectory()。getAbsolutePath()+"/ hand.mp4";
- 尝试{
- mp.setDataSource(path);
- mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
- mp.setDisplay(holder);
- mp.prepare();
- sb.setMax(mp.getDuration());
- mp.start();
- //控制进度条
- 新线程(新Runnable(){
- @覆盖
- public void run(){
- while(mp.getCurrentPosition()<= sb.getMax()){
- sb.setProgress(mp.getCurrentPosition()); //设置进度条当前进度
- SystemClock.sleep(200);
- }}
- }}
- });
- } catch(Exception e){
- e.printStackTrace();
- }}
- }}
- public void doPause(View view){
- if(mp!= null && mp.isPlaying()){
- mp.pause(); //暂停
- ((Button)view).setText("继续播放");
- } else if(mp!= null && mp.isPlaying()== false){
- mp.start(); //播放
- ((Button)view).setText("暂停");
- }}
- }}
- public void doStop(View view){
- if(mp!= null){
- sb.setProgress(0);
- mp.stop();
- mp.release();
- mp = null;
- }}
- }}
- }}
- <?xml version ="1.0"encoding ="utf-8"?>
- <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">
- <SeekBar
- android:id ="@ + id / sb"
- android:layout_width ="match_parent"
- android:layout_height ="wrap_content"
- />
- <LinearLayout android:layout_width ="match_parent"
- android:layout_height ="wrap_content"
- android:orientation ="horizo??ntal">
- <按钮
- android:layout_width ="wrap_content"
- android:layout_height ="wrap_content"
- android:text ="播放"
- android:onClick ="doPlay"
- />
- <按钮
- android:layout_width ="wrap_content"
- android:layout_height ="wrap_content"
- android:text ="暂停"
- android:onClick ="doPause"
- />
- <按钮
- android:layout_width ="wrap_content"
- android:layout_height ="wrap_content"
- android:text ="停止"
- android:onClick ="doStop"
- />
- </ LinearLayout>
- <SurfaceView
- android:id ="@ + id / sfView"
- android:layout_width ="match_parent"
- android:layout_height ="300sp"
- />
- </ LinearLayout>
来源: http://www.bubuko.com/infodetail-1953422.html