1

多くの異なるオーディオを含む 1 つの WMA ファイルがあります。サウンド ストリームの一部を再生する方法はありますか?

何かのようなもの:

public static void Play(Stream soundStream, long start, long end);
4

2 に答える 2

2

これは、.Net 用のオーディオ ライブラリであるNAudioを使用して実行できる場合があります。

ここの例を使用して、簡単なテスト アプリケーションを起動して試す​​ことができました。WaveSteam.Skip(int seconds) メソッドを使用すると、ファイル内の特定の位置から開始できます。ただし、最終位置を取得する方法を理解できませんでした。以下は、30 秒のマークで wma ファイルを開始する変更されたサンプルです。

    IWavePlayer waveOutDevice = new WaveOut();
    WaveStream mainOutputStream;
    WaveChannel32 volumeStream;

    WaveStream wmaReader = new WMAFileReader(@"F:\My Music\The Prodigy\Music for the Jilted Generation\01 Intro.wma");
    volumeStream = new WaveChannel32(wmaReader);

    mainOutputStream = volumeStream;

    mainOutputStream.Skip(30); //start 30 seconds into the file
    waveOutDevice.Init(mainOutputStream);
    waveOutDevice.Play();

ただし、上記のサンプルでは、​​再生を停止してストリームを破棄するためのクリーンアップ コードが省略されています。それが少し役立つことを願っています。

于 2012-11-14T03:23:35.823 に答える
1

あなたが望む方法ではありません。

これは、WinForms または WPF コンテキスト内にあると想定しています。解決策は、プロジェクトで WMP ActiveX コントロールをホストし、そこに WMA ファイルをロードして、Position/Seek プロパティを設定し、しばらく再生して、Timer が特定のポイントに達したときに停止することです。WMP ActiveX コントロールにタイマー イベントがあるとは思わないので、別のスレッドで監視し、到達したら再生を停止する必要があります。

これはハックですが、動作するはずです。.NET アプリケーション内で ActiveX コントロールをホストすることに慣れている場合は、数時間以内に「機能する」ものを入手できるはずです。64 ビット WMP ActiveX コントロールとの互換性の問題のため、アプリケーションを x86 専用にする必要があることに注意してください。

はるかに困難な代替手段は、アプリケーション内から DirectShow を操作し、WMA ファイルのレンダー グラフを作成して、自分で操作、シーク、および再生を行うことです。DS の学習曲線は非常に急です。これまでに COM を使用したことがない場合は、少なくとも数日から数週間かかると予想してください。

于 2012-11-14T01:41:35.580 に答える