我有一个屏幕录制应用程序,它使用MediaCodec编码器对视频帧进行编码.这是我检索视频编码器的一种方法:
videoCodec = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_AVC);
Run Code Online (Sandbox Code Playgroud)
然后我尝试确定此编码器支持的最佳比特率模式,我的优先顺序是"恒定质量"模式,可变比特率模式,恒定比特率模式.这是我尝试这样做的方式:
MediaCodecInfo.CodecCapabilities capabilities = videoCodec.getCodecInfo().getCapabilitiesForType(MediaFormat.MIMETYPE_VIDEO_AVC);
MediaCodecInfo.EncoderCapabilities encoderCapabilities = capabilities.getEncoderCapabilities();
if (encoderCapabilities.isBitrateModeSupported(MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CQ)) {
Timber.i("Setting bitrate mode to constant quality");
videoFormat.setInteger(MediaFormat.KEY_BITRATE_MODE, MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CQ);
} else if (encoderCapabilities.isBitrateModeSupported(MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_VBR)) {
Timber.w("Setting bitrate mode to variable bitrate");
videoFormat.setInteger(MediaFormat.KEY_BITRATE_MODE, MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_VBR);
} else if (encoderCapabilities.isBitrateModeSupported(MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CBR)) {
Timber.w("Setting bitrate mode to constant bitrate");
videoFormat.setInteger(MediaFormat.KEY_BITRATE_MODE, MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CBR);
}
Run Code Online (Sandbox Code Playgroud)
在我的三星Galaxy S7上运行它最终选择VBR模式,即据说不支持恒定质量模式.但是,如果我只是将BITRATE_MODE设置为恒定质量,它不仅可以工作,而且实际上可以产生比VBR模式更高质量的视频.
因此,如果此编码器显然支持恒定质量模式,为什么我会从isBitrateModeSupported()获得误报?我在这里错过了什么吗?
我的用例如下:我正在尝试将 AVCaptureSession 的音频录制添加到应用程序中。该应用程序可能会播放音乐/声音,但我不想更改有关该应用程序的 AVAudioSession 的任何内容。即,共享音频会话可能具有与 PlayAndRecord 不同的类别。所以,没问题,我可以usesApplicationAudioSession在 AVCaptureSession 上设置为 false,它将使用与应用程序的音频会话不同的新 AudioSession。然而,文档指出,这
如果您的应用程序使用自己的音频会话进行播放,则可能会导致中断。
确实如此。我的问题是:有没有办法访问 AVCaptureSession 的私有音频会话(并以与其他音频源混合的方式配置它)?正如我所说,对于这种情况,我不想更改应用程序共享音频会话配置的任何内容。
任何帮助或提示将不胜感激。