19

C# / .Net で圧縮されたサウンド ファイルを再生する、特許に制限されていない移植可能な方法はありますか? プログラムで発生するさまざまなイベントで短い「ジングル」サウンドを再生したいと考えています。

System.Media.SoundPlayerは WAV のみを処理できますが、それらは通常、ダウンロード可能なアプリケーションに埋め込むには大きすぎます。MP3 は特許で保護されているため、完全に管理されたデコーダー/プレーヤーがあったとしても、自由に再配布することはできません。利用可能な最適な形式は OGG Vorbis のようですが、C# Vorbis ライブラリを動作させることができませんでした ( csvorbisで生の PCM を抽出することはできましたが、後でそれを再生する方法がわかりません)。

プロジェクトは少なくとも Windows と Linux で実行する必要があるため、アプリケーションと共にバイナリを配布したり、P/Invoke に依存したりしたくありません。GPL とライセンス互換性がある限り、.Net アセンブリをバンドルしても構いません。

[この質問は、 1 年前のmono-devメーリング リストでのメーリング リスト ディスカッションのフォローアップです]

4

9 に答える 9

8

最後にこのトピックを再検討し、BrokenGlass の助けを借りて WAVE ヘッダーを記述し、csvorbis を更新しました。任意の (互換性のある) Ogg Vorbis ストリームを単純に再生するために渡すことができるOggDecodeStreamを追加しました。System.Media.SoundPlayer使用例:

using (var file = new FileStream(oggFilename, FileMode.Open, FileAccess.Read))
{
  var player = new SoundPlayer(new OggDecodeStream(file));
  player.PlaySync();
}

この場合の「互換性がある」とは、「試してみたらうまくいった」という意味です。デコーダーは完全に管理されており、Microsoft .Net で問題なく動作します。現時点では、MonoSoundPlayerで歪みを引き起こすリグレッションがあるようです。

古い:

System.Diagnostics.Process.Start("fullPath.mp3");

私は驚いていますが、ダイナが言及した方法は実際に機能します. ただし、プログラムで発生するさまざまなイベントで短い「ジングル」サウンドを再生することを考えていました。「ping!」を実行する必要があるたびにユーザーのメディア プレーヤーを起動したくありません。音。

コード プロジェクトのリンクについては、残念ながらこれは P/Invoke ラッパーにすぎません。

于 2008-08-30T15:41:12.307 に答える
2

プロジェクトは少なくとも Windows と Linux で実行する必要があるため、アプリケーションと共にバイナリを配布したり、P/Invoke に依存したりしたくありません。GPL とライセンス互換性がある限り、.Net アセンブリをバンドルしても構いません。

残念ながら、バイナリの配布を回避したり、P/Invoke を回避したりすることは不可能です。とにかく、.net クラス ライブラリはその下で P/Invoke を使用します。マネージ コードは、なんらかの処理を行うために、ある時点でアンマネージ オペレーティング システム API と通信する必要があります。

OGG ファイルを PCM に変換することはマネージド コードで可能ですが、.net にはオーディオのネイティブ サポートがないため、実際には次の 3 つのオプションがあります。

  1. 外部プログラムを呼び出してサウンドを再生します (前述のように)

  2. P/C モジュールを呼び出してサウンドを再生する

  3. P/OS API を呼び出してサウンドを再生します。

(4.) このコードを Windows でのみ実行している場合は、おそらく DirectShow を使用できます。

P/Invoke は、クロス プラットフォームの方法で使用できます http://www.mono-project.com/Interop_with_Native_Libraries#Library_Names

PCM データを取得したら (OGG C ライブラリまたはマネージ コードを使用してhttp://www.robburke.net/mle/mp3sharp/もちろん MP3 にはライセンスの問題があります)、再生する方法が必要になります。残念ながら、.net では、サウンド カードやストリーミング オーディオを再生する方法を直接評価することはできません。起動時に ogg ファイルを PCM に変換し、System.Media.SoundPlayer を使用して、生成された wav ファイルを再生できます。Microsoft が提案する現在の方法では、P/Invoke を使用して OS のサウンド再生 API にアクセスしますhttp://msdn.microsoft.com/en-us/library/ms229685.aspx

PCM サウンドを再生するためのクロスプラットフォーム API は OpenAL であり、www.taoframework.com で OpenAL の c# バインディングを使用して (PCM) サウンドを再生できるはずです。配布されたときに動作するようにアプリケーションを変更しますが、これは先ほど説明したようにやむを得ないことです。

于 2009-06-02T12:07:04.423 に答える
1

'System.Diagnostics'にあるものを呼び出してサウンドを再生することは、私にはかなり悪い考えのように思えます。その関数の意味は次のとおりです。

    //
    // Summary:
    //     Starts a process resource by specifying the name of a document or application
    //     file and associates the resource with a new System.Diagnostics.Process component.
    //
    // Parameters:
    //   fileName:
    //     The name of a document or application file to run in the process.
    //
    // Returns:
    //     A new System.Diagnostics.Process component that is associated with the process
    //     resource, or null, if no process resource is started (for example, if an
    //     existing process is reused).
    //
    // Exceptions:
    //   System.ComponentModel.Win32Exception:
    //     There was an error in opening the associated file.
    //
    //   System.ObjectDisposedException:
    //     The process object has already been disposed.
    //
    //   System.IO.FileNotFoundException:
    //     The PATH environment variable has a string containing quotes.
于 2008-09-24T23:36:14.597 に答える
1

すべてのオーディオAPIの母であるfmodを見てください。

http://www.fmod.org/index.php/download#FMODExProgrammersAPIについてお気軽に夢見てください

于 2010-03-19T01:55:03.383 に答える
0

まあ、それは特定の国の特許関連の法律に依存しますが、私が知る限り、特許に違反せずにmp3デコーダーを書く方法はありません。あなたの問題に最適なクロスプラットフォームのオープンソースソリューションはGStreamerだと思います。急速に進化するc#バインディングがあります。ただし、WindowsでGStreamerを使用および構築することは、簡単な作業ではありません。これが良い出発点です。Bansheeプロジェクトはこのアプローチを使用していますが、Windowsではまだ実際には使用できません(ただし、ほぼ機能するナイトリービルドがいくつかあります)。FMODも良い代替手段です。残念ながら、それはオープンソースではなく、そのAPIはどういうわけかCスタイルであることがわかりました。

于 2010-05-23T11:57:23.707 に答える
0

XNA Audio API は .net/c# アプリケーションで適切に機能し、このアプリケーションでうまく機能します。イベントベースのトリガーと、複数のサウンドの同時再生。まさにあなたが望むもの。あ、圧縮も。

于 2010-05-20T13:42:23.450 に答える
0

これがまだ関連しているかどうかはわかりません。最も簡単な解決策は、C# で記述されたマネージド オープン ソース オーディオ API であるNAudioを使用することです。もう 1 つの試みは、ffmpeg を利用して、ffplay.exeへのプロセスを作成することです(適切なバイナリは共有ビルドの下にあります)。

于 2011-08-02T14:55:40.027 に答える
0

オープン ソースの純粋な C# vorbis デコーダーが利用可能です。

http://anonsvn.mono-project.com/viewvc/trunk/csvorbis/

于 2010-05-24T02:35:20.727 に答える
-1

プレイ処理に何か他のものを使用せずにこれを行う方法はありません。

System.Diagnostic を使用すると、外部ソフトウェアが起動されます。プログラムで Y が発生したときに、バックグラウンドで X サウンド ファイルを再生したいだけですよね?

興味深い質問のように見えるため、投票しました。:D

于 2009-10-18T23:01:29.923 に答える