2017-02-05 50 views
1

에서 IllegalStateException이 예외 :MediaCodec.createInputSurface는() 나는 <code>MediaMuxer</code>이 안드로이드 에뮬레이터 (오류 -38)

MediaMuxer mMediaMuxer = new MediaMuxer(new File(Environment.getExternalStorageDirectory(), "video.mp4").getPath(), MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4); 

그리고 코드, 기록 비디오 :

MediaFormat mMediaFormat = MediaFormat.createVideoFormat("video/avc", width, height); 
mMediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, CodecCapabilities.COLOR_FormatSurface); 
mMediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 128000); 
mMediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, fps); 
mMediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 10); 
MediaCodec mMediaCodec = MediaCodec.createEncoderByType("video/avc"); 
mMediaCodec.configure(mMediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); 
Surface mSurface = mMediaCodec.createInputSurface(); 
... 

마지막 문자열 mMediaCodec.createInputSurface()이 나에게 java.lang.IllegalStateException를 던졌습니다 . 스택 추적 : 에뮬레이터의

java.lang.IllegalStateException 
    at android.media.MediaCodec.createInputSurface(Native Method) 
    at com.mypackage.Cam$Recorder$VideoRecorder.run(Cam.java:307) 

그리고 로그 :이 문자열을 관찰

02-05 07:42:55.024: I/OMXClient(2643): Using client-side OMX mux. 
02-05 07:42:55.024: I/SoftAVCEncoder(2643): Construct SoftAVCEncoder 
02-05 07:42:55.024: E/SoftAVCEncoder(2643): internalSetParameter: StoreMetadataInBuffersParams.nPortIndex not zero! 
02-05 07:42:55.024: E/OMXNodeInstance(2643): OMX_SetParameter() failed for StoreMetaDataInBuffers: 0x80001001 
02-05 07:42:55.024: E/ACodec(2643): [OMX.google.h264.encoder] storeMetaDataInBuffers (output) failed w/ err -2147483648 
02-05 07:42:55.024: I/ACodec(2643): setupVideoEncoder succeeded 
02-05 07:42:55.024: E/OMXNodeInstance(2643): createInputSurface requires COLOR_FormatSurface (AndroidOpaque) color format 
02-05 07:42:55.024: E/ACodec(2643): [OMX.google.h264.encoder] onCreateInputSurface returning error -38 
02-05 07:42:55.024: W/MediaCodec(2643): createInputSurface failed, err=-38 
02-05 07:42:55.024: E/TAG(2643): java.lang.IllegalStateException 
02-05 07:42:55.224: I/OMXClient(2643): Using client-side OMX mux. 
02-05 07:42:55.254: W/SoftAACEncoder2(2643): Requested bitrate 128000 unsupported, using 48000 

E/OMXNodeInstance(2643): createInputSurface requires COLOR_FormatSurface (AndroidOpaque) color format 

SurfaceCOLOR_FormatSurface에 있어야합니다 말한다, 그러나 나는 이미 그것을

을 설정 한
mMediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, CodecCapabilities.COLOR_FormatSurface); 

뭐가 잘못 됐니? 이 문제를 해결하는 방법? 도움.

+0

나에게 꽤 좋다. bitrate (높은 값과 낮은 값의 넓은 범위)를 어지럽히고 오류가 해결되는지 확인하십시오. – nyttimangus

+0

@nyttimangus, 어떤 Android 버전을 테스트 했습니까? 이상하지만, 비트율 값을 변경할 때 아무런 변화가 없습니다. 여전히 * KEY_FRAME_RATE * (fps)와 * KEY_I_FRAME_INTERVAL *을 변경하려고했습니다. 도움이되지 않습니다. –

+0

코드를 테스트하지는 않았지만 API 19 및 23의 MediaCodec을 사용한 내 자신의 작업 중 일부를 테스트했습니다.하지만 믿을 만하지만 18과 호환됩니다. 내 비트 전송률을 잘못했을 때 유사한 문제가 발생했다고 생각했습니다. . – nyttimangus

답변

0

같은 문제가있었습니다.
에뮬레이터에서 작동하지 않는다고 생각합니다 : https://github.com/google/grafika/issues/2. AVD에서 '에뮬레이트 된 성능'을 '하드웨어'로 설정했지만 문제가 해결되지 않았습니다. 실제 장치를 사용해보십시오. EDIT : 글쎄, API가 23 이상인 에뮬레이터에서 작동하는 것으로 보입니다 (코드가 API 18로 실행되어야 함에도 불구하고). 그러나 다음과 같은 이유로 테스트 중에 디렉토리를 변경해야합니다. https://developer.android.com/training/permissions/requesting.html