Потоковое аудио прямо с URL-адреса в веб-браузер в C # и ASP.NET MVC? - PullRequest
0 голосов
/ 20 декабря 2018

Я использую ASP.NET MVC и C # для проекта.

Одна из задач заключается в следующем: когда пользователь нажимает на ссылку, ему необходимо получить идентификатор ссылки, затем использовать эту ссылку для создания внешней ссылки, которая представляет собой аудиофайл, а затем воспроизвести ее в веб-браузере (не сохранять как файл).

Текущее решение: загрузить аудиофайл по внешней ссылке, получить байты, а затем поместить его в ответ как аудио / 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[] в памяти?Иногда размер данных огромен.

Спасибо

1 Ответ

0 голосов
/ 20 декабря 2018

В вашем коде есть два места, где вы работаете с массивами byte.

WebClient.DownloadData возвращает весь удаленный ресурс как byte[].Если вы вместо этого использовали WebClient.OpenRead (то есть wc.OpenRead(url);), вы получаете Stream, через который можно прочитать удаленный ресурс.

Далее вы создаете экземпляр ByteArrayContent для предоставления аудиоданных вашему удаленному клиенту.Я вижу, что есть также StreamContent класс , с помощью которого вы можете указать Stream для отправки удаленному клиенту.

Это не проверено, и я не уверен, удаляю лиWebClient до использования response.Content будет проблематичным, или если / как / где Stream, возвращаемое wc.OpenRead(url), должно быть явно удалено, но это должно дать вам идею ...

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...