我正在开发视频处理应用。该应用有一个Activity
,其中包含Fragment
。 Fragment
依次包含VideoSurfaceView
从GLSurfaceView
派生的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__
,但对我来说没有运气。我也尝试了here或here的建议,但他们没有帮助。 从this开始,我的设备似乎只能获得软件编解码器。所以我不能创建输入表面。
我的问题是: