为MediaCodec设置的有效比特率是多少

时间:2014-09-29 23:09:21

标签: java android encoding mediacodec

我正在使用MediaCodec对来自相机的视频进行编码:

MediaFormat format = MediaFormat.createVideoFormat("video/avc", width, height);
        format.setInteger(MediaFormat.KEY_BIT_RATE, 250000);
        format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1);
        format.setInteger(MediaFormat.KEY_FRAME_RATE, 15);
        format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
        _mediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);

我发现根据我给出的分辨率,有一些最小有效比特率要设置。如果我在该数量下设置比特率,则完全被忽略。如果我将比特率设置为高于此不可见阈值,则按预期工作。我想要做的是查询我可以为KEY_BIT_RATE设置的最小比特率对于任何给定的分辨率。当我设置的比特率没有任何影响时,不会抛出任何错误。

3 个答案:

答案 0 :(得分:2)

最低比特率是供应商要求支持的解决方案的Google要求的一部分:https://source.android.com/compatibility/android-cdd.pdf。 看看5.2

对于其他分辨率,行为未定义。未在文档中列出的决议也可能会引入其他意外问题,因为它们未包含在Google认证测试(CTS)中,并且无法保证设备供应商能够使其正常工作

并且android中没有API来检查最小支持的比特率以获得精确的分辨率

答案 1 :(得分:0)

合理限制内的任何比特率都有效。您可以使用在线视频比特率calculator计算所需的比特率。可以通过编解码器的特定实现来设置最小阈值。

答案 2 :(得分:0)

比特率取决于编解码器类型。我编写了一个实用函数来计算比特率,如果它不在编解码器指定的范围内,则该值将被限制以使其与编解码器规范兼容。

/**
 * https://source.android.com/compatibility/android-cdd.pdf
 */
private fun calculateBitRate(width: Int, height: Int): Int {
    return when (height) {
        240 -> 384_000
        360 -> 1_000_000
        480 -> 2_000_000
        720 -> 4_000_000
        1080 -> 10_000_000
        else -> (4.8 * width * height).toInt()
    }
}
var bitRate: Int = calculateBitRate(width, height)
val mcl = MediaCodecList(MediaCodecList.REGULAR_CODECS)
for (info in mcl.codecInfos) {
    if (!info.isEncoder) {
        continue
    }
    try {
        val caps = info.getCapabilitiesForType(mime)
        if (caps != null && caps.isFormatSupported(format)) {
            bitRate = caps.videoCapabilities.bitrateRange.clamp(bitRate)
            format.setInteger(MediaFormat.KEY_BIT_RATE, bitRate)
            break
        }
    } catch (e: IllegalArgumentException) {
        // type is not supported
    }
}