MediaCodec.createInputSurface()在某些设备

时间:2017-03-24 15:47:12

标签: android opengl-es video-processing mediacodec

我正在开发视频处理应用。该应用有一个Activity,其中包含FragmentFragment依次包含VideoSurfaceViewGLSurfaceView派生的Surface,以便向用户展示有效(使用OpenGL)视频的预览。预览后,用户可以开始处理视频。

要处理视频,我主要应用here中描述的方法。

在大多数设备上一切正常,但Oppo Mirror 3(Android 4.4)。在此设备上,每当我尝试使用MediaCodec.createInputSurface()创建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)

VideoSurfaceView

玩了一下,我观察到了:

  • 在创建MediaCodec并将其添加到布局之前,我可以创建MediaCodec编码器并成功获取输入表面。如果我在创建一个新版本之前发布之前的MediaCodec,我可以创建任意多个,否则我只能获得一个且只有一个输入表面,无论我有多少VideoSurfaceView
  • 创建MediaCodec并将其添加到布局后,我无法从java.lang.IllegalStateException获取输入图面,它始终显示VideoSurfaceView
  • 我尝试从布局中移除null,在创建曲面之前将其设置为__init__,但对我来说没有运气。

我也尝试了herehere的建议,但他们没有帮助。 从this开始,我的设备似乎只能获得软件编解码器。所以我不能创建输入表面。

我的问题是:

  1. 为什么?
  2. 如果设备的资源有限,我该怎么做(例如发布一些内容)来继续这个过程?
  3. 如果它与软件编解码器有关,我该怎么办?如何检测和释放资源?
  4. 这与GL上下文有关吗?如果是,我该怎么办?我应该管理自己的情境吗?

0 个答案:

没有答案