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