1. 程式人生 > >SurfaceView和Mediaplayer實現播放網路和本地視訊 一

SurfaceView和Mediaplayer實現播放網路和本地視訊 一

程式碼是最好的老師!!直接上程式碼

package com.example.yaoan.surfaceviewtest;

import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import
android.view.View; import java.io.File; import java.io.IOException; /* * *1.VideoView本身就是對SurfaceView和MediaPlayer做了一個封裝 *2.實現視訊列表播放 * * 如果讀取本地檔案,和網路的話 需要新增許可權 * * */ public class MainActivity extends AppCompatActivity { private MediaPlayer mediaPlayer; private
SurfaceView surfaceView; //讀取本地檔案 private File file=new File("/storage/sdcard1/音樂/", "曾經的你.mp4"); //訪問網路視訊 private String uri="http://112.253.22.157/17/z/z/y/u/zzyuasjwufnqerzvyxgkuigrkcatxr/hc.yinyuetai.com /D046015255134077DDB3ACA0D7E68D45.flv"; @Override protected void onCreate(Bundle savedInstanceState) { super
.onCreate(savedInstanceState); setContentView(R.layout.activity_main); surfaceView = (SurfaceView) findViewById(R.id.surfaceView); mediaPlayer = new MediaPlayer(); //獲取SurfaceHolder 可以通過該介面來操作SurfaceView中的Surface SurfaceHolder surfaceHolder = surfaceView.getHolder(); //設定Meiaplayer的準備監聽 mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { //準備完成後播放 mediaPlayer.start(); } }); surfaceHolder.addCallback(new SurfaceHolder.Callback() { //當SurfaceView中Surface建立時回掉 //該方法表示Surface已經建立完成,可以在該方法中進行繪圖操作 @Override public void surfaceCreated(SurfaceHolder holder) { mediaPlayer.reset(); try { //設定視屏檔案影象的顯示引數 mediaPlayer.setDisplay(holder); //file.getAbsolutePath()本地視訊 //uri 網路視訊 mediaPlayer.setDataSource(MainActivity.this, Uri.parse(uri)); //prepare();表示準備工作同步進行,(準備工作在UI執行緒中進行) //當播放網路視訊時,如果網路不要 會報ARN 所以不採用該方法 //mediaPlayer.prepare(); //非同步準備 準備工作在子執行緒中進行 當播放網路視訊時候一般採用此方法 mediaPlayer.prepareAsync(); } catch (IOException e) { e.printStackTrace(); } } //當SurfaceView的大小發生改變時候觸發該方法 @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } //Surface銷燬時回掉 //當Surface銷燬時候,同時把MediaPlayer也銷燬 @Override public void surfaceDestroyed(SurfaceHolder holder) { if (mediaPlayer!=null) { mediaPlayer.stop(); //釋放資源 mediaPlayer.release(); } } }); //設定 surfaceView點選監聽 surfaceView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (mediaPlayer.isPlaying()) { mediaPlayer.pause(); } else { mediaPlayer.start(); } break; } //返回True代表事件已經處理了 return true; } }); } }

xml佈局檔案:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.yaoan.surfaceviewtest.MainActivity">

    <!--第一步 在佈局檔案中新增SurfaceView控制元件-->
    <SurfaceView
        android:layout_centerInParent="true"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:id="@+id/surfaceView" />
</RelativeLayout>

涉及到播放視訊更多內容:
新增自定義控制欄:點選檢視

新增緩衝資訊:點選檢視