【Android SurfaceView】視訊播放器 簡單例子
阿新 • • 發佈:2019-01-02
找過好過視訊播放器的例子,但是都特麼給一半程式碼,不給一半程式碼!
還有的
我也是醉了!把自己以前的筆記發一下吧,
雖然有缺陷:
1,橫屏切換的時候,執行緒會死掉,不能啟用... (已經搞定了!謝謝各位dalao!)
2,停止的時候,執行緒釋放了資源,但是還是有一張圖片在
3,待機狀態,還有有聲音播放的。
現在還沒有解決,希望公佈程式碼後,有人提出改進建議...
暫時實現了:
1,進度條繫結播放器的進度
2,三個按鈕:播放,暫停,停止
3,視訊從SD卡讀取,就在根目錄,當前是hand.mp4(其他格式嘛?應該不支援吧....)
4、切換螢幕的時候,仍然可以播放,執行緒沒有死掉!播放也繼續進度!
這是佈局:
播放:
暫停:
1、TestVedioActivity.java
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:原始圖形緩衝區, Surface是管理顯示內容的資料,儲存資料的交換 */ public class TestVedioActivity extends Activity { private SurfaceView sfview; //在Surface的基礎上,顯示視訊 private SurfaceHolder holder; //在Surface的基礎上,控制尺寸大小和格式 private SeekBar sb; //進度條 private MediaPlayer mp; //媒體播放器 @Override 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() { @Override public void onStopTrackingTouch(SeekBar seekBar) { if(mp!=null) mp.seekTo(seekBar.getProgress()); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { } }); } public void doPlay(View view){ if(mp!=null) return; mp=new MediaPlayer(); String path=Environment.getExternalStorageDirectory().getAbsolutePath()+"/hand.mp4"; try { mp.setDataSource(path); mp.setAudioStreamType(AudioManager.STREAM_MUSIC); mp.setDisplay(holder); mp.prepare(); sb.setMax(mp.getDuration()); mp.start(); //控制進度條 new Thread(new Runnable() { @Override 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; } } }
2、xml佈局:
<?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="horizontal"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="播放" android:onClick="doPlay" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="暫停" android:onClick="doPause" /> <Button 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>
3、Android Manifest.xml 許可權開啟:
<! - 許可權開啟:增加檔案解除安裝,允許寫入SD卡,允許開啟攝像頭,允許錄音 - >
<uses-permission android :name = “android.permission.MOUNT_UNMOUNT_FILESYSTEMS” /> <uses-permission android :name = “android.permission.WRITE_EXTERNAL_STORAGE” /> <uses-permission android :name = “android.permission.CAMERA” / > <uses-permission android :name = “android.permission.RECORD_AUDIO” />
TestVedioActivity :這裡的四個 屬性,讓切換螢幕的時候執行緒沒有死掉!
<activity android:name=".TestVedioActivity" android:configChanges="orientation|screenLayout|keyboardHidden|screenSize"/>
要是有所改進,我會發第二篇 改進的部落格的。