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