正如标题所说,我试图通过UDP传输音频。我使用连接麦克风的覆盆子pi(v3)(使用Windows 10 IoT)。我记录到流中,然后使用该流通过UDP发送数据。
var socket = new DatagramSocket();
var outputStream = (await socket.GetOutputStreamAsync(new Windows.Networking.HostName(target), targetPortNo)).AsStreamForWrite();
byte[] buffer = new byte[1024];
var streamForRead = _stream.AsStreamForRead();
int bytesRead;
while((bytesRead = await streamForRead.ReadAsync(buffer, 0, buffer.Length)) > 0)
{
await outputStream.WriteAsync(buffer, 0, buffer.Length);
await outputStream.FlushAsync();
}
在接收端,我将数据放回MediaElement控件使用的流中。
private IRandomAccessStream _stream = new MemoryStream().AsRandomAccessStream();
private async void MessageReceivedFromSocket(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
{
var incomingStream = args.GetDataStream().AsStreamForRead();
var writeStream = _stream.AsStreamForWrite();
var buffer = new byte[1024];
int bytesRead;
while ((bytesRead = await incomingStream.ReadAsync(buffer, 0, buffer.Length)) > 0)
{
await writeStream.WriteAsync(buffer, 0, buffer.Length);
await writeStream.FlushAsync();
}
}
然后在mediaelement上设置源:
mediaElement.SetSource(_stream, "audio/x-wav");
mediaElement.Play();
我现在遇到的问题是音频不能播放。数据传输正确,但是媒体元素无法播放。 在使用不使用UDP的流音频进行一些测试之后,我得出的结论是,如果文件完全写入流,则mediaelement将仅播放音频。我用这段代码对此进行了测试:
var folder = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync("Assets");
var file = await folder.GetFileAsync("WP_20160625_13_36_33_Pro.mp4");
var stream = (await file.OpenAsync(Windows.Storage.FileAccessMode.Read)).AsStreamForRead();
var writeStream = _stream.AsStreamForWrite();
var buffer = new byte[1];
int bytesRead;
while((bytesRead = await stream.ReadAsync(buffer,0,buffer.Length)) > 0)
{
await writeStream.WriteAsync(buffer, 0, buffer.Length);
await writeStream.FlushAsync();
}
我使用的文件是350Mb。所以花了一段时间。起初我以为是因为async-await并且只在完成任务时才会调用play,但是在调试之后我发现它并非如此。只要流媒体正在被填满,媒体元素似乎就不会发挥作用了。#34;在将数据添加到流中时,有没有办法让它播放。
我对溪流没有多少经验。所以我不知道我所做的事情是否正确。你可以使用流来获取实时数据吗?对我来说,你可以使用它是有道理的。我一直认为像异步队列一样的流。正在从前面获取数据,而其他数据则被添加到后面。