如何将过滤器附加到QuickBlox的videoTrack?

时间:2016-11-18 13:24:37

标签: android video webrtc quickblox

我正在使用QuickBlox Android SDK 3.0版。我的应用需要进行人脸检测或在视频轨道上添加一些过滤器。我使用OnQBVideoChatListener找到了一些答案。

private OnQBVideoChatListener qbVideoChatListener = new OnQBVideoChatListener() {

        @Override
        public void onCameraDataReceive(byte[] videoData) {
        }

        @Override
        public void onMicrophoneDataReceive(byte[] audioData) {
        }

        @Override
        public void onOpponentVideoDataReceive(byte[] videoData) {
        }

        @Override
        public void onOpponentAudioDataReceive(byte[] audioData) {
        }

};

但是我无法在QuickBlox Android SDK 3.0中找到它。

我的问题是:

1)是否可以从Android SDK 3.0的视频轨道获取YUV字节数据或OpenGL纹理?

2)如何将相机帧数据写回视频轨道?

任何帮助都会得到满足!

  

编辑1:

vfite是对的。 SurfaceViewRenderer.renderFrame(I420Frame框架)是这个问题的关键。所以我从QBRTCSurfaceView扩展了一个类。

public class CustomRTCSurfaceView extends QBRTCSurfaceView {
    private static final String TAG = "CustomRTCSurfaceView";

    public CustomRTCSurfaceView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomRTCSurfaceView(Context context) {
        super(context);
    }

    @Override
    public void renderFrame(VideoRenderer.I420Frame frame) {
        //append filters or do modification as you wish
        VideoRenderer.I420Frame newFrame = getNewFrame();
        super.renderFrame(newFrame);
    }
  }

但这只会改变当前端的帧效应,如何将这种效果应用到点对点连接的另一端?我可以使用任何自定义参数机制吗?

1 个答案:

答案 0 :(得分:0)

您可以在QBRTSession上注册QBRTCClientVideoTracksCallbacks并接收自己和对手的视频轨道。要从视频轨道获取实际帧,您可以使用

在视频渲染器上注册视频回调
currentSession.addVideoTrackCallbacksListener(this);

 @Override
 public void onRemoteVideoTrackReceive(QBRTCSession session, final QBRTCVideoTrack videoTrack, final Integer userID) {
    videoTrack = ..;
 }

 videoTrack.addRenderer(new VideoRenderer(new VideoRenderer.Callbacks() {
        @Override
        public void renderFrame(VideoRenderer.I420Frame i420Frame) {
            //then check if frame contains yuv format or oes
         if (frame.yuvFrame) {
              drawYUV(frame.width, frame.height, frame.yuvStrides,  frame.yuvPlanes);
         } else {
             drawOes(frame.textureId, frame.width, frame.height);
         }
        }
    }));