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
    ,但我运气不佳
我也尝试了来自或的建议,但没有帮助。 从,似乎我的设备只能得到软件编解码器。因此,我无法创建输入曲面

我的问题是:

  • 为什么会这样
  • 如果设备的资源有限,我可以做些什么(例如发布一些东西)来继续这个过程
  • 如果它与软件编解码器相关,我应该怎么做?如何检测和释放资源
  • 这与GL上下文有关吗?如果是,我该怎么办?我应该自己管理环境吗