欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android編程視頻播放API之MediaPlayer用法示例

 更新時間:2017年08月23日 10:47:23   作者:遲做總比不做強  
這篇文章主要介紹了Android編程視頻播放API之MediaPlayer用法,結(jié)合實例形式分析了基于Android API實現(xiàn)視頻播放功能的多媒體文件讀取、判斷、事件響應(yīng)及流媒體播放等相關(guān)實現(xiàn)技巧,需要的朋友可以參考下

本文實例講述了Android編程視頻播放API之MediaPlayer用法。分享給大家供大家參考,具體如下:

現(xiàn)在項目要做音視頻這塊功能,這正是我相對比較薄弱的地方,項目中要用到,趕緊抓緊時間學(xué)習(xí)。前面有一編介紹不錯的文章http://www.dbjr.com.cn/article/121881.htm,值得學(xué)習(xí)。

這里給出一個較為簡單的示例:

/**
 * Android API MediaPlayer示例
 *
 * @description:
 * @author ldm
 * @date 2016-4-20 上午10:42:06
 */
public class MediaPlayerActivity extends Activity implements OnClickListener {
  private Button mlocalvideo;
  private Button mstreamvideo;
  private Button mlocalaudio;
  private Button mresourcesaudio;
  private static final String MEDIA = "media";
  private static final int LOCAL_AUDIO = 1;
  private static final int RESOURCES_AUDIO = 3;
  private static final int STREAM_VIDEO = 5;
  @Override
  protected void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.activity_mediaplayer);
    initViewsAndEvents();
  }
  private void initViewsAndEvents() {
    mlocalaudio = (Button) findViewById(R.id.localaudio);
    mresourcesaudio = (Button) findViewById(R.id.resourcesaudio);
    mlocalvideo = (Button) findViewById(R.id.localvideo);
    mstreamvideo = (Button) findViewById(R.id.streamvideo);
    mlocalaudio.setOnClickListener(this);
    mresourcesaudio.setOnClickListener(this);
    mlocalvideo.setOnClickListener(this);
    mstreamvideo.setOnClickListener(this);
  }
  @Override
  public void onClick(View v) {
    switch (v.getId()) {
    case R.id.localaudio:
    case R.id.localvideo:
      Intent intent = new Intent(MediaPlayerActivity.this.getApplication(),
          MediaPlayerDemo_Audio.class);
      intent.putExtra(MEDIA, LOCAL_AUDIO);
      startActivity(intent);
      break;
    case R.id.resourcesaudio:
      Intent resIn = new Intent(MediaPlayerActivity.this.getApplication(),
          MediaPlayerDemo_Audio.class);
      resIn.putExtra(MEDIA, RESOURCES_AUDIO);
      startActivity(resIn);
      break;
    case R.id.streamvideo:
      Intent streamIn = new Intent(MediaPlayerActivity.this,
          MediaPlayerDemo_Video.class);
      streamIn.putExtra(MEDIA, STREAM_VIDEO);
      startActivity(streamIn);
      break;
    }
  }
}

/**
 * OnBufferingUpdateListener可以獲取視頻音頻流的緩沖狀態(tài);
 * OnCompletionListener播放完畢監(jiān)聽器
 * OnPreparedListener準(zhǔn)備播放相關(guān)接口
 * OnVideoSizeChangedListener注冊視頻大小改變監(jiān)聽器
 * SurfaceHolder.Callback:SurfaceView監(jiān)聽callback
 * @description:
 * @author ldm
 * @date 2016-4-20 上午9:46:16
 */
public class MediaPlayer_Video extends Activity implements
    OnBufferingUpdateListener, OnCompletionListener,
    OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback {
  private static final String TAG = "MediaPlayerDemo";
  //Video寬度
  private int mVideoWidth;
  //Video高度
  private int mVideoHeight;
  //播放器MediaPlayer
  private MediaPlayer mMediaPlayer;
  //播放界面SurfaceView
  private SurfaceView mPreview;
  //媒體播放器的載體 SurfaceHolder
  private SurfaceHolder holder;
  //文件路徑
  private String path;
  //Bundle數(shù)據(jù)對象
  private Bundle extras;
  private static final String MEDIA = "media";
  private static final int LOCAL_VIDEO = 1;
  private static final int RESOURCES_AUDIO = 3;
  private static final int STREAM_VIDEO = 5;
  private boolean mIsVideoSizeKnown = false;
  private boolean mIsVideoReadyToBePlayed = false;
  @SuppressWarnings("deprecation")
  @Override
  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.mediaplayer_2);
    mPreview = (SurfaceView) findViewById(R.id.surface);
    holder = mPreview.getHolder();
    holder.addCallback(this);
    //高版本上已經(jīng)不推薦使用了 ,如果要兼容低版本(如Android 2.3或以下版本)要加上這段代碼,不然播放時 只會有聲音 沒有圖像。
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    extras = getIntent().getExtras();
  }
  private void playVideo(Integer Media) {
    doCleanUp();
    try {
      switch (Media) {
        case LOCAL_VIDEO://本地文件(如SD卡)
          /*
           * TODO:將路徑變量設(shè)置為本地媒體文件路徑。
           */
          path = "";//這里要填寫你所播放音視頻的文件路徑
          if (path == "") {
            Toast
                .makeText(
                    MediaPlayer_Video.this,
                    "Please edit MediaPlayerDemo_Video Activity, "
                        + "and set the path variable to your media file path."
                        + " Your media file must be stored on sdcard.",
                    Toast.LENGTH_LONG).show();
          }
          break;
        case STREAM_VIDEO://流文件
          /**
           * 路徑變量設(shè)置為mp4或3gpp格式的URL。應(yīng)該使用Http協(xié)議。
           * 媒體播放器只能通過流的形式獲取數(shù)據(jù),所以需要:
           * 1。必須是媒體流數(shù)據(jù)。
           * 2。必須合理剪輯。
           */
          path = "";
          if (path == "") {
            // Tell the user to provide a media file URL.
            Toast
                .makeText(
                    MediaPlayer_Video.this,
                    "Please edit MediaPlayerDemo_Video Activity,"
                        + " and set the path variable to your media file URL.",
                    Toast.LENGTH_LONG).show();
          }
          break;
        case RESOURCES_AUDIO:
          //播放放在諸如res/raw文件夾下的資源文件
          //直接通過mMediaPlayer = MediaPlayer.create(this, R.raw.test_cbr);
          //可以參考API Demos中AudioFxDemo類文件
          break;
      }
      // 創(chuàng)建MediaPlayer對象,傳入文件數(shù)據(jù)并設(shè)備監(jiān)聽
      mMediaPlayer = new MediaPlayer();
      mMediaPlayer.setDataSource(path);
      mMediaPlayer.setDisplay(holder);
      //使用 create() 方法創(chuàng)建的 MediaPlayer, 直接指定了 媒體資源, 不需要再進行 調(diào)用 prepare() 方法;
      mMediaPlayer.prepare();
      mMediaPlayer.setOnBufferingUpdateListener(this);
      mMediaPlayer.setOnCompletionListener(this);
      mMediaPlayer.setOnPreparedListener(this);
      mMediaPlayer.setOnVideoSizeChangedListener(this);
      //指定音頻流類型
      mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    } catch (Exception e) {
      Log.e(TAG, "error: " + e.getMessage(), e);
    }
  }
  public void onBufferingUpdate(MediaPlayer arg0, int percent) {
    Log.d(TAG, "onBufferingUpdate percent:" + percent);
  }
  public void onCompletion(MediaPlayer arg0) {
    Log.d(TAG, "onCompletion called");
  }
  public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
    Log.v(TAG, "onVideoSizeChanged called");
    if (width == 0 || height == 0) {
      Log.e(TAG, "invalid video width(" + width + ") or height(" + height + ")");
      return;
    }
    mIsVideoSizeKnown = true;
    mVideoWidth = width;
    mVideoHeight = height;
    if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
      startVideoPlayback();
    }
  }
  public void onPrepared(MediaPlayer mediaplayer) {
    Log.d(TAG, "onPrepared called");
    mIsVideoReadyToBePlayed = true;
    if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
      startVideoPlayback();
    }
  }
  public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) {
    Log.d(TAG, "surfaceChanged called");
  }
  public void surfaceDestroyed(SurfaceHolder surfaceholder) {
    Log.d(TAG, "surfaceDestroyed called");
  }
  public void surfaceCreated(SurfaceHolder holder) {
    Log.d(TAG, "surfaceCreated called");
    playVideo(extras.getInt(MEDIA));
  }
  @Override
  protected void onPause() {
    super.onPause();
    releaseMediaPlayer();
    doCleanUp();
  }
  @Override
  protected void onDestroy() {
    super.onDestroy();
    releaseMediaPlayer();
    doCleanUp();
  }
  private void releaseMediaPlayer() {
    if (mMediaPlayer != null) {
      mMediaPlayer.release();
      mMediaPlayer = null;
    }
  }
  private void doCleanUp() {
    mVideoWidth = 0;
    mVideoHeight = 0;
    mIsVideoReadyToBePlayed = false;
    mIsVideoSizeKnown = false;
  }
  private void startVideoPlayback() {
    Log.v(TAG, "startVideoPlayback");
    holder.setFixedSize(mVideoWidth, mVideoHeight);
    mMediaPlayer.start();
  }
}

布局文件activity_mediaplayer

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  >
  <Button android:id="@+id/localvideo"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:text="@string/local_video"
  />
  <Button android:id="@+id/streamvideo"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:text="@string/stream_video"
  />
  <Button android:id="@+id/localaudio"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:text="@string/local_audio"
  />
  <Button android:id="@+id/resourcesaudio"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:text="@string/res_audio"
  />
</LinearLayout>

布局文件activity_mediaplayer_video

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <SurfaceView android:id="@+id/surface"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center">
  </SurfaceView>
</LinearLayout>

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android開發(fā)入門與進階教程》、《Android視圖View技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android數(shù)據(jù)庫操作技巧總結(jié)》、《Android文件操作技巧匯總》、《Android資源操作技巧匯總》及《Android控件用法總結(jié)

希望本文所述對大家Android程序設(shè)計有所幫助。

相關(guān)文章

  • Android activity實現(xiàn)延時跳轉(zhuǎn)功能

    Android activity實現(xiàn)延時跳轉(zhuǎn)功能

    Activity是一個Android的應(yīng)用組件,它提供屏幕進行交互。今天通過本文給大家介紹Android activity實現(xiàn)延時跳轉(zhuǎn)功能,感興趣的朋友一起看看吧
    2021-06-06
  • 新版Android Studio3.6找不到R.java怎么處理

    新版Android Studio3.6找不到R.java怎么處理

    這篇文章主要介紹了新版Android Studio3.6找不到R.java怎么處理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 簡單實現(xiàn)Android繪圖板

    簡單實現(xiàn)Android繪圖板

    這篇文章主要教大家如何簡單實現(xiàn)Android繪圖板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android APP集成新浪微博分享功能

    Android APP集成新浪微博分享功能

    這篇文章主要為大家詳細(xì)介紹了Android APP集成新浪微博分享功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Android 從底部彈出Dialog(橫向滿屏)的實例代碼

    Android 從底部彈出Dialog(橫向滿屏)的實例代碼

    在android開發(fā)中經(jīng)常會遇到底部彈出框的功能,今天小編抽時間給大家整理一個底部彈出橫向滿屏的dialog,需要的朋友參考下
    2016-11-11
  • android音頻編輯之音頻裁剪的示例代碼

    android音頻編輯之音頻裁剪的示例代碼

    本篇文章主要介紹了android音頻編輯之音頻裁剪的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Android WebView實現(xiàn)長按保存圖片及長按識別二維碼功能

    Android WebView實現(xiàn)長按保存圖片及長按識別二維碼功能

    本文要使用Android WebView實現(xiàn)長按保存圖片及長按識別二維碼功能,當(dāng)用戶在瀏覽網(wǎng)頁的時候,長按某一區(qū)域,識別如果是圖片,則彈出彈框,出現(xiàn)保存圖片的功能
    2018-01-01
  • 詳解Android activity與fragment之間的通信交互

    詳解Android activity與fragment之間的通信交互

    本篇文章主要介紹了詳解Android activity與fragment之間的通信交互,具有一定的參考價值,有興趣的可以了解一下
    2017-08-08
  • Android圖片緩存之Lru算法(二)

    Android圖片緩存之Lru算法(二)

    LRU緩存簡單的說就是緩存一定量的數(shù)據(jù),當(dāng)超過設(shè)定的閾值時就把一些過期的數(shù)據(jù)刪除掉,這篇文章主要介紹了Android圖片緩存Lru算法,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Android Studio導(dǎo)入第三方類庫的方法

    Android Studio導(dǎo)入第三方類庫的方法

    這篇文章主要介紹了Android Studio導(dǎo)入第三方類庫的方法,導(dǎo)入*.jar包、導(dǎo)入第三方j(luò)ava類庫含源碼包以及aar的引入,需要的朋友可以參考下
    2016-07-07

最新評論