c# - 在 C# 和 ASP.NET MVC 中将音频直接从 url 流式传输到 Web 浏览器?

标签 c# asp.net-mvc

我正在为一个项目使用 ASP.NET MVC 和 C#。

一个任务是:当用户点击一个链接时,它需要从链接中获取id,然后使用这个链接生成一个外部链接,这是一个音频文件,然后在网络浏览器中播放(不是另存为文件)。

目前的解决方案是:从外部链接下载音频文件,获取字节,然后将其作为audio/wav放在响应中

public async Task<HttpResponseMessage> StreamAudioAsync(string id)
{
    var response = Request.CreateResponse(HttpStatusCode.Moved);
    var data = GetAudio(id);

    if (data != null && data.Length > 0)
    {
        response.StatusCode = HttpStatusCode.OK;
        response.Content = new ByteArrayContent(data);
        response.Content.Headers.ContentType = new MediaTypeHeaderValue("audio/wav");
    }

    return response;
}

private byte[] GetAudio(string id)
{
    string accessKey = Cp.Service.Settings.AccessKey;
    string secretAccessKey = Cp.Service.Settings.SecretAccessKey;

    string url = string.Format("https://....../......php?access_key={0}&secret_access_key={1}&action=recording.download&format=mp3&sid={2}", accessKey, secretAccessKey, id);

    byte[] data = null;

    try
    {
        using (var wc = new System.Net.WebClient())
        {
            data = wc.DownloadData(url);
        }
    }
    catch //(Exception ex)
    {
        //forbidden, proxy issues, file not found (404) etc
        //ms = null;
    }

    return data;
}

这将首先下载音频数据。有没有办法将音频流从 url 直接流式传输到响应?这样,服务器就不会在内存中保存数据 bytes[] 了?有时,数据量很大。

谢谢

最佳答案

您的代码中有两个地方使用byte 数组。

WebClient.DownloadData将整个远程资源作为 byte[] 返回。如果您改为使用 WebClient.OpenRead (即 wc.OpenRead(url);)你会得到一个 Stream,通过它可以读取远程资源。

此外,您正在实例化一个 ByteArrayContent向您的远程客户端提供音频数据。我看到还有一个 StreamContent class您可以使用它指定要发送到远程客户端的 Stream

这是未经测试的,我不确定在使用 response.Content 之前处理 WebClient 是否会有问题,或者 是否/如何/在哪里wc.OpenRead(url) 返回的 Stream 应该被显式处理,但这应该给你一个想法......

public async Task<HttpResponseMessage> StreamAudioAsync(string id)
{
    var response = Request.CreateResponse(HttpStatusCode.Moved);

    response.StatusCode = HttpStatusCode.OK;
    using (var wc = new System.Net.WebClient())
    {
        string accessKey = Cp.Service.Settings.AccessKey;
        string secretAccessKey = Cp.Service.Settings.SecretAccessKey;
        string url = string.Format("https://....../......php?access_key={0}&secret_access_key={1}&action=recording.download&format=mp3&sid={2}", accessKey, secretAccessKey, id);

        response.Content = new StreamContent(wc.OpenRead(url));
    }
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("audio/wav");

    return response;
}

关于c# - 在 C# 和 ASP.NET MVC 中将音频直接从 url 流式传输到 Web 浏览器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53874135/

相关文章:

c# - ASP.NET MVC 5 异步上下文管理

c# - 为什么我们需要C#中的UI,业务和数据访问之间的接口(interface)

C#:代码契约与普通参数验证

c# - namespace 不是其父 namespace 的 XML 属性被反序列化为 null

c# - 为什么波浪号和斜杠在 Asp.net MVC 应用程序中不起作用?

asp.net-mvc - ASP.Net MVC Html.ActionLink() 问题

c# - 在 Silverlight 中调整 LineHeight for Windows Phone 7 应用程序

c# - RelayCommand 和委托(delegate),尝试理解委托(delegate)

asp.net - Html 表达式作为 razor 中的 lambda - 允许什么,记录在哪里

c# - 您可以配置 OWIN Cookie 身份验证以防止某些 URL 影响滑动过期吗?