動画を再生する方法 MediaPlayer

動画を再生するにはMediaPlayerとVideoViewを使用する方法があります。
MediaPlayerのほうが詳細な指定ができ、VideoViewのほうが容易に使用できます。

[参考記事] MediaPlayer のメソッド一覧
[参考記事] 動画を再生する方法 VideoView
[参考記事] 2.0/2.1以前で再生できる動画が2.2以降で再生できない
[参考記事] アプリからネットワーク通信を行う場合

動画ファイルは組み込みの動画であれば/res/rawフォルダ以下に置くようにします。

[参考記事] SDやdata、downloadなど各種ディレクトリパスの取得方法

MediaPlayerではlayoutにSurfaceViewを使用しますが、SurfaceViewを使用するにはSurfaceHolder.Callbackを使用する必要があります。

音声は再生できているが、映像が表示されないときはholderの渡し方が間違っています。

SurfaceHolder.Callbackを使うサンプルコード
setContentViewを使うサンプルコード
setContentViewを使いsurfaceCreated以外で表示するサンプルコード

またMediaPlayerを再生すると、アプリを閉じた後もバックグラウンドで再生されたままになるので、閉じるときにはMediaPlayerを破棄することを忘れないようにします。

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
  if(mp != null){
    mp.release();
    mp = null;
  }
}
public boolean onDestroy(MediaPlayer mp, int what, int extra) {
  if(mp != null){
    mp.release();
    mp = null;
  }
  return false;
}

SurfaceHolder.Callbackを使うサンプルコード

TestApp.java

package com.example.test;

import java.io.IOException;
import android.app.Activity;
import android.graphics.PixelFormat;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class TestApp extends Activity implements SurfaceHolder.Callback{
  private static final String TAG = "VideoPlayer";

  private SurfaceHolder holder;
  
  private SurfaceView mPreview;

  private MediaPlayer mp = null;
  
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    getWindow().setFormat(PixelFormat.TRANSPARENT);
    mPreview = (SurfaceView) findViewById(R.id.surface);
    holder = mPreview.getHolder();
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    holder.addCallback(this);
  }

  public boolean onDestroy(MediaPlayer mp, int what, int extra) {
    if(mp != null){
      mp.release();
      mp = null;
    }
    return false;
  }

  @Override
  public void surfaceCreated(SurfaceHolder paramSurfaceHolder) {
    String mediaPath = "/sdcard/test.3gp";
    try {
      mp = new MediaPlayer();
      mp.setDataSource(mediaPath);
      mp.setDisplay(paramSurfaceHolder);
      mp.prepare();
      mp.start();
    } catch (IllegalArgumentException e) {
      // TODO 自動生成された catch ブロック
      e.printStackTrace();
    } catch (IllegalStateException e) {
      // TODO 自動生成された catch ブロック
      e.printStackTrace();
    } catch (IOException e) {
      // TODO 自動生成された catch ブロック
      e.printStackTrace();
    }
  }

  @Override
  public void surfaceChanged(SurfaceHolder paramSurfaceHolder, int paramInt1,
    int paramInt2, int paramInt3) {
  }

  @Override
  public void surfaceDestroyed(SurfaceHolder paramSurfaceHolder) {
    if(mp != null){
      mp.release();
      mp = null;
    }
  }
}

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"
  >

  <SurfaceView android:id="@+id/surfaceView1" android:layout_width="wrap_content" android:layout_height="wrap_content"></SurfaceView>

</LinearLayout>

setContentViewを使うサンプルコード

この場合layoutはなんでもいいです。
別メソッドでholderを受けるにはgetHolder()を使用します。

TestApp.java

package com.example.test;

import java.io.IOException;

import android.app.Activity;
import android.content.Context;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class TestApp extends Activity{
  private static final String TAG = "VideoPlayer";

  private MediaPlayer mp = null;

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    setContentView(new SurfaceTestView(this));
  }

  class SurfaceTestView extends SurfaceView 
  implements SurfaceHolder.Callback {

    public SurfaceTestView(Context context) {
      super(context);

      SurfaceHolder holder = getHolder();
      holder.addCallback(this);
      holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
      // TODO 自動生成されたメソッド・スタブ
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
      try {
        mp = new MediaPlayer();
        mp.setDataSource(mediaPath);
        mp.setDisplay(holder);
        mp.prepare();
        mp.start();
      } catch (IllegalArgumentException e) {
        // TODO 自動生成された catch ブロック
        e.printStackTrace();
      } catch (IllegalStateException e) {
        // TODO 自動生成された catch ブロック
        e.printStackTrace();
      } catch (IOException e) {
        // TODO 自動生成された catch ブロック
        e.printStackTrace();
      }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
      if(mp != null){
        mp.release();
        mp = null;
      }
    };
  }
}

setContentViewを使いsurfaceCreated以外で表示するサンプルコード

この場合layoutはなんでもいいです。
別メソッドでholderを受けるにはgetHolder()を使用します。

TestApp.java

package com.example.test;

import java.io.IOException;

import android.app.Activity;
import android.content.Context;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class TestApp extends Activity{
  private static final String TAG = "VideoPlayer";

  private MediaPlayer mp = null;

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    setContentView(new SurfaceTestView(this));
  }

  class SurfaceTestView extends SurfaceView 
  implements SurfaceHolder.Callback {

    public SurfaceTestView(Context context) {
      super(context);

      SurfaceHolder holder = getHolder();
      holder.addCallback(this);
      holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
      // TODO 自動生成されたメソッド・スタブ
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
      playMedia();
    }

    public void playMedia() {
      try {
        mp = new MediaPlayer();
        mp.setDataSource(mediaPath);
        mp.setDisplay(getHolder());
        mp.prepare();
        mp.start();
      } catch (IllegalArgumentException e) {
        // TODO 自動生成された catch ブロック
        e.printStackTrace();
      } catch (IllegalStateException e) {
        // TODO 自動生成された catch ブロック
        e.printStackTrace();
      } catch (IOException e) {
        // TODO 自動生成された catch ブロック
        e.printStackTrace();
      }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
      if(mp != null){
        mp.release();
        mp = null;
      }
    };
  }
}

関連記事

スポンサーリンク

em単位で指定した値が文字サイズ変更後に正しく反映されない

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る