Запись HTTP аудио потока в файл - PullRequest
2 голосов
/ 06 мая 2011

В C # я хочу записать аудиопоток

Я делаю что-то вроде:

HttpWebRequest req;
req = (HttpWebRequest)WebRequest.Create("http://url.com/stream");

Webresponse resp = req.GetResponse();
Stream s = resp.GetResponseStream();

fs = File.Exists(fileName)
    ? new FileStream(fileName, FileMode.Append)
    : new FileStream(fileName, FileMode.Create);

byte[] buffer = new byte[4096];

while (s.CanRead)
{
    Array.Clear(buffer, 0, buffer.Length);
    total += s.Read(buffer, 0, buffer.Length);
    fs.Write(buffer, 0, buffer.Length);
}

, и размер файла увеличивается, но не может быть воспроизведен VLC или любая другая программа.

Это не мой точный код, я много проверяю ошибки и т. Д., Но это дает общее представление.

Ответы [ 3 ]

2 голосов
/ 06 мая 2011

Проблема в том, что потоковые биты не имеют контекста.При потоковой передаче в приложение существует молчаливое соглашение о том, что вы имеете дело с типом файла X, и потоковая программа затем пытается воспроизвести биты.

При потоковой передаче в файл необходимо добавить контекст,Одним из наиболее важных битов является заголовок, определяющий тип файла и другую информацию.

Если вы можете добавить заголовок, вы можете воспроизвести файл из файловой системы.Заголовок не будет частью потока, так как сервер и клиент договорились о том, какого типа файл он уже использует.

Если вы создаете потоковый проигрыватель, вы можете воспроизвести сохраненные биты,как вы договариваетесь о типе.Но чтобы он работал автоматически из файла, вы должны добавить заголовок.

2 голосов
/ 06 мая 2011
    Array.Clear(buffer, 0, buffer.Length);
    total += s.Read(buffer, 0, buffer.Length);
    fs.Write(buffer, 0, buffer.Length);

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

    int bytesRead = s.Read(buffer, 0, buffer.Length);
    fs.Write(buffer, 0, bytesRead);
    total+=bytesRead;

Кроме того, воспроизводится ли файл (даже если он больше не поврежден после исправления кода записи файла), зависит от формата, который вы загружаете - какой это кодек / тип файла?

0 голосов
/ 06 мая 2011

Попытка сохранить потоковое MP3-аудио на диск по существу невозможна без детального понимания как формата потока, так и формата файла MP3.То, что вы получаете от потока, - это последовательность «оконных» блоков аудио, преобразованных в частотную область;Проигрыватель, принимающий поток, на лету преобразует фрагменты в аудио во временной области и воспроизводит их один за другим.

Чтобы создать файл MP3 , сначала необходимо записать его.заголовок, содержащий информацию о формате и , затем записывает каждый кусок данных.Но, скорее всего, формат для хранения этих чанков в файле отличается от способа их сжатия в поток.

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

...