package com.itheima.videoplayer; import java.io.IOException; import android.media.MediaPlayer; 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; public class MainActivity extends Activity { private MediaPlayer player;//只能播放MP4和3gp格式视频 static int currentPosition; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);//SurfaceView标签要先显示在页面才能使用,因此要另外开启一个线程睡一会让布局生成了再去使用SurfaceView对象。 SurfaceView sv = (SurfaceView) findViewById(R.id.sv);//视频播放画面 //拿到surfaceview的控制器 final SurfaceHolder sh = sv.getHolder(); // Thread t = new Thread(){ // @Override // public void run() { // try { // sleep(200); //200毫秒不能写死 // } catch (InterruptedException e) { // e.printStackTrace(); // } // runOnUiThread(new Runnable() { //在主线程去执行 // @Override // public void run() { // MediaPlayer player = new MediaPlayer(); // player.reset(); // try { // player.setDataSource("sdcard/2.3gp"); // player.setDisplay(sh); // player.prepare(); // player.start(); // } catch (Exception e) { // e.printStackTrace(); // } // } // }); // } // }; // t.start(); sh.addCallback(new Callback() { //surfaceView销毁时调用 @Override public void surfaceDestroyed(SurfaceHolder holder) { //每次surfaceview销毁时,同时停止播放视频 if(player != null){ currentPosition = player.getCurrentPosition(); player.stop(); player.release(); player = null; } } //surfaceView创建时调用surfaceView可见时调用 @Override public void surfaceCreated(SurfaceHolder holder) { //每次surfaceView创建时才去播放视频 if(player == null){ player = new MediaPlayer(); player.reset(); try { player.setDataSource("sdcard/2.3gp"); player.setDisplay(sh); player.prepare(); player.start(); player.seekTo(currentPosition); } catch (Exception e) { e.printStackTrace(); } } } //surfaceView结构改变时调用 @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } }); } } /*页面: <SurfaceView android:id="@+id/sv" android:layout_width="match_parent" android:layout_height="match_parent" /> --- #视频播放器 ##SurfaceView * 对画面的实时更新要求较高 * 双缓冲技术:内存中有两个画布,A画布显示至屏幕,B画布在内存中绘制下一帧画面,绘制完毕后B显示至屏幕,A在内存中继续绘制下一帧画面 * 播放视频也是用MediaPlayer,不过跟音频不同,要设置显示在哪个SurfaceView */
vitamio播放视频:
package com.itheima.videoview; import io.vov.vitamio.LibsChecker; import io.vov.vitamio.widget.MediaController; import io.vov.vitamio.widget.VideoView; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //检测是否支持vitamio,没有安装就安装 if (!LibsChecker.checkVitamioLibs(this)) {return;} VideoView vv = (VideoView) findViewById(R.id.vv); vv.setVideoPath("sdcard/4.rmvb"); vv.start(); vv.setMediaController(new MediaController(this));//视频播放控制器 } } /* ###SurfaceView * 双缓冲技术 * 重量级组件(占用资源多) * 只要不可见,就不会创建,可见时,才会创建 * 只要不可见,就会销毁 ### FFMPEG * 开源免费的音视频编解码器,用C语言开发。 ### Vitamio * 封装了FFMPEG的视频播放框架 * 对外提供的api全部都是javaApi*/ /*<io.vov.vitamio.widget.VideoView android:id="@+id/vv" android:layout_width="match_parent" android:layout_height="match_parent" />*/ //清单文件:<activity android:name="io.vov.vitamio.activity.InitActivity"></activity>