2013년 7월 15일 월요일

[Android] VideoView를 이용한 비디오 재생

Tip!:웬만하면 VideoView는 그때 그때 자바 코드로 생성해서 추가 후 사용 하는게 좋다.이유는 화면 전환시 여러 UI가 있을때 화면에 제일 먼저 그려져서 보기에 좋지 않을 때가 있다. 

1. 비디오 재생 주요 순서

1.1 VideoView 클래스 객체를 참조
- VideoView videoView = (VideoView) findViewById(R.id.VideoView);

1.1 비디오 파일 위치 설정
- 예제에서 확인

1.2 비디오 재생 시작
- videoView.start();

2. 비디오 재생중지 주요 순서 

2.1 비디오 일시중지
- videoView.pause();

2.2 비디오 중지
- videoView.stopPlayback();

3. 예제 
android version = jelly bean
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.MediaController;
import android.widget.Toast;
import android.widget.VideoView;

public class MyVideoPlayerActivity extends Activity {
 public final static String VIDEO_URL = "http://sites.google.com/site/ubiaccessmobile/sample_video.mp4";
 public final static int URL = 1;
 public final static int SDCARD = 2;
 VideoView videoView;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  // 영상을 출력하기 위한 비디오뷰
  // SurfaceView 를 상속받아 만든클래스이다
  // 웬만하면 VideoView는 그때 그때 생성해서 추가 후 사용
  // 화면 전환시 여러 UI가 있을때 화면에 제일 먼저 그려져서 보기에 좋지 않을 때가 있다.
  // 예제에서 xml 에 추가해서 해보았다.
  videoView = (VideoView) findViewById(R.id.VideoView);

  Button button1 = (Button) findViewById(R.id.button1);
  Button button2 = (Button) findViewById(R.id.button2);
  videoView = (VideoView) findViewById(R.id.VideoView);
  
  int type = URL;
  switch (type) {
  case URL:
   // 동영상의 경로가 웹에 있다면 아래와 같이 설정
   videoView.setVideoURI(Uri.parse(VIDEO_URL));
   break;

  case SDCARD:
   // 동영상의 경로가 SD Card 에 있다면 아래와 같이 설정
   String path = Environment.getExternalStorageDirectory()
     + "/TestVidio6.mp4";
   videoView.setVideoPath(path);
   break;

  }

  // 미디어컨트롤러 추가하는부분
  MediaController controller = new MediaController(this);
  videoView.setMediaController(controller);

  // 준비하는 과정을 미리함
  videoView.requestFocus();

  // 동영상이 재생준비가 완료되엇을떄를 알수있는 리스너 (실제 웹에서 영상을 다운받아 출력할때 많이 사용됨)
  videoView.setOnPreparedListener(new OnPreparedListener() {

   // 동영상 재생준비가 완료된후 호출되는 메서드
   @Override
   public void onPrepared(MediaPlayer mp) {
    // TODO Auto-generated method stub
    Toast.makeText(getApplicationContext(),
      "동영상이 준비되었습니다.\n'재생' 버튼을 누르세요.", Toast.LENGTH_LONG)
      .show();
   }
  });

  // 동영상 재생이 완료된걸 알수있는 리스너
  videoView.setOnCompletionListener(new OnCompletionListener() {

   // 동영상 재생이 완료된후 호출되는 메서드
   public void onCompletion(MediaPlayer player) {
    Toast.makeText(getApplicationContext(), "동영상 재생이 완료되었습니다.",
      Toast.LENGTH_LONG).show();
   }
  });

  button1.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    playVideo();
   }
  });

  button2.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    stopVideo();
   }
  });
 }

 private void playVideo() {
  // 비디오를 처음부터 재생할땐 0
  videoView.seekTo(0);
  // 비디오 재생 시작
  videoView.start();
 }

 private void stopVideo() {

  // 비디오 재생 잠시멈춤
  videoView.pause();

  // 비디오 재생 완전 멈춤
  videoView.stopPlayback();
  
  // 예제에선 videoView=null를 해서 단말기에 테스트시 한번밖에 동영상을 재생못합니다.
  //videoView = null;
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.my_video_player, menu);
  return true;
 }

}

댓글 3개:

  1. 그대로했는데 재생할 수 없는 동영상입니다 라고 뜨네요.. 해결책이 없을까요?

    답글삭제
  2. 작성자가 댓글을 삭제했습니다.

    답글삭제
  3. 안녕하세요. 혹시 mp4형식 말고 url이나 IP address를 써서 파이카메라로 실행할수있나요

    답글삭제