Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建类似Butt的Icecast客户端_C#_Client_Microphone_Naudio_Icecast - Fatal编程技术网

C# 如何创建类似Butt的Icecast客户端

C# 如何创建类似Butt的Icecast客户端,c#,client,microphone,naudio,icecast,C#,Client,Microphone,Naudio,Icecast,我需要在C#中创建一个Icecast客户端。它的主要目的是发送来自两个音频设备的传入音频,以便通过Icecast进行广播 当我在寻找已经制定的解决方案时,我发现Butt正是我所需要的,但我还需要分别向Icecast发送两个音频设备 我已经从两个麦克风获取音频输入,并将它们保存在一个文件夹中(每个麦克风一个音频文件)。 现在我需要分别向Icecast广播两个麦克风 所有这些都是因为我需要像广播电台一样广播两个麦克风(每个麦克风一个电台) 主要解决方案如下: 麦克风1=>像源Micro1一样向Ic

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

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

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

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

主要解决方案如下:

  • 麦克风1=>像源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>

有了这个,我可以连接到Icecast服务器,至少Icecast中的全局统计数据中连接的客户端数量增加了,但是连接丢失了,我无法得到任何响应。

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

我不相信NAudio支持编码(如果我错了,请纠正我)。您需要了解FFMPEG(多种可用的编解码器)或LAME(优质MP3编解码器)之类的内容。另外,如果使用FFMPEG,它可以为您从DirectShow源中捕获数据,因此您只需编写代码即可从标准输出获取数据。(请注意,这里存在潜在的许可问题,包括库的源代码和编解码器的专利。)


现在您已经对音频数据进行了编码,您需要实现Icecast源协议。为此,请参见我的答案:

为了解决我的问题,我使用了Edcast。 这是url

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

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


谢谢大家的帮助。

仅供参考,Edcast可以为您做这件事。由于一些时间问题,我无法继续与客户沟通。但是Edcast帮我做的你必须让IceCast成为你的客户?我不确定NAudio的编码支持,但我正在获取两个输入的音频并将其转换为MP3/OGG/WAV格式,我不知道这是否能回答你关于NAudio的问题(我对编码/音频方面有点不在行)。我已经检查过你的答案了,但是我如何在c#程序中实现呢?如果你已经编码成MP3,那就足够了。获取MP3编码器的输出,并在编码时将其直接发送到Icecast服务器。源协议信息可以在我的答案中的链接上找到。如果您有特定的问题(如打开TCP连接和发送数据),您应该单独提出这些问题。这里有很多问题,不可能知道你在整个问题上遇到了什么困难。如果你不知道如何开始,请告诉我,我可以概述你需要做什么。好的,那太好了。所以让我看看我是否做对了:首先:完成MP3编码。第二:通过IceCast协议(编码音频)通过HTTPS请求向IceCast发送信息?(如果我错了,请指导我)。Icecast不使用HTTPS。它使用自己的专有协议。现在,您发送到Icecast的头与HTTP头非常相似,但这不是一回事。您将找不到兼容的HTTP客户端库。您需要创建到Icecast服务器的TCP连接,发送适当的头,然后开始发送原始音频流数据。我一直在尝试将头发送到Icecast,但我不确定发送头的结构。我已经连接到服务器,但我不知道如何根据协议发送头。你能给我举个c的例子吗?
            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());