I want to use MediaCodec to encode a Surface into H.264.
With API 18, there is a way to encode content from a surface by calling createInputSurface() and then drawing on that surface.
I get IllegalStateException on createInputSurface(). Here's additional logcat output:
D/H264Encoder(17570): MediaFormat: {frame-rate=25, bitrate=1000000, height=600, mime=video/avc, color-format=19, i-frame-interval=75, width=800}
D/NvOsDebugPrintf( 125): NvMMLiteOpen : Block : BlockType = 4
D/NvOsDebugPrintf( 125): NvRmPowerModuleClockControl on MOD[29] INST[0]
D/NvOsDebugPrintf( 125): NvRmModuleResetWithHold deassert MOD[29] INST[0]
D/NvOsDebugPrintf( 125): NvMMLiteBlockCreate : Block : BlockType = 4
I/ACodec (17570): setupVideoEncoder succeeded
E/OMXNodeInstance( 125): OMX_EnableAndroidNativeBuffers failed with error -2147479547 (0x80001005)
E/OMXNodeInstance( 125): createInputSurface requires AndroidOpaque color format
E/ACodec (17570): [OMX.Nvidia.h264.encoder] onCreateInputSurface returning error -38
W/MediaCodec(17570): createInputSurface failed, err=-38
Any insight on how the new API works would be helpful.
The important error message is this:
createInputSurface requires AndroidOpaque color format
For Surface input, you must set the color format to COLOR_FormatSurface
(also known as AndroidOpaque.)
See examples here, notably EncodeAndMuxTest.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With