【问题标题】:How to create an Icecast client like Butt如何创建像 Butt 这样的 Icecast 客户端
【发布时间】:2012-11-12 03:30:16
【问题描述】:

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

当我在寻找已经制定的解决方案时,我发现 Butt 正是我需要的,但我还需要分别向 Icecast 发送两个音频设备。

我已经从两个麦克风获取音频输入并将它们保存在一个文件夹中(每个麦克风一个音频文件)。 现在我需要将两个麦克风分别广播到 Icecast。

这一切都是因为我需要像广播电台一样广播两个麦克风(每个麦克风一个电台)。

主要的解决方案是这样的:

  • 麦克风 1 => 像 Source Micro1 一样广播到 Icecast => 保存音频 像 micro1.mp3 格式(工作)。
  • 麦克风 2 => 广播到 Icecast like 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的全局统计中增加了,但是连接它丢失了,我无法得到任何响应。

【问题讨论】:

  • 仅供参考,Edcast 可以为您执行此操作。 code.google.com/p/edcast-reborn
  • 由于一些时间问题,我无法继续与客户合作。但 Edcast 为我完成了这项工作。
  • 你必须制作 IceCast 客户端?能不能给我看看,请帮忙

标签: c# client microphone naudio icecast


【解决方案1】:

首先,您需要使用编解码器对捕获的音频进行编码。 MP3 很受欢迎并且得到很好的支持。 aacPlus 得到很好的支持(但不如 MP3),并且在大多数情况下提供更好的压缩比。

我不相信 NAudio 支持编码(如果我错了,请纠正我)。您将需要查看诸如 FFMPEG(各种可用的编解码器)或 LAME(优质 MP3 编解码器)之类的东西。作为奖励,如果您使用 FFMPEG,它能够为您从 DirectShow 源捕获,因此您只需编写代码即可从 STDOUT 获取数据。 (请注意,这里存在潜在的许可问题,包括库的源代码和编解码器的专利。)

现在您已经编码了音频数据,您需要实现 Icecast 源协议。为此,请在此处查看我的答案:https://stackoverflow.com/a/9985297/362536

【讨论】:

  • 我不确定 NAudio 的编码支持,但我正在获取两个输入的音频并将其转换为 MP3/OGG​​/WAV 格式,我不知道是否响应你关于NAudio的问题(我在编码/音频方面有点菜鸟)。我已经检查了你的答案,但是我如何在 c# 程序中实现它?
  • 如果您已经编码为 MP3,那就足够了。获取 MP3 编码器的输出,并在编码时将其直接发送到 Icecast 服务器。可以在我的答案中的链接上找到源协议信息。如果您有特定问题(例如打开 TCP 连接和发送数据),您应该单独提出这些问题。这里有很多东西,而且作为一个完整的问题,不可能知道你遇到了什么问题。如果您不知道如何开始,请务必告诉我,我可以概述您需要做什么。
  • 好的,这很完美。所以让我看看我是否做对了: 首先:获取 MP3 编码(完成)。第二:通过IceCast协议(编码音频)将信息通过HTTPS请求发送到Icecast? (如果我错了,请指导我)。
  • Icecast 不使用 HTTPS。它使用自己的专有协议。现在,您发送到 Icecast 的标头很像 HTTP 标头,但不是一回事。您不会找到兼容的 HTTP 客户端库。您需要创建与 Icecast 服务器的 TCP 连接,发送适当的标头,然后开始发送原始音频流数据。
  • 我一直在尝试将标题发送到 Icecast,但我不确定发送它的结构。我已经连接到服务器,但我不知道如何发送基于协议的标头。你能给我举个c#的例子吗?
【解决方案2】:

为了解决我的问题,我使用了 Edcast。 这是网址https://code.google.com/p/edcast-reborn/

基本上我使用了两个 edcast 实例,每个实例指向不同的音频输入,并且它们连接到 Icecast 服务器。

使用此配置,您可以查看两个 edcast 实例并通过访问 Icecast 服务器来监听不同的音频输入。

感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 2013-07-19
    • 2013-04-28
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多