Signalr 可以用信号器传输视频吗?

Signalr 可以用信号器传输视频吗?,signalr,signalr-hub,signalr.client,Signalr,Signalr Hub,Signalr.client,嗯,我正在尝试对视频流进行验证,我正在使用asp.net c#。 我有点迷路了,你有什么想法或建议吗?没有,Signal基于标准(WebSockets、LongPolling、ForeverFrame等),这些标准只传输基于文本的JSON消息。你最好还是调查一下这件事。现在,您可以通过使用signar发送控制消息来将这两种技术结合在一起,从而触发一些JavaScript来更改浏览器当前显示的WebRTC提要。我在signar之上实现了视频流。您可以在中找到我的示例。我不知道SignalR是否打算

嗯,我正在尝试对视频流进行验证,我正在使用asp.net c#。
我有点迷路了,你有什么想法或建议吗?

没有,Signal基于标准(WebSockets、LongPolling、ForeverFrame等),这些标准只传输基于文本的JSON消息。你最好还是调查一下这件事。现在,您可以通过使用signar发送控制消息来将这两种技术结合在一起,从而触发一些JavaScript来更改浏览器当前显示的WebRTC提要。

我在signar之上实现了视频流。您可以在中找到我的示例。

我不知道SignalR是否打算用于处理视频流,但SignalR是客户机到客户机到服务器和服务器到客户机之间的集线器容器。如果我想要视频聊天,为什么我不能使用它作为我的中心?无论如何,信号器也可以处理字节数组,而不仅仅是字符串,然后让我们尝试将每个帧作为字节[](流)发送。至少当我只使用.Net时,我可以使用集线器字节[]。当我使用Python时,我需要用base64序列化为字符串,并且它也可以从我的PI工作。 注意我的实验室解决方案,我把它放进GIT里

信号集线器(默认,非无服务器)

视频接收器:(UWP)

private async void StreamVideo\u单击(对象发送方,路由目标)
{
isStreamingIn=StreamVideo.IsChecked??false;
如果(isStreamingIn)
{
hubConnection.On(“下载流”,(流)=>
{
_=this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,()=>
{
如果(isStreamingIn)
streamdarraysqueue.Enqueue(stream);
});
});
if(hubConnection.State==HubConnectionState.Disconnected)
等待hubConnection.StartAsync();
_=BuildImageFrames();
}
}     
}
专用异步任务BuildImageFrames()
{
while(isStreamingIn)
{
等待任务。延迟(5);
TryDequeue(输出字节[]缓冲区);
如果(!(缓冲区?.Any()?假))
继续;
尝试
{
var randomAccessStream=新的InMemoryRandomAccessStream();
等待randomAccessStream.WriteAsync(buffer.AsBuffer());
randomAccessStream.Seek(0);
等待randomAccessStream.FlushAsync();
var decoder=await BitmapDecoder.CreateAsync(randomAccessStream);
var softwareBitmap=await decoder.getsoftwarebitmapsync();
var imageSource=等待转换到软件EBITMAPSOURCE(软件位图);
ImageVideo.Source=imageSource;
}
捕获(例外情况除外)
{
系统.诊断.调试.写入线(例如消息);
}
}
}
我用的是“信号核心”


链接已断开:)它没有断开,这显然是weblogs.asp.net的问题。。。希望很快就能修好!仍然不工作,没有备用链接,回购或其他什么?请看网站现在不在。我的代码发送图像(帧)和文本消息。但我也需要语音,然后我将在稍后使用语音直播发送。如果您只想发送像Whatsapp这样的短音频,那么很容易,您可以将音频作为字节[]中的流发送。但直播流媒体音频有更多的挑战。我稍后会在我的下一个实验室里用。如果你能让它工作,请告诉我。我真的需要那段代码!提前感谢这不是最好的工作工具。有些人用螺丝刀像凿子一样用砖头而不是锤子,还用同样的砖头在木头上拧螺丝,他们最终得到了一件杰作。如果你能负担得起,合适的工具将使工作分配更容易,并会使你在工作过程中减少头痛。信号器中使用的技术对于流式视频没有多大用处。而是尝试将IceCast移植到.net。
namespace ChatHub
{
    public interface IVideoChatClient
    {
        Task DownloadStream(byte[] stream);
    }

    public class VideoChatHub : Hub<IVideoChatClient> 
    {
        public async Task UploadStream(byte[] stream)
        {
            await Clients.All.DownloadStream(stream);
        }
    }
}
while (isStreamingOut)
{
      var previewProperties = mediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview) as VideoEncodingProperties;

      VideoFrame videoFrame = new VideoFrame(BitmapPixelFormat.Bgra8, (int)previewProperties.Width, (int)previewProperties.Height);
    
      Var frame = await mediaCapture.GetPreviewFrameAsync(videoFrame)

      if (frame == null)
      {
            await Task.Delay(delayMilliSeconds);
            continue;
      }

      var memoryRandomAccessStream = new InMemoryRandomAccessStream();
      var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, memoryRandomAccessStream);
      encoder.SetSoftwareBitmap(frame.SoftwareBitmap);  
      encoder.IsThumbnailGenerated = false;
      await encoder.FlushAsync();

      try
      {
             var array = new byte[memoryRandomAccessStream.Size];
             await memoryRandomAccessStream.ReadAsync(array.AsBuffer(), (uint)memoryRandomAccessStream.Size, InputStreamOptions.None);

             if (array.Any())
                  await connection.InvokeAsync("UploadStream", array);                   
       }
       catch (Exception ex)
       {
              System.Diagnostics.Debug.WriteLine(ex.Message);
       }

       await Task.Delay(5);
}
private async void StreamVideo_Click(object sender, RoutedEventArgs e)
{
      isStreamingIn = StreamVideo.IsChecked ?? false;
      if (isStreamingIn)
      {
            hubConnection.On<byte[]>("DownloadStream", (stream) =>
            {
                  _ = this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                  {
                       if (isStreamingIn)
                           StreamedArraysQueue.Enqueue(stream);
                  });
             });

             if (hubConnection.State == HubConnectionState.Disconnected)
                  await hubConnection.StartAsync();

              _ = BuildImageFrames();
           }
       }     
}

private async Task BuildImageFrames()
{
      while (isStreamingIn)
      {
            await Task.Delay(5);

            StreamedArraysQueue.TryDequeue(out byte[] buffer);

            if (!(buffer?.Any() ?? false))
                  continue;

            try
            {
                    var randomAccessStream = new InMemoryRandomAccessStream();
                    await randomAccessStream.WriteAsync(buffer.AsBuffer());
                    randomAccessStream.Seek(0); 
                    await randomAccessStream.FlushAsync();

                    var decoder = await BitmapDecoder.CreateAsync(randomAccessStream);

                    var softwareBitmap = await decoder.GetSoftwareBitmapAsync();

                    var imageSource = await ConvertToSoftwareBitmapSource(softwareBitmap);

                    ImageVideo.Source = imageSource;
             }
             catch (Exception ex)
             {
                    System.Diagnostics.Debug.WriteLine(ex.Message);
             }
       }
}