什么时候调用 MediaCodec:getOutputFormat()?

When to call MediaCodec:getOutputFormat()?

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

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

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

在这两个设备上,对 getOutputFormat 的调用是在编解码器配置之后。还有启动编解码器和检索其输入和输出缓冲区的干预调用。

是否需要在 configure() 调用之后立即调用 getOutputFormat?文档建议调用 configure() 将编解码器置于 Configured 状态,调用 start() 将其置于 Executing 状态。所以把电话放在 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 完成 public 后不久,该示例在 https://android-review.googlesource.com/39100 中得到了进一步修复,但你是对的,该方法本身的文档也仍然需要修复。

编辑:实际上,MediaCodec::getOutputFormat 的文档中的子句说您可以在 configure 之后直接调用它已添加到 https://android.googlesource.com/platform/frameworks/base/+/d4023114e8cf7ec7db4d07958a303699b658f2c0%5E%21/(成为 5.0 版本的一部分) .因此,从 5.0 开始,您可能可以成功地做到这一点,但在早期版本上则不行。