Мне нужно создать клиент Icecast на C#. Основная цель этого — отправить входящий звук с двух аудиоустройств для трансляции через Icecast.
Когда я искал какое-то уже готовое решение, я нашел Butt, который был именно тем, что мне было нужно, но мне также нужно было отправить на Icecast два аудиоустройства по отдельности.
Я уже получаю аудиовход с двух микрофонов и сохраняю их в папке (по одному аудиофайлу для каждого микрофона). Теперь мне нужно отдельно транслировать два микрофона на Icecast.
Все это потому, что мне нужно транслировать два микрофона как радиостанцию (по одной станции на каждый микрофон).
Основное решение примерно такое:
- Микрофон 1 => Трансляция в Icecast, как Source Micro1 => Сохранение аудио, как в формате micro1.mp3 (работает).
- Микрофон 2 => Трансляция в Icecast, как Source Micro2 => Сохранить звук, как в формате micro2.mp3 (работает).
Мне нужно знать, как я могу транслировать на icecast, я использую библиотеку NAudio, чтобы получить аудиовход и сохранить его.
РЕДАКТИРОВАТЬ: я общаюсь с Icecast из С#, это мой код:
public static void commIcecast(string url)
{
WebClient client = new WebClient();
client.Headers.Add("content-type", "audio/mpeg");
client.Headers.Add("Authorization", "Basic c291cmNlOmhhY2ttZQ==");
client.Headers.Add("ice-name", "This is my server name");
client.Headers.Add("ice-url", "http://www.google.com");
client.Headers.Add("ice-genre", "Rock");
client.Headers.Add("ice-description", "This is my server description");
client.Headers.Add("ice-audio-info", "ice-samplerate=44100;ice-bitrate=128;ice-channels=2");
Stream data = client.OpenRead(url);
StreamReader reader = new StreamReader(data);
string s = reader.ReadToEnd();
Console.WriteLine(s);
data.Close();
reader.Close();
}
Но я только что получил этот ответ от сервера Icecast:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Icecast Streaming Media Server</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body topmargin="0" leftmargin="0" rightmargin="0" bottommargin="0">
<h2>Icecast2 Status</h2>
<br><div class="roundcont">
<div class="roundtop"><img src="/corner_topleft.jpg" class="corner" style="display: none"></div>
<table border="0" width="100%" id="table1" cellspacing="0" cellpadding="4"><tr><td bgcolor="#656565">
<a class="nav" href="admin/">Administration</a><a class="nav" href="status.xsl">Server Status</a><a class="nav" href="server_version.xsl">Version</a>
</td></tr></table>
<div class="roundbottom"><img src="/corner_bottomleft.jpg" class="corner" style="display: none"></div>
</div>
<br><br>
<div class="poster">Support icecast development at <a class="nav" target="_blank" href="http://www.icecast.org">www.icecast.org</a>
</div>
</body>
</html>
Я пытался отправить "SOURCE /mp3test ICE/1.0", но метод Headers.Add не позволяет мне это сделать.
РЕДАКТИРОВАТЬ: я отправляю это через tcp в Icecast, но я не могу получить ответ, мне просто нужно знать, можно ли отправить его таким способом, если это прямо сейчас, мне придется переместить сообщение в проблемы tcp. Я не получаю никакого ответа от сервера Icecast, используя этот метод отправки.
System.Net.IPAddress address = System.Net.IPAddress.Parse(url);
socketServer = new TcpClient(url, port);
NetworkStream networkStream = socketServer.GetStream();
data = Encoding.ASCII.GetBytes("SOURCE /csharp ICE/1.0");
networkStream.Write(data, 0, data.Length);
data = Encoding.ASCII.GetBytes("content-type: audio/mpeg");
networkStream.Write(data, 0, data.Length);
data = Encoding.ASCII.GetBytes("Authorization: Basic c291cmNlOmhhY2ttZQ==");
networkStream.Write(data, 0, data.Length);
data = Encoding.ASCII.GetBytes("ice-name: lala");
networkStream.Write(data, 0, data.Length);
data = Encoding.ASCII.GetBytes("ice-url: localhost");
networkStream.Write(data, 0, data.Length);
data = Encoding.ASCII.GetBytes("ice-genre: Rock");
networkStream.Write(data, 0, data.Length);
data = Encoding.ASCII.GetBytes("ice-bitrate: 128");
networkStream.Write(data, 0, data.Length);
data = Encoding.ASCII.GetBytes("ice-private: 0");
networkStream.Write(data, 0, data.Length);
data = Encoding.ASCII.GetBytes("ice-public: 1");
networkStream.Write(data, 0, data.Length);
data = Encoding.ASCII.GetBytes("ice-description: This is my server description");
networkStream.Write(data, 0, data.Length);
data = Encoding.ASCII.GetBytes("ice-audio-info: ice-samplerate=44100;ice-bitrate=128;ice-channels=2");
networkStream.Write(data, 0, data.Length);
StreamReader reader = new StreamReader(networkStream);
Console.WriteLine(reader.ReadToEnd());
С этим я могу подключиться к серверу Icecast, по крайней мере, количество подключенных клиентов увеличивается в глобальной статистике в Icecast, но затем соединение теряется, и я не могу получить никакого ответа.