Android怎样实现视频通话的过程中将屏幕共享给别人


#1

我想在视频通话的界面加一个按键,在视频通话过程中点击该按键,能够将我的屏幕共享给别人,再次点击该按键又回到视频通话。也就是说这个按键功能我是想做成能够切换视频通话跟屏幕共享两种模式。请问这个功能能实现吗?该怎么实现?THANKS!


#2

可以实现的~
首先需要知道,屏幕共享只能通过自采集方式实现~~
摄像头和屏幕共享的切换,有三种方法:
1、Camera流采用自采集方式进行采集:
自采集+自采集,自行做处理即可

2、Camera流采用SDK采集方式进行采集:

(1)摄像头流SDK采集+屏幕共享流自采集(MediaIO方式)
在频道内切换视频源即可,需要调用setVideoSource(new AgoraDefaultSource())

(2)摄像头流SDK采集+屏幕共享流自采集(pushExternalVideoFrame方式)
push方法不支持在频道内切换视频源。
需要先退出频道,再重新加入频道,才可以push屏幕共享流。切回摄像头流时,也需要先退出频道再重进,才能切换回摄像头流。

这边建议采用方法1或方法2(1)哦


#3

请问有关于屏幕共享流自采集(MediaIO方式)的实例吗?


#4

暂时只有push方法的sample哦
MediaIO方法的示例代码:https://docs.agora.io/cn/Interactive%20Broadcast/custom_video_android?platform=Android

// java
IVideoFrameConsumer mConsumer;
boolean mHasStarted;

// 先创建一个实现VideoSource接口的实例
VideoSource source = new VideoSource() {
    @Override
    public int getBufferType() {
        // 返回当前帧数据的类型,每种数据类型在SDK内部会经过不同的处理,
        // 所以必须与帧数据的类型保持一致。
        // 若切换VideoSource的类型,必须重新创建另一个实例
        // 有三种类型
        return BufferType.BYTE_ARRAY;
        // return BufferType.TEXTURE
        // return BufferType.BYTE_BUFFER;
    }

    @Override
     public boolean onInitialize(IVideoFrameConsumer consumer) {
        // consumer是由SDK创建的,在video source生命
        // 周期中注意保存它的引用。
        mConsumer = consumer;
    }

    @Override
     public boolean onStart() {
        mHasStarted = true;
    }

    @Override
      public void onStop() {
        mHasStarted = false;
    }

    @Override
     public void onDispose() {
        // 释放对consumer的引用
        mConsumer = null;
    }
};

// 将输出流切换到刚创建的VideoSource实例
rtcEngine.setVideoSource(source);

// 在得到视频帧数据之后,可以调用consumer类的方法传送数据
// 必须根据帧数据的类型来选择用不同的方法。
// 假设从视频源中得到的视频为data, 从Android相机中获取的帧类型
// 可能是NV21和TEXTURE_OES,假设当前类型为byte array,即NV21
if (mHasStarted && mConsumer != null) {
    mConsumer.consumeByteArrayFrame(data, AgoraVideoFrame.NV21, width, height, rotation, timestamp);
}

#5

好的,我先看下,多谢啦!


#6

不客气~