【问题标题】:How Can I append filters to videoTrack of QuickBlox?如何将过滤器附加到 QuickBlox 的 videoTrack?
【发布时间】:2016-11-18 13:24:36
【问题描述】:

我正在使用 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 的任何 aar 中都找不到它。

我的问题是:

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

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

如有任何帮助,将不胜感激!

编辑 1:

vfite 是对的。 SurfaceViewRenderer.renderFrame(I420Frame frame) 是这个问题的关键。所以我从 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);
    }
  }

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

【问题讨论】:

    标签: android video webrtc quickblox


    【解决方案1】:

    您可以在 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);
             }
            }
        }));
    

    【讨论】:

    • 感谢您的回复!我已经编辑了我的问题,你能发表评论吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 2016-03-24
    相关资源
    最近更新 更多