我需要在C#中创建一个Icecast客户端。它的主要目的是从两个音频设备发送传入音频,通过Icecast进行广播。
当我在搜索已经制作的解决方案时,我发现Butt正是我所需要的,但我还需要单独向Icecast发送两个音频设备。
我已经从两个麦克风获取音频输入并将其保存在一个文件夹中(每个麦克风一个音频文件)。 现在我需要将两个麦克风单独播放到Icecast。
所有这一切都是因为我需要播放两个麦克风,如无线电台(每个麦克风一个电台)。
主要解决方案是这样的:
我需要知道如何广播到icecast,我正在使用NAudio库来获取音频输入并保存。
编辑: 我正在与C#的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的全局统计数据中增加,但随后它的连接丢失了,我无法得到任何响应。
答案 0 :(得分:1)
首先,您需要使用编解码器对捕获的音频进行编码。 MP3很受欢迎,也很受支持。 aacPlus受到良好支持(但不如MP3),并且在大多数情况下提供更好的压缩比。
我不相信NAudio支持编码(如果我错了请纠正我)。您将需要查看类似FFMPEG(可用的各种编解码器)或LAME(高质量MP3编解码器)。作为奖励,如果您使用FFMPEG,它可以从DirectShow源捕获,因此您只需编写代码即可从STDOUT获取数据。 (请注意,这里存在潜在的许可问题,包括库的源代码和编解码器上的专利。)
现在您已经编码了音频数据,您需要实现Icecast源协议。为此,请在此处查看我的答案:https://stackoverflow.com/a/9985297/362536
答案 1 :(得分:0)
为了解决我的问题,我使用了Edcast。 这是网址https://code.google.com/p/edcast-reborn/
基本上我使用了两个edcast实例,每个实例指向不同的音频输入,并且它们连接到Icecast服务器。
使用此配置,您可以看到两个edcast实例,并通过访问Icecast服务器来收听不同的音频输入。
谢谢大家的帮助。