1

您好我正在开发一个实时流媒体解决方案,我需要编辑本地视频帧并将其发送到连接的对等方,为此我正在编辑 https://webrtc.googlesource.com/src/+/master/sdk/ android/src/java/org/webrtc/Camera2Session.java#201,来自这里的 VideoFrame 被处理到编辑引擎,稍后它返回一个具有以下值的 YUV420 ByteBuffer:

  • 框架宽度=1280
  • 框架高度=720
  • 行步长:1280
  • 行步距U:640
  • 行步长V:640
  • 平面高度Y:720
  • 平面高度U:360
  • 平面高度V:360
  • 平面偏移Y:0
  • 平面偏移U:921600
  • 平面偏移V:1152000
  • 像素步幅Y=1
  • 像素步幅U=1
  • 像素步幅V=1

现在我想根据这些细节重新创建 VideoFrame 对象,我尝试了各种方法来实现这一点,并且几乎非常接近解决方案,只是无法将 Y、U 和 V ByteBuffer 从 ByteBuffer 中分离出来,因此输出有点失真.

在此处输入图像描述

我使用以下代码进行转换:

public static I420Buffer convert(ImageProcessResult result) {
    int frameWidth = result.getWidth();
    int frameHeight = result.getHeight();

    int rowStrideY = result.getRowStride(0);
    int rowStrideU = result.getRowStride(1);
    int rowStrideV = result.getRowStride(2);

    int offsetY = result.getPlaneOffset(0);
    int offsetU = result.getPlaneOffset(1);
    int offsetV = result.getPlaneOffset(2);

    ByteBuffer i420ByteBuffer = result.getBuffer();
    i420ByteBuffer.position(offsetY);
    final ByteBuffer dataY = i420ByteBuffer.slice();

    i420ByteBuffer.position(offsetU);
    final ByteBuffer dataU = i420ByteBuffer.slice();

    i420ByteBuffer.position(offsetV);
    final ByteBuffer dataV = i420ByteBuffer.slice();

    JavaI420Buffer frame = JavaI420Buffer.wrap(frameWidth, frameHeight, dataY, rowStrideY, dataU, rowStrideU, dataV, rowStrideV,
            () -> {
                JniCommon.nativeFreeByteBuffer(i420ByteBuffer);
            });
    return frame;
}

任何解决此问题的帮助将不胜感激,在此先感谢..!

4

0 回答 0