3

NAudio ライブラリを使用してリソースから MP3 ファイルを単純に再生しようとしている Windows フォーム アプリケーションがあります。

どうにかしてファイルをストリーミングする必要があると思います。これは NAudio の例です。残念ながら、ファイル パス文字列を引数として受け入れます。

private WaveStream CreateInputStream(string fileName)
{
    WaveChannel32 inputStream;
    if (fileName.EndsWith(".mp3"))
    {
        WaveStream mp3Reader = new Mp3FileReader(fileName);
        inputStream = new WaveChannel32(mp3Reader);
    }
    else
    {
        throw new InvalidOperationException("Unsupported extension");
    }
    volumeStream = inputStream;
    return volumeStream;
}

ファイルを再生するには:

waveOutDevice = new WaveOut();
mainOutputStream = CreateInputStream("C:\\song.mp3");

通常のファイルでは正常に動作しますが、リソースにあるファイルについてはどうすればよいですか? ありがとうございました。

4

2 に答える 2

9

クラスはMp3FileReader、ファイル名またはSystem.IO.Stream. 必要なのは、MP3 リソースをストリームとして読み取ることです。その方法は、リソースをどのように追加したかによって異なります。

ファイルを使用して追加されたリソースProperties/Resources.resx(アプリケーション プロパティ ダイアログで管理) には、Properties.Resourcesオブジェクトからアクセスできます。ここでは、既知のリソース タイプ (画像など) を適切なタイプで表す必要がありますが、MP3 ファイルは としてアクセスされbyte[]ます。MemoryStreamリソースからを作成し、それを使用して次のMp3FileReaderように構築できます。

MemoryStream mp3file = new MemoryStream(Properties.Resources.MP3file);
Mp3FileReader mp3reader = new Mp3FileReader(mp3file);

他のリソース メソッドは、ストリームを取得する方法の詳細が異なりますが、それ以外は基本的に同じです。build アクションを使用して MP3 ファイルをプロジェクトに追加する場合はEmbedded Resource、次を使用できます。

public Stream GetResourceStream(string filename)
{
    Assembly asm = Assembly.GetExecutingAssembly();
    string resname = asm.GetName().Name + "." + filename;
    return asm.GetManifestResourceStream(resname);
}

...
Stream mp3file = GetResourceStream("some file.mp3");
Mp3FileReader mp3reader = new Mp3FileReader(mp3file);

WPF リソースは、pack:...uri 形式とApplication.GetResourceStream.

いずれの場合も、もちろん、読み終わったら Stream を破棄する必要があります。

于 2013-08-19T00:31:35.547 に答える