UDP上的实时音频流

时间:2016-08-15 13:11:35

标签: c# audio stream uwp

正如标题所说,我试图通过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并且只在完成任务时才会调用pl​​ay,但是在调试之后我发现它并非如此。只要流媒体正在被填满,媒体元素似乎就不会发挥作用了。#34;在将数据添加到流中时,有没有办法让它播放。

我对溪流没有多少经验。所以我不知道我所做的事情是否正确。你可以使用流来获取实时数据吗?对我来说,你可以使用它是有道理的。我一直认为像异步队列一样的流。正在从前面获取数据,而其他数据则被添加到后面。

0 个答案:

没有答案