Zerpico
@Zerpico

Свой клиент для ShoutCAST. Как передать поток?

Доброго времени суток!
Делаю свой очень простой клиент для ShoutCast. Хочу сделать чтобы всё что играет в колонках передавалось на сервер.
Использую NAudio и NAudio.Lame (для кодирования). TcpClient для передачи данных. Довольно плохо разбираюсь в этом.
Но Я смог авторизоваться на сервере, и создать точку, поток (или как ни правильно называются). Но при передачи буфера на сервер, тот ругался на не соответствия формату кодека. Стал кодировать в mp3. Но получилось только сохранить на диск а потом передавать на сервер, как сделать Stream перекодированных данных и послать на сервер не понял.
Может кто разбирался с этим помогите кто что знает.

using System;
using System.Text;
using NAudio;
using System.IO;
using NAudio.Wave;
using NAudio.Wave.SampleProviders;
using System.Net.Sockets;
 
 
class Program
    {
        static BufferedWaveProvider waveProvider;
        static ShoutCastHelper netshout;
        static void Main(string[] args)
        {
            //создаем клиент
            netshout = new ShoutCastHelper("10.11.13.215", 4200);
            //пытаемся создать поток
            if (netshout.CreateStream())
            {
                waveProvider = new BufferedWaveProvider(new WaveFormat());
 
                //слушаем колонки по-умолчанию
                var waveIn = new WasapiLoopbackCapture();
                waveIn.DataAvailable += WaveIn_DataAvailable;
                
                //начинаем записывать
                waveIn.StartRecording();
            }
 
            Console.ReadKey();
        }
 
        private static void WaveIn_DataAvailable(object sender, WaveInEventArgs e)
        {
            //пытаемся послать с колонок на сервер
 
            //чтобы это не было
            waveProvider.AddSamples(e.Buffer, 0, e.BytesRecorded);
 
            //делаем котопса из буфера
            byte[] buf = new byte[waveProvider.BufferLength];
            int o = waveProvider.Read(buf, 0, buf.Length);
                       
            //кодер. читаем исходный поток и записываем в файл
            var lam = new NAudio.Lame.LameMP3FileWriter("out.mp3", new WaveFormat(), NAudio.Lame.LAMEPreset.ABR_128);
            lam.Write(buf, 0, buf.Length);
            lam.Close();
 
            //читаем файл. что за велосипед?
            var fileBufMp3 = File.ReadAllBytes("out.mp3");
 
            //шлём на сервер
            netshout.SendSteam(fileBufMp3);
 
            //очистка
            waveProvider.ClearBuffer();
        }
    }
 
    public class ShoutCastHelper
    {
        string answerServer;
        public bool isConnect { get; set; }
 
        NetworkStream stream;
        TcpClient client;
        
 
        public ShoutCastHelper(string server, int port)
        {
            Console.WriteLine("Connection ...");
 
            
            client = new TcpClient(server, port);
 
            //посылаем пароль для авторизации точки #1
            Byte[] data = System.Text.Encoding.ASCII.GetBytes("123\n");
 
            // получем Stream для чтения и записи на сервер
            stream = client.GetStream();
 
            //посылаем пароль
            stream.Write(data, 0, data.Length);
 
            System.Threading.Thread.Sleep(50);  //ждём для подключения
 
            data = new Byte[256]; //генерирум новый буфер для ответа      
 
            Int32 bytes = stream.Read(data, 0, data.Length);
            answerServer = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
 
            //проверяем на авторизацию
            isConnect = answerServer.Contains("OK2");
            if (isConnect)
                Console.WriteLine("Connect! WOW!");
            //мы прошли автризацию. Мы молодцы! Ђ  
 
        }
 
        public bool CreateStream()
        {
            if (!isConnect)
                return false;
 
            try
            {
                //назначаем параметры потока
                string radioArgs = "icy-name:MY RADIO\n" +
                "ice-url:127.0.0.1:4200\n" +
                "ice-genre:BDSM\n" +
                "ice-bitrate:128\n" +
                "ice-private:0\n" +
                "ice-public:1\n" +
                "ice-description:This is My Radio\n" +
                "content-type:audio/mp3\n\n";
 
                var data = System.Text.Encoding.ASCII.GetBytes(radioArgs);
                stream = client.GetStream();
                stream.Write(data, 0, data.Length);
 
                Console.WriteLine("Create Stream!");
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
                return false;
            }
 
            return true;
        }
 
        public void SendSteam(byte[] buffer)
        {
            var nullData = System.Text.Encoding.ASCII.GetBytes(String.Empty);
            stream.Write(nullData, 0, nullData.Length);
            //послать к чёр ... на сервер
            stream.Write(buffer, 0, buffer.Length);
        }
        
    }
}
  • Вопрос задан
  • 402 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы