Получение икота шума от Shoutcast - PullRequest
2 голосов
/ 23 января 2012

Я пытаюсь прочитать поток Shoutcast, а затем воспроизвести его с помощью MediaStreamSource. Вот отличный проект с открытым исходным кодом , который сэкономил мне много времени. После небольшой модификации я могу слышать идеальный звук. Но проблема в том, что я получаю периодические шумы или икоты.

Любая идея, как я могу остановить этот шум. Я думал, что это может быть Shoutcast отправляет некоторые метаданные с интервалом, но не знаю, как это остановить. Пробовал с request.Headers["Icy-MetaData"] = "0"; Но это не решает и мою проблему. Любая помощь будет принята с благодарностью.

Edit1: Я сделал еще несколько расследований. Я прочитал данные своего потока в течение 2-3 минут и обнаружил, что в этом потоке много нулевого байта. Вот список индексов байта '0'

92 247 359 1208 1904 2037 2227 2397 2536 2694 2740 2863 2952 3048 3110 3689 3994 4027 4098 4218 4730 4830 4943 5029 5115 5248 5315 5358 5666 6084 6375 6873 6920 7441 7660 7700 7756 8174 8254 8614 9010 9011 9025 904 9461 9046 9025. ....

Это потому, что httpwebrequest медленная загрузка / не удалось загрузить или Shoutcast сам отправляет эти нулевые байты? Также это '0' байтов вызывает шум икота?

Edit2: Вот несколько строк кода о том, как я получаю ответ от shoutcast

        HttpWebRequest request = result.AsyncState as HttpWebRequest;
        HttpWebResponse response = request.EndGetResponse(result) as HttpWebResponse;     
        r = response.GetResponseStream();
        ShoutcastHeader(r);

А вот мое определение метода ShoutcastHeader:

        StreamReader headerReader = new StreamReader(r);
        bool headerIsDone = false;
        while (!headerIsDone)
        {
            string headerLine = headerReader.ReadLine();

            if (headerLine.StartsWith("icy-name:"))
            {
                StationName = headerLine.Substring(9);
            }
            else if (headerLine.StartsWith("icy-genre:"))
            {
                Genre = headerLine.Substring(10);
            }
            else if (headerLine.StartsWith("icy-br:"))
            {
                BitRate = short.Parse(headerLine.Substring(7));
            }
            else if (headerLine.StartsWith("icy-metaint:"))
            {
                MetaInt = int.Parse(headerLine.Substring(12)) * 1111084;
                MetadataAvailable = true;
            }
            else if (headerLine.Equals(""))
                headerIsDone = true;
        }

А вот и ответ в headerReader

ЛЕД 200 ОК icy-note1:
Для этого потока требуется Winamp
icy-note2: распределенный сетевой аудиосервер SHOUTcast / Linux v1.9.93atdn
Ледяное имя: Болливуд и за ее пределами - Радио NRI 24/7 айс-жанр: индийский хинди тамил телугу малаялам деси ледяной URL: http://www.radionri.com тип контента: аудио / MPEG ледяной паб: 1 Ледяной-уш: 128

Также у меня есть потоковые байты в моей общей папке skydrive location .

1 Ответ

0 голосов
/ 06 февраля 2012

Исходя из этого потока похоже, что икота - это информация заголовка, которая периодически пересылается. Существует проблема в проекте ShoutStreamSource, ссылающаяся также на этот :

"Текущая реализация не сбрасывает заголовки mp3 после анализа первого. Это приводит к сбоям в звуке, исходящем из потока, и будет исправлено в ближайшем будущем."

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

...