对于音频编解码器,调用MediaCodec::getOutputFormat()
会在一台设备上抛出IllegalStateException
(而不是另一台设备)。
Android文档说如果编解码器不处于已配置或执行状态,则会引发此类异常:
http://developer.android.com/reference/android/media/MediaCodec.html
在两台设备上,getOutputFormat
的调用是在配置编解码器之后。还有干预调用启动编解码器,并检索其输入和输出缓冲区。
getOutputFormat
来电之后是否需要立即拨打configure()
?文档建议调用configure()
将编解码器置于Configured状态,调用start()
使其处于Executing状态。所以在start()
之后拨打电话应该可以。
但事实上,对文档中的样板代码进行了更改,表明如果您在IllegalStateException
之后调用getOutputFormat()
,则会获得start()
:
除了编解码器状态之外还有其他事情可以触发是否抛出此异常。
答案 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之后成功地做到这一点,但不能在早期版本中成功。