何时调用MediaCodec:getOutputFormat()?
作者:互联网
对于音频编解码器,调用MediaCodec :: getOutputFormat()会在一台设备(而不是另一台设备)上引发IllegalStateException.
Android文档说,如果编解码器不在“已配置”或“正在执行”状态,则会引发此类异常:
http://developer.android.com/reference/android/media/MediaCodec.html
在两个设备上,对getOutputFormat的调用都是在配置编解码器之后进行的.中间也有一些调用来启动编解码器,并检索其输入和输出缓冲区.
对getOutputFormat的调用是否需要在configure()调用之后立即进行?文档建议对configure()的调用将编解码器置于已配置状态,而对start()的调用将其置于执行状态.因此,可以将调用放在start()之后.
但实际上,对文档中的样板代码进行了更改,表明如果在start()之后立即调用getOutputFormat(),则会得到IllegalStateException:
因此,除了编解码器状态之外,还有其他事情在触发是否引发此异常.
解决方法:
您只有在从MediaCodec :: dequeueOutputBuffer返回了MediaCodec.INFO_OUTPUT_FORMAT_CHANGED后,才能调用MediaCodec :: getOutputFormat.处于执行状态还不够,内部编解码器还需要产生输出MediaFormat对象.
该示例在MediaCodec API公开之后的不久(即https://android-review.googlesource.com/39100年)得到了进一步修复,但是您说对了,该方法本身的文档仍然需要修复.
编辑:实际上,MediaCodec :: getOutputFormat文档中的子句说可以在https://android.googlesource.com/platform/frameworks/base/+/d4023114e8cf7ec7db4d07958a303699b658f2c0%5E%21/(已成为5.0版本的一部分)中添加configure之后直接调用它.因此,从5.0开始,您可能可以成功完成此操作,但在较早的版本上则无法成功.
标签:native-code,mediacodec,exception,android 来源: https://codeday.me/bug/20191120/2046179.html