unitySDK可以实现获取unity内置camera图像并进行传输吗?能实现屏幕共享吗?

unitySDK可以实现获取unity内置camera图像并进行传输吗?能实现屏幕共享吗?
自定义视频采集和渲染,贵公司网站给的这个示例实现不了呀!

可以实现的呀,你目前是遇到什么问题了吗?

rtc.PushVideoFrame(externalVideoFrame)=0
推送外部视频帧成功,但是
int tmpi = videoRender.UpdateVideoRawData(uid, data, ref defWidth, ref defHeight);
tmpi =-1
一直失败
// 推送外部视频帧。
int a = rtc.PushVideoFrame(externalVideoFrame);
这句代码确切应该放在那里,我能想到的都试过了,能发我一份你们成功的代码吗?

就用官网的代码就行了呀:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using agora_gaming_rtc;
using UnityEngine.UI;
using System.Globalization;
using System.Runtime.InteropServices;
using System;

public class ShareScreen : MonoBehaviour
{
   Texture2D mTexture;
   Rect mRect;
   [SerializeField]
   private string appId = "Your_AppID";
   [SerializeField]
   private string channelName = "agora";
   public IRtcEngine mRtcEngine;
   int i = 100;

   void Start()
   {
       Debug.Log("ScreenShare Activated");
       mRtcEngine = IRtcEngine.GetEngine(appId);
       // 设置日志输出等级。
       mRtcEngine.SetLogFilter(LOG_FILTER.DEBUG | LOG_FILTER.INFO | LOG_FILTER.WARNING | LOG_FILTER.ERROR | LOG_FILTER.CRITICAL);
       // 启用视频模块。
       mRtcEngine.EnableVideo();
       // 启用视频观测器。
       mRtcEngine.EnableVideoObserver();
       // 配置外部视频源。
       mRtcEngine.SetExternalVideoSource(true, false);
       // 加入频道。
       mRtcEngine.JoinChannel(channelName, null, 0);
       // 创建需共享的屏幕区域。
       mRect = new Rect(0, 0, Screen.width, Screen.height);
       // 创建 Texture。
       mTexture = new Texture2D((int)mRect.width, (int)mRect.height, TextureFormat.BGRA32, false);
   }

   void Update()
   {
       StartCoroutine(shareScreen());
   }

   // 开始屏幕共享。
   IEnumerator shareScreen()
   {
       yield return new WaitForEndOfFrame();
       // 读取屏幕像素。
       mTexture.ReadPixels(mRect, 0, 0);
       // 应用像素。
       mTexture.Apply();
       // 获取 Raw Texture 并将其应用到字节数组中。
       byte[] bytes = mTexture.GetRawTextureData();
       // 为字节数组提供足够的空间。
       int size = Marshal.SizeOf(bytes[0]) * bytes.Length;
       // 查询是否存在 IRtcEngine 实例。
       IRtcEngine rtc = IRtcEngine.QueryEngine();
       if (rtc != null)
       {
           // 创建外部视频帧。
           ExternalVideoFrame externalVideoFrame = new ExternalVideoFrame();
           // 设置视频帧 buffer 类型。
           externalVideoFrame.type = ExternalVideoFrame.VIDEO_BUFFER_TYPE.VIDEO_BUFFER_RAW_DATA;
           // 设置像素格式。
           externalVideoFrame.format = ExternalVideoFrame.VIDEO_PIXEL_FORMAT.VIDEO_PIXEL_BGRA;
           // 应用原始数据。
           externalVideoFrame.buffer = bytes;
           // 设置视频帧宽度(pixel)。
           externalVideoFrame.stride = (int)mRect.width;
           // 设置视频帧高度(pixel)。
           externalVideoFrame.height = (int)mRect.height;
           // 设置从哪侧移除视频帧的像素。
           externalVideoFrame.cropLeft = 10;
           externalVideoFrame.cropTop = 10;
           externalVideoFrame.cropRight = 10;
           externalVideoFrame.cropBottom = 10;
           // 设置视频帧旋转角度: 0、90、180 或 270。
           externalVideoFrame.rotation = 180;
           // 使用视频时间戳增加 i。
           externalVideoFrame.timestamp = i++;
           // 推送外部视频帧。
           int a = rtc.PushVideoFrame(externalVideoFrame);
       }
   }
}

用的就是这个,VideoSurface里面的
if (IsBlankTexture())
{
if (videoRender != null)
{
Debug.Log(“存在videorender”);
}
Debug.Log(“到这里了int tmpi = videoRender.UpdateVideoRawData(uid, data, ref defWidth, ref defHeight);”);
int tmpi = videoRender.UpdateVideoRawData(uid, data, ref defWidth, ref defHeight);
Debug.Log(“tmpi =” + tmpi.ToString());
if (tmpi == -1)
return;
一直取值-1,

image
NativeTexture一直显示为空

现在对端用 Demo 加入同一个频道,是否能听到屏幕共享的声音?是不是有声音,无画面?

%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_15826146294943
问题就出在这里了
int tmpi = videoRender.UpdateVideoRawData(uid, data, ref defWidth, ref defHeight);
// Debug.Log(“tmpi =” + tmpi.ToString());
// if (tmpi == -1)
// return;
tmpi
= -1

加入同一频道的手机端,电脑端的声音听得到,电脑端的截屏画面时隐时现,,但是电脑端不能显示自己的截屏画面%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_15826154847919 %E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_15826154927585

你在 JoinChannel 前调用一下:

SetChannelProfile(CHANNEL_PROFILE_LIVE_BROADCASTING);
SetClientRole(BROADCASTER);

然后再测试看下。

非常感谢,手机端显示的问题解决了,也许是由于我的网络状况不好,时间延迟很长,
但是电脑端依旧不显示自己的截屏画面
int tmpi = videoRender.UpdateVideoRawData(uid, data, ref defWidth, ref defHeight);返回值依旧是-1%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_15826168115696
图中大方块负责显示本机画面,试试依旧不显示

1、所以现在的问题就是,手机端可以看到电脑端的屏幕共享画面,但是电脑端本地无法看到自己的屏幕共享画面对吗?

2、这个设置了吗?
JoinChannel 前调用一下:

SetChannelProfile(CHANNEL_PROFILE_LIVE_BROADCASTING);
SetClientRole(BROADCASTER);


设置了,就是不显示本机画面

mRtcEngine.SetChannelProfile(CHANNEL_PROFILE.CHANNEL_PROFILE_COMMUNICATION);
mRtcEngine.SetClientRole(CLIENT_ROLE.BROADCASTER);//
这样设置的话,电脑端不显示本机画面,而且手机端显示画面时隐时现

好的,我先确认下,稍后答复你

非常感谢,已经折腾好几天了,期待您的回复,:blush:

本地想看,最好的办法就是自己用一个 view,将采集数据源的 texture 贴上去 显示出来就行了额。你那边再试试看?

pushExternalVideoFrame 本来就是启用外部采集,因为 Unity 是使用的裸数据自渲染,启用了外部采集后,OnCaptureVideoFrame 应该就不会响应,本地端如果想看到,需要像上面说的那样自行做渲染。

你好,恕我知识浅薄,您说的view我不明白什么意思?能具体解释一下吗?怎么获得采集数据源的 texture ?

1、view就是创建的物体啊。。。
2、这个 texture 就是你自己采集的啊


3、你将这个 texture 贴到你自己创建的物体上不就看到 采集的咯
4、SDK 中 VideoSurface.cs 中就有类似的贴 texture 的示例。

updateVideoRawData 我也是遇到了这个问题 , 一直是 -1 请问怎么解决的.