【问题标题】:C# BroadCast Mp3 File To ShoutCast ServerC# BroadCast Mp3 文件到 ShoutCast 服务器
【发布时间】:2017-08-31 02:54:03
【问题描述】:

我正在尝试制作一个像 Auto Dj 这样的收音机来播放 Mp3 文件列表,就像在收音机中发生的事情一样。 我尝试了很多工作,但最后我想到将mp3文件发送到shoutcast服务器并播放该服务器的输出我的问题是我不知道怎么做 我已经尝试使用 bass.radio 来使用 bass.net,这就是我的代码

    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 已连接,我也无法将我的文件流式传输到服务器。 所以如果我能做任何代码解决方案或任何其他事情。

【问题讨论】:

    标签: c# .net shoutcast internet-radio


    【解决方案1】:

    我已经很多年没有使用 BASS,所以我不能就你那里的代码给你具体的建议。但是,我想告诉你你需要做什么的过程的要点......它可能会帮助你开始。

    由于您的文件是 MP3 格式,因此可以将其直接发送到服务器并在接收端收听。但是,这样做存在一些问题。首先是速率控制。如果您只是传输文件数据,您可能会在 10 秒的时间内发送 5 分钟的数据。这最终会导致失败,因为客户端不会缓冲太多数据,并且它们将断开连接。另一个问题是您的 MP3 文件中通常包含 ID3 标签形式的额外数据。有些玩家会忽略这一点,有些则不会。最后,您的某些文件的采样率可能与其他文件不同,因此即使您对发送进行速率限制,播放器在以不同的采样率点击文件时也会中断。

    需要发生的是生成新的流。管道看起来像这样:

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

    此外,原始 PCM 音频步骤需要以实时速率运行。虽然您的计算机绝对可以比实时更快地解码和编码,但它需要实时运行,以便玩家可以实时收听。

    【讨论】:

    • 我很清楚这一点,但我的问题是关于如何创建这个管道需要一些代码示例来说明如何从源文件中制作 mp3 流
    • @Code 您是否考虑过通过 FFmpeg 进行管道传输?也就是说,在您的应用程序中制作原始 PCM 流,将其通过管道传输到 FFmpeg,然后让它处理其余部分?或者,至少是编解码器部分?您也可以考虑查看 EdCast 的源代码。 github.com/DustyDrifter/AltaCast
    猜你喜欢
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    相关资源
    最近更新 更多