Доброго времени суток!
Делаю свой очень простой клиент для
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);
}
}
}