1

我们正在使用 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 以获得更好的质量。

所以我的问题是,有哪些好的参数/编解码器可以用来实现高质量、低压缩和低帧速率?

我们还需要更改/重新编译解码器端来实现这一点还是编码器就足够了?

任何有助于我理解(我正在超越自己的体重)并实现这一目标的文章/文档/教程都值得赞赏

4

0 回答 0