2014-12-19 2 views
1

mediaMetadataRetriever.setDataSource를 사용하여 비디오 프레임을 잡는 pp 작업을하고 있습니다. 그러나 비디오 경로를 설정하면 잘못된 인수 예외가 발생하고 충돌이 발생합니다. 나는 자바와 안드로이드에서 새로운 사람이다. 나는 인터넷에서 많은 것을 찾았지만 지금까지는 운이 없다. 여기mediaMetadataRetriever.setDataSource가 잘못된 인수 예외를 throw합니다.

import android.graphics.Bitmap; 
import android.media.MediaMetadataRetriever; 
import android.media.MediaPlayer; 
import android.net.Uri; 
import android.os.Bundle; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup.LayoutParams; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.MediaController; 
import android.widget.Toast; 
import android.widget.VideoView; 

public class MainActivity extends Activity { 

    MediaMetadataRetriever mediaMetadataRetriever; 
    MediaController myMediaController; 
    VideoView myVideoView; 
    String viewSource = "/storage/sdcard0/DCIM/100MEDIA/VIDEO0009.mp4"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mediaMetadataRetriever = new MediaMetadataRetriever(); 
     mediaMetadataRetriever.setDataSource(viewSource); 
     Log.v("MA", " set datasource"); 
     myVideoView = (VideoView) findViewById(R.id.videoview); 
     myVideoView.setVideoURI(Uri.parse(viewSource)); 
     myMediaController = new MediaController(this); 
     myVideoView.setMediaController(myMediaController); 

     myVideoView.setOnCompletionListener(myVideoViewCompletionListener); 
     myVideoView.setOnPreparedListener(MyVideoViewPreparedListener); 
     myVideoView.setOnErrorListener(myVideoViewErrorListener); 

     myVideoView.requestFocus(); 
     myVideoView.start(); 

     Button buttonCapture = (Button) findViewById(R.id.capture); 
     buttonCapture.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 

       int currentPosition = myVideoView.getCurrentPosition(); // in 
       // millisecond 
       Toast.makeText(MainActivity.this, 
         "Current Position: " + currentPosition + " (ms)", 
         Toast.LENGTH_LONG).show(); 

       Bitmap bmFrame = mediaMetadataRetriever 
         .getFrameAtTime(currentPosition * 1000); // unit in 
       // microsecond 

       if (bmFrame == null) { 
        Toast.makeText(MainActivity.this, "bmFrame == null!", 
          Toast.LENGTH_LONG).show(); 
       } else { 
        AlertDialog.Builder myCaptureDialog = new AlertDialog.Builder(
          MainActivity.this); 
        ImageView capturedImageView = new ImageView(
          MainActivity.this); 
        capturedImageView.setImageBitmap(bmFrame); 
        LayoutParams capturedImageViewLayoutParams = new LayoutParams(
          LayoutParams.WRAP_CONTENT, 
          LayoutParams.WRAP_CONTENT); 
        capturedImageView 
          .setLayoutParams(capturedImageViewLayoutParams); 

        myCaptureDialog.setView(capturedImageView); 
        myCaptureDialog.show(); 
       } 

      } 
     }); 
    } 

    MediaPlayer.OnCompletionListener myVideoViewCompletionListener = new MediaPlayer.OnCompletionListener() { 

     @Override 
     public void onCompletion(MediaPlayer arg0) { 
      Toast.makeText(MainActivity.this, "End of Video", Toast.LENGTH_LONG) 
        .show(); 
     } 
    }; 

    MediaPlayer.OnPreparedListener MyVideoViewPreparedListener = new MediaPlayer.OnPreparedListener() { 

     @Override 
     public void onPrepared(MediaPlayer mp) { 

      long duration = myVideoView.getDuration(); // in millisecond 
      Toast.makeText(MainActivity.this, 
        "Duration: " + duration + " (ms)", Toast.LENGTH_LONG) 
        .show(); 

     } 
    }; 

    MediaPlayer.OnErrorListener myVideoViewErrorListener = new MediaPlayer.OnErrorListener() { 

     @Override 
     public boolean onError(MediaPlayer mp, int what, int extra) { 

      Toast.makeText(MainActivity.this, "Error!!!", Toast.LENGTH_LONG) 
        .show(); 
      return true; 
     } 
    }; 

} 

스택 추적한다 : 여기 내 전체 코드는

E/AndroidRuntime(3411): FATAL EXCEPTION: main 
E/AndroidRuntime(3411): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.captureframe/com.example.captureframe.MainActivity}: java.lang.IllegalArgumentException 
E/AndroidRuntime(3411): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 
E/AndroidRuntime(3411): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
E/AndroidRuntime(3411): at android.app.ActivityThread.access$600(ActivityThread.java:141) 
E/AndroidRuntime(3411): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
E/AndroidRuntime(3411): at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime(3411): at android.os.Looper.loop(Looper.java:137) 
E/AndroidRuntime(3411): at android.app.ActivityThread.main(ActivityThread.java:5103) 
E/AndroidRuntime(3411): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(3411): at java.lang.reflect.Method.invoke(Method.java:525) 
E/AndroidRuntime(3411): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
E/AndroidRuntime(3411): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
E/AndroidRuntime(3411): at dalvik.system.NativeStart.main(Native Method) 
E/AndroidRuntime(3411): Caused by: java.lang.IllegalArgumentException 
E/AndroidRuntime(3411): at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:68) 
E/AndroidRuntime(3411): at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:155) 
E/AndroidRuntime(3411): at com.example.captureframe.MainActivity.onCreate(MainActivity.java:46) 
E/AndroidRuntime(3411): at android.app.Activity.performCreate(Activity.java:5133) 
E/AndroidRuntime(3411): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
E/AndroidRuntime(3411): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 
+0

stacktrace에 따르면 NullPointerException은 IllegalArgument가 아닙니다. MainActivity의 47 번째 줄에 무엇이 있는지 확인하십시오. – birdy

+0

@birdy : 죄송합니다. 코드와 스택 추적을 업데이트 한 실수였습니다. –

답변

0

대신이보십시오, 나는 그것을 원시 파일 작업을 갈 수있는이 문제와 소요 시간이 있었다.

Resources res = getResources(); 
AssetFileDescriptor afd = res.openRawResourceFd(R.raw.rawResourceId); 
MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever(); 
metaRetriever.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); 
관련 문제