2017-08-31 14 views
0

ラジオを再生しようとすると、ラジオで何が起こるかのようなシリーズのMP3ファイルのリストを再生するように自動Djを試しています。 私は多くの問題を回避しようとしましたが、最終的にはshoutcastサーバーにmp3ファイルを送信し、そのサーバーの出力を再生することを考えました。私はその方法をやりません。 bass.radioにbass.netを使用しようとしました。それは私のコードですC#BroadCast Mp3ファイルをShoutCastサーバーに送信

private int _recHandle; 
    private BroadCast _broadCast; 
    EncoderLAME l; 
    IStreamingServer server = null; 

     // Init Bass 
     Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT,IntPtr.Zero); 
     // create the stream 
     int _stream = Bass.BASS_StreamCreateFile("1.mp3", 0, 0, 
       BASSFlag.BASS_SAMPLE_FLOAT | BASSFlag.BASS_STREAM_PRESCAN); 
     l= new EncoderLAME(_stream); 
     l.InputFile = null; //STDIN 
     l.OutputFile = null; 

     l.Start(null, IntPtr.Zero, false); 
     // decode the stream (if not using a decoding channel, simply call "Bass.BASS_ChannelPlay" here) 
     byte[] encBuffer = new byte[65536]; // our dummy encoder buffer 
     while (Bass.BASS_ChannelIsActive(_stream) == BASSActive.BASS_ACTIVE_PLAYING) 
     { 
      // getting sample data will automatically feed the encoder 
      int len = Bass.BASS_ChannelGetData(_stream, encBuffer, encBuffer.Length); 
     } 

     //l.Stop(); // finish 
     //Bass.BASS_StreamFree(_stream); 
     //Server 
     SHOUTcast shoutcast = new SHOUTcast(l); 
     shoutcast.ServerAddress = "50.22.219.37"; 
     shoutcast.ServerPort = 12904; 
     shoutcast.Password = "01008209907"; 
     shoutcast.PublicFlag = true; 
     shoutcast.Genre = "Hörspiel"; 
     shoutcast.StationName = "Kravis Server"; 
     shoutcast.Url = ""; 
     shoutcast.Aim = ""; 
     shoutcast.Icq = ""; 
     shoutcast.Irc = ""; 
     server = shoutcast; 

     server.SongTitle = "BASS.NET"; 

     // disconnect, if connected 
     if (_broadCast != null && _broadCast.IsConnected) 
     { 
      _broadCast.Disconnect(); 
     } 
     _broadCast = null; 
     GC.Collect(); 
     _broadCast = new BroadCast(server); 
     _broadCast.Notification += OnBroadCast_Notification; 
     _broadCast.AutoReconnect = true; 
     _broadCast.ReconnectTimeout = 5; 
     _broadCast.AutoConnect(); 

しかし、私は私のファイルが_broadCastが接続されていても、サーバーにストリーミングされることはありません。 コードや他の何かの解決策があれば。

答えて

0

私は長年に渡ってBASSを使用していませんでしたので、そこにあるコードについて具体的なアドバイスはできません。しかし、私はあなたに何をする必要があるかの要点を伝えたいと思っていました。

ファイルはMP3であるため、サーバーに直接送信して受信側で聞くことができます。しかし、それにはいくつかの問題があります。 1つはレート制御です。単にファイルデータを送信するだけであれば、おそらく10秒間で5分のデータが送信されます。これは、クライアントが多くのデータをバッファリングしないため、最終的には障害を引き起こし、切断されます。もう1つの問題は、MP3ファイルにID3タグの形式で余分なデータが入っていることです。一部のプレイヤーはこれを無視し、他のプレイヤーは無視します。最後に、あなたのファイルの中には、他のサンプルレートとは異なるサンプルレートがあるかもしれないので、送信レートを制限しても、異なるサンプルレートのファイルにヒットした場合、プレーヤーは壊れます。

何が起こる必要があるかは、新鮮なストリームの生成です。パイプラインは次のようになります。

[Source File] -> [Codec] -> [Raw PCM Audio] -> [Codec] -> [MP3 Stream] -> [SHOUTcast Server] -> [Clients] 

さらに、その生のPCMオーディオステップは、リアルタイムレートで実行する必要があります。あなたのコンピュータはリアルタイムよりも確実にデコードとエンコードが可能ですが、プレイヤーがリアルタイムで聴くことができるように、リアルタイムで実行する必要があります。

+0

私はこのパイプラインをどのように作成するかについて、ソースファイルのmp3ストリームを作る方法のいくつかのコードサンプルが必要です。 –

+0

@code FFmpegを通してパイプラインをすべてパイプライン化したことはありますか?つまり、アプリケーション内で未処理のPCMストリームを作成し、それをFFmpegにパイプし、残りの部分を処理させますか?または、少なくともコーデック部分?また、EdCastのソースコードをチェックすることを検討することもできます。 https://github.com/DustyDrifter/AltaCast – Brad

関連する問題