Android中SurfaceView視訊播放實現程式碼
SurfaceView的特性是:可以在主執行緒之外的執行緒中向螢幕繪圖上。這樣可以避免畫圖任務繁重的時候造成主執行緒阻塞,從而提高了程式的反應速度。在遊戲開發中多用到SurfaceView,遊戲中的背景、人物、動畫等等儘量在畫布canvas中畫出。
1.案例一
佈局檔案:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:weightSum="1"> <SurfaceView android:layout_height="220dip" android:layout_gravity="center" android:id="@+id/surface" android:layout_weight="0.25" android:layout_width="320dip"> </SurfaceView> <LinearLayout android:id="@+id/linearLayout1" android:layout_height="wrap_content" android:layout_width="fill_parent"> <Button android:text="播放" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"> </Button> <Button android:text="暫停" android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content"> </Button> <Button android:text="停止" android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content"> </Button> </LinearLayout> </LinearLayout>
主程式:
public class SurfaceActivity extends Activity implements SurfaceHolder.Callback { /** Called when the activity is first created. */ MediaPlayer player; SurfaceView surface; SurfaceHolder surfaceHolder; Button play,pause,stop; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); play=(Button)findViewById(R.id.button1); pause=(Button)findViewById(R.id.button2); stop=(Button)findViewById(R.id.button3); surface=(SurfaceView)findViewById(R.id.surface); surfaceHolder=surface.getHolder();//SurfaceHolder是SurfaceView的控制介面 surfaceHolder.addCallback(this); //因為這個類實現了SurfaceHolder.Callback介面,所以回撥引數直接this surfaceHolder.setFixedSize(320, 220);//顯示的解析度,不設定為視訊預設 surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//Surface型別 play.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { player.start(); }}); pause.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { player.pause(); }}); stop.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { player.stop(); }}); } @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { } @Override public void surfaceCreated(SurfaceHolder arg0) { //必須在surface建立後才能初始化MediaPlayer,否則不會顯示影像 player=new MediaPlayer(); player.setAudioStreamType(AudioManager.STREAM_MUSIC); player.setDisplay(surfaceHolder); //設定顯示視訊顯示在SurfaceView上 try { player.setDataSource("/sdcard/3.mp4"); player.prepare(); } catch (Exception e) { e.printStackTrace(); } } @Override public void surfaceDestroyed(SurfaceHolder arg0) { // TODO Auto-generated method stub } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); if(player.isPlaying()){ player.stop(); } player.release(); //Activity銷燬時停止播放,釋放資源。不做這個操作,即使退出還是能聽到視訊播放的聲音 } }
2.案例二
佈局檔案main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/filename" /> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="oppo.mp4" android:id="@+id/filename" /> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" > <ImageButton android:layout_width="wrap_content" android:layout_height="fill_parent" android:src="@drawable/play" android:id="@+id/play" /> <ImageButton android:layout_width="wrap_content" android:layout_height="fill_parent" android:src="@drawable/pause" android:id="@+id/pause" /> <ImageButton android:layout_width="wrap_content" android:layout_height="fill_parent" android:src="@drawable/stop" android:id="@+id/stop" /> <ImageButton android:layout_width="wrap_content" android:layout_height="fill_parent" android:src="@drawable/reset" android:id="@+id/reset" /> </LinearLayout> <SurfaceView android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/surfaceview" /> </LinearLayout>
主程式VodeoPlayActivity.java
public class VodeoPlayActivity extends Activity { /** Called when the activity is first created. */ private EditText filenamEditText; private MediaPlayer mediaPlayer; private String filename; private SurfaceView surfaceView; private final static String TAG="VodeoPlayActivity"; private int prosition=0; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); filenamEditText=(EditText) this.findViewById(R.id.filename); surfaceView=(SurfaceView)this.findViewById(R.id.surfaceview); surfaceView.getHolder().setFixedSize(176, 144);//設定解析度 surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//設定surfaceview不維護自己的緩衝區,而是等待螢幕的渲染引擎將內容推送到使用者面前 surfaceView.getHolder().addCallback(new SurceCallBack());//對surface物件的狀態進行監聽 mediaPlayer=new MediaPlayer(); ButtonOnClikListiner buttonOnClikListinero=new ButtonOnClikListiner(); ImageButton start=(ImageButton) this.findViewById(R.id.play); ImageButton pause=(ImageButton) this.findViewById(R.id.pause); ImageButton stop=(ImageButton) this.findViewById(R.id.stop); ImageButton replay=(ImageButton) this.findViewById(R.id.reset); start.setOnClickListener(buttonOnClikListinero); pause.setOnClickListener(buttonOnClikListinero); stop.setOnClickListener(buttonOnClikListinero); replay.setOnClickListener(buttonOnClikListinero); } private final class ButtonOnClikListiner implements View.OnClickListener{ @Override public void onClick(View v) { if(Environment.getExternalStorageState()==Environment.MEDIA_UNMOUNTED){ Toast.makeText(VodeoPlayActivity.this, "sd卡不存在", Toast.LENGTH_SHORT).show(); return; } filename=filenamEditText.getText().toString(); switch (v.getId()) { case R.id.play: play(); break; case R.id.pause: if(mediaPlayer.isPlaying()){ mediaPlayer.pause(); }else{ mediaPlayer.start(); } break; case R.id.reset: if(mediaPlayer.isPlaying()){ mediaPlayer.seekTo(0); }else{ play(); } break; case R.id.stop: if(mediaPlayer.isPlaying()){ mediaPlayer.stop(); } break; } } } private void play() { try { File file=new File(Environment.getExternalStorageDirectory(),filename); mediaPlayer.reset();//重置為初始狀態 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//設定音樂流的型別 mediaPlayer.setDisplay(surfaceView.getHolder());//設定video影片以surfaceviewholder播放 mediaPlayer.setDataSource(file.getAbsolutePath());//設定路徑 mediaPlayer.prepare();//緩衝 mediaPlayer.start();//播放 } catch (Exception e) { Log.e(TAG, e.toString()); e.printStackTrace(); } } private final class SurceCallBack implements SurfaceHolder.Callback{ /** * 畫面修改 */ @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } /** * 畫面建立 */ @Override public void surfaceCreated(SurfaceHolder holder) { if(prosition>0&&filename!=null){ play(); mediaPlayer.seekTo(prosition); prosition=0; } } /** * 畫面銷燬 */ @Override public void surfaceDestroyed(SurfaceHolder holder) { if(mediaPlayer.isPlaying()){ prosition=mediaPlayer.getCurrentPosition(); mediaPlayer.stop(); } } } }
相關文章
- 手機直播原始碼,Android studio 實現簡單的視訊播放原始碼Android
- PHP 幾行核心程式碼實現提取快手水印視訊播放地址PHP
- Android進階5:SurfaceView實現原理分析AndroidView
- Android開發 海康威視 多路視訊播放(同時播放視訊)Android
- 實現播放視訊及彈幕
- FFmpeg程式碼實現視訊剪下
- video自定義實現視訊播放功能IDE
- Android 音視訊錄製硬編碼實現Android
- 短視訊原始碼,在Android 中opengl es實現燈光效果原始碼Android
- unity中播放視訊Unity
- 如何實現視訊加密全平臺播放加密
- android使用MediaCodec實現非同步視訊編解碼Android非同步
- 帶你用AVPlayer實現音訊和視訊播放音訊
- python實現播放音訊和錄音功能示例程式碼Python音訊
- 使用Dplayer實現Vue3中的視訊及彈幕播放Vue
- Android 音視訊開發 - 使用AudioTrack播放音訊Android音訊
- Android 音視訊 - EGL 原始碼解析以及 C++ 實現Android原始碼C++
- 35.FFmpeg+OpenGLES+OpenSLES播放器實現(九.OpenGLES播放視訊)播放器
- FFmpeg程式碼實現視訊轉jpg圖片
- Electron實現跨平臺全能視訊播放器播放器
- Flutter 實現視訊全屏播放邏輯及解析Flutter
- ffmpeg播放器實現詳解 - 視訊顯示播放器
- ReactNative——react-native-video實現視訊全屏播放ReactIDE
- 小程式播放當前視訊關閉其他視訊
- vue+樹莓派實現實時視訊播放暫停Vue樹莓派
- Android技術分享| 安卓3行程式碼,實現整套音視訊通話功能Android安卓行程
- sync-player:使用websocket實現異地同步播放視訊Web
- 一行程式碼實現Android的跨程式呼叫與通訊行程Android
- 使用海康H5視訊播放器開發包實現監控播放H5播放器
- [-綜合篇-] 相機、OpenGL、視訊、Flutter和SurfaceViewFlutterView
- 短視訊程式原始碼,PageSlider實現滑動頁面原始碼IDE
- 音視訊同步!RTCP 協議解析及程式碼實現TCP協議
- android 音訊播放 SoundPoolAndroid音訊
- WPF播放視訊
- Android 如何判斷螢石雲視訊是否可以播放Android
- Android進階:十、自定義視訊播放器 1Android播放器
- Dplayer Html5 彈幕視訊播放器的實現HTML播放器
- Android 音視訊開發 視訊編碼,音訊編碼格式Android音訊
- Android 音視訊 - MediaCodec 編解碼音視訊Android