我们正在使用 android 和 IOS 设备将图像流式传输到后端进行分析。我们选择使用 webrtc 来减少延迟和延迟。
我成功地动态更改了焦点和曝光设置以及高分辨率 2592x1944 帧,同时保持带宽徘徊在 1mbp 左右。
现在,我们想要提高质量(减少压缩伪影)并将帧速率降低到 2-5 fps,同时/以控制带宽(1-2 mbp)。
我试图通过在更改编码器参数后重新编译 webrtc 库(目前只有 android)来做到这一点。
这是我正在使用的代码,位于 webrtc 项目的“HardwareVideoEncoder.java”中。
MediaFormat format = MediaFormat.createVideoFormat(codecType.mimeType(), width, height);
format.setInteger(MediaFormat.KEY_BIT_RATE, adjustedBitrate);
format.setInteger(KEY_BITRATE_MODE, 4);
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, colorFormat);
format.setInteger(MediaFormat.KEY_FRAME_RATE, bitrateAdjuster.getCodecConfigFramerate());
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, keyFrameIntervalSec);
if (codecType == VideoCodecMimeType.H264) {
String profileLevelId = params.get(VideoCodecInfo.H264_FMTP_PROFILE_LEVEL_ID);
Logging.e(TAG, "profileLevelId:" + profileLevelId);
if (profileLevelId == null) {
profileLevelId = VideoCodecInfo.H264_CONSTRAINED_HIGH_3_1;
}
switch (profileLevelId) {
case VideoCodecInfo.H264_CONSTRAINED_HIGH_3_1:
format.setInteger("profile", VIDEO_AVC_PROFILE_HIGH);
format.setInteger("level", VIDEO_AVC_LEVEL_3);
break;
case VideoCodecInfo.H264_CONSTRAINED_BASELINE_3_1:
break;
default:
Logging.w(TAG, "Unknown profile level id: " + profileLevelId);
}
我尝试增加 MediaFormat.KEY_BIT_RATE、更改比特率模式、关键帧时间并尝试 vp8、vp9、H264 编解码器(同时将 sdp 更改为),但我不觉得我得到了不同的结果。使用某些设置,我的编码器初始化失败,但应用程序仍然发送流(我不明白这怎么可能)在此处输入图像描述
另外,我正在尝试将色度二次采样更改为 4:4:4 以获得更好的质量。
所以我的问题是,有哪些好的参数/编解码器可以用来实现高质量、低压缩和低帧速率?
我们还需要更改/重新编译解码器端来实现这一点还是编码器就足够了?
任何有助于我理解(我正在超越自己的体重)并实现这一目标的文章/文档/教程都值得赞赏