Android MediaCodec.createInputSurface()在某些设备上引发IllegalStateException
我正在开发一个视频处理应用程序。该应用程序有一个Android MediaCodec.createInputSurface()在某些设备上引发IllegalStateException,android,opengl-es,video-processing,android-mediacodec,Android,Opengl Es,Video Processing,Android Mediacodec,我正在开发一个视频处理应用程序。该应用程序有一个活动,其中包含一个片段。片段依次包含一个从GLSurfaceView派生的VideoSurfaceView,供我向用户显示具有效果的视频预览(使用OpenGL)。预览后,用户可以开始处理视频 为了处理视频,我主要采用中描述的方法 在大多数设备上,一切都很好,但安卓4.4除外。在这个设备上,每次我尝试使用MediaCodec.createInputSurface()创建Surface,它都会抛出java.lang.IllegalStateExcept
活动
,其中包含一个片段
。片段
依次包含一个从GLSurfaceView
派生的VideoSurfaceView
,供我向用户显示具有效果的视频预览(使用OpenGL)。预览后,用户可以开始处理视频
为了处理视频,我主要采用中描述的方法
在大多数设备上,一切都很好,但安卓4.4除外。在这个设备上,每次我尝试使用MediaCodec.createInputSurface()
创建Surface
,它都会抛出java.lang.IllegalStateException
,代码-38
E/OMXMaster: A component of name 'OMX.qcom.audio.decoder.aac' already exists, ignoring this one.
E/SoftAVCEncoder: internalSetParameter: StoreMetadataInBuffersParams.nPortIndex not zero!
E/OMXNodeInstance: OMX_SetParameter() failed for StoreMetaDataInBuffers: 0x80001001
E/ACodec: [OMX.google.h264.encoder] storeMetaDataInBuffers (output) failed w/ err -2147483648
E/OMXNodeInstance: createInputSurface requires COLOR_FormatSurface (AndroidOpaque) color format
E/ACodec: [OMX.google.h264.encoder] onCreateInputSurface returning error -38
E/VideoProcessing: java.lang.IllegalStateException
at android.media.MediaCodec.createInputSurface(Native Method)
at com.ltpquang.android.core.processing.codec.VideoEncoder.<init>(VideoEncoder.java:46)
at com.ltpquang.android.core.VideoProcessing.setupVideo(VideoProcessing.java:200)
at com.ltpquang.android.core.VideoProcessing.<init>(VideoProcessing.java:167)
at com.ltpquang.android.ui.activity.PreviewEditActivity.lambda$btNext$12(PreviewEditActivity.java:723)
at com.ltpquang.android.ui.activity.PreviewEditActivity.access$lambda$12(PreviewEditActivity.java)
at com.ltpquang.android.ui.activity.PreviewEditActivity$$Lambda$13.run(Unknown Source)
at java.lang.Thread.run(Thread.java:841)
E/OMXMaster:名为“OMX.qcom.audio.decoder.aac”的组件已存在,忽略此组件。
E/SoftAVCEncoder:internalSetParameter:StoreMetadataInBuffersParams.nPortIndex不为零!
E/OMXNodeInstance:OMX_SetParameter()对于StoreMetaDataInBuffers:0x80001001失败
E/ACodec:[OMX.google.h264.encoder]storeMetaDataInBuffers(输出)失败,w/err-2147483648
E/OMXNodeInstance:createInputSurface需要颜色\u FormatSurface(AndroidPaque)颜色格式
E/ACodec:[OMX.google.h264.encoder]onCreateInputSurface返回错误-38
E/VideoProcessing:java.lang.IllegalStateException
位于android.media.MediaCodec.createInputSurface(本机方法)
请访问com.ltpquang.android.core.processing.codec.VideoEncoder.(VideoEncoder.java:46)
位于com.ltpquang.android.core.VideoProcessing.setupVideo(VideoProcessing.java:200)
在com.ltpquang.android.core.VideoProcessing上(VideoProcessing.java:167)
在com.ltpquang.android.ui.activity.PreviewEditActivity.lambda$btNext$12(PreviewEditActivity.java:723)
在com.ltpquang.android.ui.activity.PreviewEditActivity.access$lambda$12(PreviewEditActivity.java)上
位于com.ltpquang.android.ui.activity.PreviewEditActivity$$Lambda$13.run(未知源)
运行(Thread.java:841)
玩了一会儿,我发现:
- 在创建
并将其添加到布局之前,我可以创建VideoSurfaceView
编码器并成功获取输入表面。如果我在创建一个新的MediaCodec
之前释放上一个MediaCodec
,我可以创建任意多个,否则无论我有多少个MediaCodec
,我只能获得一个且只有一个输入面MediaCodec
- 创建
并将其添加到布局后,我不可能从VideoSurfaceView
获取输入图面,它认为MediaCodec
总是这样java.lang.IllegalStateException
- 在创建曲面之前,我已尝试从布局中删除
,将其设置为VideoSurfaceView
,但我运气不佳null