gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:57:04 25 4
gpt4 key购买 nike

我正在为一个项目使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com