其他分享
首页 > 其他分享> > 何时调用MediaCodec:getOutputFormat()?

何时调用MediaCodec:getOutputFormat()?

作者:互联网

对于音频编解码器,调用MediaCodec :: getOutputFormat()会在一台设备(而不是另一台设备)上引发IllegalStateException.

Android文档说,如果编解码器不在“已配置”或“正在执行”状态,则会引发此类异常:

http://developer.android.com/reference/android/media/MediaCodec.html

在两个设备上,对getOutputFormat的调用都是在配置编解码器之后进行的.中间也有一些调用来启动编解码器,并检索其输入和输出缓冲区.

对getOutputFormat的调用是否需要在configure()调用之后立即进行?文档建议对configure()的调用将编解码器置于已配置状态,而对start()的调用将其置于执行状态.因此,可以将调用放在start()之后.

但实际上,对文档中的样板代码进行了更改,表明如果在start()之后立即调用getOutputFormat(),则会得到IllegalStateException:

https://code.google.com/p/android-source-browsing/source/diff?spec=svn.platform–frameworks–base.e55d5e864b133df8ccf9f92ca4a5d3accb1dab5c&repo=platform–frameworks–base&name=jb-mr1-dev&r=b529e4c9ca8a6790162275ac2e481f768a6d585f&format=side&path=/media/java/android/media/MediaCodec.java&old_path=/media/java/android/media/MediaCodec.java&old=2ac3f2e285159300c62c797bb2123604773ccac7

因此,除了编解码器状态之外,还有其他事情在触发是否引发此异常.

解决方法:

您只有在从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