何时调用MediaCodec:getOutputFormat()?

时间:2015-02-13 20:02:26

标签: android exception mediacodec native-code

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

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

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

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

getOutputFormat来电之后是否需要立即拨打configure()?文档建议调用configure()将编解码器置于Configured状态,调用start()使其处于Executing状态。所以在start()之后拨打电话应该可以。

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

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

除了编解码器状态之外还有其他事情可以触发是否抛出此异常。

1 个答案:

答案 0 :(得分:3)

您只能在MediaCodec::getOutputFormat返回MediaCodec.INFO_OUTPUT_FORMAT_CHANGED后致电MediaCodec:: dequeueOutputBuffer。它处于执行状态还不够,内部编解码器也需要生成输出MediaFormat对象。

https://android-review.googlesource.com/39100公开MediaCodec API后,该示例很快就被修复了,但你还是对,方法本身的文档仍然需要修复。< / p>

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