我正在使用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
设置的最小比特率对于任何给定的分辨率。当我设置的比特率没有任何影响时,不会抛出任何错误。
答案 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
}
}