C#将Mp3文件广播到ShoutCast服务器
我想做一个像Auto Dj这样的收音机来播放Mp3文件列表,就像收音机里发生的事情一样。 我尝试了很多方法,但最后我想到了将mp3文件发送到shoutcast服务器,并播放该服务器的输出。我的问题是我不知道如何做到这一点 我试过bass.radio使用bass.net,这是我的代码C#将Mp3文件广播到ShoutCast服务器,c#,.net,shoutcast,internet-radio,C#,.net,Shoutcast,Internet Radio,我想做一个像Auto Dj这样的收音机来播放Mp3文件列表,就像收音机里发生的事情一样。 我尝试了很多方法,但最后我想到了将mp3文件发送到shoutcast服务器,并播放该服务器的输出。我的问题是我不知道如何做到这一点 我试过bass.radio使用bass.net,这是我的代码 private int _recHandle; private BroadCast _broadCast; EncoderLAME l; IStreamingServer server
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();
但即使连接了_广播,我也不会将文件流到服务器。
因此,如果有任何代码解决方案或任何其他我可以做的事情。我已经很多年没有使用BASS了,因此我无法就您的代码提供具体建议。但是,我想告诉你你需要做什么的过程要点。。。它可能会帮助你开始 由于您的文件是MP3格式的,因此可以将其直接发送到服务器并在接收端收听。然而,这也有一些问题。首先是利率控制。如果您只是简单地传输文件数据,您将在大约10秒的时间内发送5分钟的数据。这最终会导致失败,因为客户端不会缓冲太多数据,并且会断开连接。另一个问题是,您的MP3文件中经常以ID3标记的形式包含额外的数据。一些玩家会忽略这一点,其他人不会。最后,您的一些文件的采样率可能与其他文件的采样率不同,因此,即使您限制了您的发送,当玩家以不同的采样率命中文件时,他们也会中断 需要发生的是产生一条新的河流。管道看起来像这样:
[Source File] -> [Codec] -> [Raw PCM Audio] -> [Codec] -> [MP3 Stream] -> [SHOUTcast Server] -> [Clients]
此外,原始PCM音频步骤需要以实时速率运行。虽然你的电脑绝对可以比实时更快地解码和编码,但它需要实时运行,以便玩家可以实时收听。我已经很多年没有使用BASS了,因此我无法就你的代码提供具体建议。但是,我想告诉你你需要做什么的过程要点。。。它可能会帮助你开始 由于您的文件是MP3格式的,因此可以将其直接发送到服务器并在接收端收听。然而,这也有一些问题。首先是利率控制。如果您只是简单地传输文件数据,您将在大约10秒的时间内发送5分钟的数据。这最终会导致失败,因为客户端不会缓冲太多数据,并且会断开连接。另一个问题是,您的MP3文件中经常以ID3标记的形式包含额外的数据。一些玩家会忽略这一点,其他人不会。最后,您的一些文件的采样率可能与其他文件的采样率不同,因此,即使您限制了您的发送,当玩家以不同的采样率命中文件时,他们也会中断 需要发生的是产生一条新的河流。管道看起来像这样:
[Source File] -> [Codec] -> [Raw PCM Audio] -> [Codec] -> [MP3 Stream] -> [SHOUTcast Server] -> [Clients]
此外,原始PCM音频步骤需要以实时速率运行。虽然你的电脑绝对可以比实时更快地解码和编码,它需要实时运行,以便播放器可以实时收听。我很清楚这一点,但我的问题是如何创建此管道需要一些如何从源代码生成mp3流的代码示例file@Code你有没有考虑过把它全部用管道输送到FFmpeg?也就是说,在应用程序中生成原始PCM流,将其传输到FFmpeg中,然后让它处理其余部分?或者,至少是编解码器部分?您也可以考虑检查EdCAST的源代码。我很清楚这一点,但我的问题是如何创建这个管道需要一些如何使mp3流的源代码样本file@Code你有没有考虑过把它全部用管道输送到FFmpeg?也就是说,在应用程序中生成原始PCM流,将其传输到FFmpeg中,然后让它处理其余部分?或者,至少是编解码器部分?您也可以考虑检查EdCAST的源代码。