CSCore - 从FileStream或MemoryStream播放音频

时间:2016-05-19 21:04:40

标签: audio cscore

使用CSCore,如何从FileStreamMemoryStream播放WMA或MP3(与使用string获取文件路径或网址的方法不同。)

1 个答案:

答案 0 :(得分:4)

由于GetCodec(Stream stream, object key) - 类的CodecFactory - 重载是内部的,您可以手动执行相同的步骤并直接选择解码器。实际上,CodeFactory只是一个自动确定解码器的辅助类,所以如果你已经了解了编解码器,你可以自己做。 在内部,当传递文件路径时,CSCore会检查文件扩展名,然后打开FileStream(使用File.OpenRead),并将其处理到所选解码器。

您需要做的就是为您的编解码器使用特定的解码器。

对于MP3,您可以使用继承自DmoMP3Decoder DmoStreamIWaveSource来实现Codeplex - 您需要处理的接口作为声源。

以下是来自WmaDecoder上的文档的调整后的示例:

public void PlayASound(Stream stream)
{
    //Contains the sound to play
    using (IWaveSource soundSource = GetSoundSource(stream))
    {
        //SoundOut implementation which plays the sound
        using (ISoundOut soundOut = GetSoundOut())
        {
            //Tell the SoundOut which sound it has to play
            soundOut.Initialize(soundSource);
            //Play the sound
            soundOut.Play();

            Thread.Sleep(2000);

            //Stop the playback
            soundOut.Stop();
        }
    }
}

private ISoundOut GetSoundOut()
{
    if (WasapiOut.IsSupportedOnCurrentPlatform)
        return new WasapiOut();
    else
        return new DirectSoundOut();
}

private IWaveSource GetSoundSource(Stream stream)
{
    // Instead of using the CodecFactory as helper, you specify the decoder directly:
    return new DmoMp3Decoder(stream);

}

对于WMA,您可以使用https://github.com/filoe/cscore/blob/master/CSCore/Codecs/CodecFactory.cs#L30。 您应该检查不同解码器的实现:Mp3MediafoundationDecoder

确保没有异常被抛出并使用另一个解码器({{3}})处理它们,如链接的源代码中所示。也不要忘记最后处理你的小溪。