0

C#でIcecastクライアントを作成する必要があります。これの主な目的は、Icecastを介してブロードキャストされる2つのオーディオデバイスからの着信オーディオを送信することです。

すでに作成されているソリューションを探していたときに、まさに必要なものであるバットを見つけましたが、2つのオーディオデバイスを個別にIcecastに送信する必要もありました。

私はすでに2つのマイクからオーディオ入力を取得しており、それらをフォルダーに保存しています(マイクごとに1つのオーディオファイル)。次に、2つのマイクを個別にIcecastにブロードキャストする必要があります。

これはすべて、ラジオ局のように2つのマイクをブロードキャストする必要があるためです(マイクごとに1つのステーション)。

主な解決策は次のようなものです。

  • マイク1=>ソースMicro1のようにIcecastにブロードキャスト=>micro1.mp3形式のようにオーディオを保存します(動作中)。
  • マイク2=>ソースMicro2のようにIcecastにブロードキャスト=>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のグローバル統計で増加しますが、接続が失われ、応答を得ることができません。

4

2 に答える 2

1

まず、キャプチャしたオーディオをコーデックでエンコードする必要があります。MP3は人気があり、十分にサポートされています。aacPlusは十分にサポートされており(ただし、MP3ほどではありません)、ほとんどの場合、より優れた圧縮率を提供します。

NAudioがエンコーディングをサポートしているとは思いません(間違っている場合は訂正してください)。FFMPEG(さまざまなコーデックが利用可能)やLAME(高品質のMP3コーデック)のようなものを調べる必要があります。ボーナスとして、FFMPEGを使用すると、DirectShowソースからキャプチャできるため、STDOUTからデータを取得するためのコードを記述するだけで済みます。(ここには、ライブラリのソースコードとコーデックの特許の両方で潜在的なライセンスの問題があることに注意してください。)

オーディオデータをエンコードしたので、Icecastソースプロトコルを実装する必要があります。これを行うには、ここで私の答えを参照してください: https ://stackoverflow.com/a/9985297/362536

于 2012-11-24T08:35:04.700 に答える
0

私の問題を解決するために、私はEdcastを使用しました。これはURLhttps ://code.google.com/p/edcast-reborn/です

基本的に、私はedcastの2つのインスタンスを使用しました。それぞれが異なるオーディオ入力を指し、Icecastサーバーに接続していました。

この構成では、2つのedcastインスタンスを確認し、Icecastサーバーにアクセスしてさまざまなオーディオ入力を聞くことができます。

よろしくお願いします。

于 2014-09-15T15:04:09.763 に答える