【问题标题】:What are valid bit rates to set for MediaCodec为 MediaCodec 设置的有效比特率是多少
【发布时间】:2014-11-24 11:05:27
【问题描述】:

我正在使用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 设置的最小比特率对于任何给定的分辨率是多少。当我设置一个没有任何效果的比特率时,不会抛出任何错误或任何东西。

【问题讨论】:

    标签: java android encoding android-mediacodec


    【解决方案1】:

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

    /**
     * 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
        }
    }
    

    【讨论】:

      【解决方案2】:

      最低比特率是谷歌要求供应商支持的分辨率的一部分:https://source.android.com/compatibility/android-cdd.pdf。 看5.2

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

      Android 中没有 API 可以检查支持的最低比特率以获得准确的分辨率

      【讨论】:

      • 这似乎并没有真正回答这个问题。 CDD 表示设备必须支持以最低比特率编码,但这并不意味着设备不允许支持低于最低要求的比特率。有最低要求,因此可以保证达到一定的质量水平。
      • 同意该文档描述的是硬件设备的要求,而不是应用程序的要求。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-14
        • 2017-07-17
        • 2011-01-18
        • 2015-06-15
        • 1970-01-01
        • 2020-08-21
        • 1970-01-01
        相关资源
        最近更新 更多