2017-02-05 15 views
1

У меня есть MediaMuxer:MediaCodec.createInputSurface() бросает IllegalStateException в Android эмулятор (Error -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 

говорит мой Surface должен быть в COLOR_FormatSurface, но я уже установили его

mMediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, CodecCapabilities.COLOR_FormatSurface); 

Что случилось? Как решить эту проблему? Помогите.

+0

Он выглядит Очень хорошо для меня. Попробуйте возиться с битрейтом (большой диапазон высоких и низких значений) и посмотрите, устраняет ли это ошибку. – nyttimangus

+0

@nyttimangus, какая версия Android вы протестировали? Это странно, но ничего не происходит, когда я изменяю значение битрейта. Тем не менее я пытался изменить * KEY_FRAME_RATE * (fps) и * KEY_I_FRAME_INTERVAL *. Это не помогает. –

+0

Я не тестировал ваш код, но я тестировал некоторые из своих собственных работ с MediaCodec по API 19 и 23, я считаю, но совместим с 18. Я просто подумал, что вспомнил, что столкнулся с подобной проблемой, когда у меня был неправильный битрейт , – nyttimangus

ответ

0

У меня была та же проблема.
Я думаю, что это не сработает на эмуляторах: https://github.com/google/grafika/issues/2. В AVD я установил 'Emulated performance' в 'Hardware', но это не решило проблему. Вам следует попробовать на реальном устройстве. EDIT: ну, похоже, работает на эмуляторах с API> = 23 (хотя ваш код должен работать с API 18), но вам, вероятно, придется менять каталог во время тестов, из-за: https://developer.android.com/training/permissions/requesting.html