如何创建像Butt这样的Icecast客户端

时间:2012-11-23 19:08:36

标签: c# client microphone naudio icecast

我需要在C#中创建一个Icecast客户端。它的主要目的是从两个音频设备发送传入音频,通过Icecast进行广播。

当我在搜索已经制作的解决方案时,我发现Butt正是我所需要的,但我还需要单独向Icecast发送两个音频设备。

我已经从两个麦克风获取音频输入并将其保存在一个文件夹中(每个麦克风一个音频文件)。 现在我需要将两个麦克风单独播放到Icecast。

所有这一切都是因为我需要播放两个麦克风,如无线电台(每个麦克风一个电台)。

主要解决方案是这样的:

  • 麦克风1 =>像Source Micro1一样广播到Icecast =>保存音频 像micro1.mp3格式(工作)。
  • 麦克风2 =>广播到 Icecast像Source Micro2 =>像micro2.mp3格式一样保存音频 (工作)。

我需要知道如何广播到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>&nbsp;


<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的全局统计数据中增加,但随后它的连接丢失了,我无法得到任何响应。

2 个答案:

答案 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服务器来收听不同的音频输入。

谢谢大家的帮助。