0

私はいくつかのモジュールでwpfプリズムアプリケーションを持っています。1つのモジュールにはフォルダ「sounds」とmysound.wavがあり、wavファイルにはビルドアクションの「resource」値があります(結果dllにパックされています)。このwavファイルを再生したいのですが、有効なURIを作成できません。

Uri(@"pack://application:,,,/MyGame;component/sounds/mysound.wav")

動作していません。 ここに画像の説明を入力してください

4

1 に答える 1

0

「アプリケーション」権限は、コンパイル時に既知のコンテンツを参照するためのものであると書かれています(つまり、アセンブリへの参照があります)。

Prismを使用していて、モジュールが動的にロードされるため、これは「アプリケーション」を使用してモジュールを参照できないことを意味します...(ただし、アセンブリがアプリケーションにロードされている場合は、「アプリケーション」は、そのアセンブリ内のアイテムに解決できます)。

したがって、代わりにWAVファイルを「コンテンツ」としてマークすると、ファイルは緩くなり、「siteoforigin」を使用してアクセスできます(Microsoftリンクの解釈によっては「アプリケーション」も使用できます)。

WAVファイルがビルドディレクトリに出力されるように、「出力ディレクトリにコピー」を「常にコピー」または「新しい場合はコピー」に設定してください。

ただし、「緩い」ファイルは必要ないため、検索は続行されます。


MediaPlayerMediaElementおよびMediaTimeline.Source属性を介してのみメディア「ファイル」の設定を許可します...そしてそれはURIのみを取ります。

「ソース」を...から取得するように設定する方法はありませんStream。もしあれば、Prismモジュールに名前でサウンドファイルを検索/ロードし、それをストリームとして返すメソッドがあった可能性があります。

(Silverlightがストリームからメディアオブジェクトをロードできることを聞きたくない場合があります)。


アセンブリ/モジュールに埋め込まれているWAVファイルのデータをMediaElement、MediaPlayer、またはMediaTimelineに提供するためのその他のアイデアを次に示します。

  • モジュールにWAVファイルを埋め込んでください...ただし、それらを再生する必要がある場合は、WAVコンテンツを一時ファイルに書き込んでから、その一時ファイルを指すようにURIを設定します。

  • Streamsを受け入れることができるMediaElement/MediaPlayerのSilverlightバージョンを試して使用し、Silverlightを使用するようにモジュールを記述してください....WPFアプリケーションでSilverlightをホストするためのさまざまなハックがあります....これはどれだけうまくいくか知らない。

  • Uriで使用できる独自の「プロトコル」を登録します。

    WebRequest.RegisterPrefixを使用してプロトコルプレフィックスを登録し、WebRequestファクトリ(つまり、IWebRequestCreateを実装するもの)を提供します。

    次に、WebRequestから派生して独自のタイプのWebRequestを作成し、そのファクトリにそのインスタンスを返すようにします。実装は、GetResourceStreamおよびGetResourceStreamを介してアクセスできるリソースストリームからのデータの要求を管理します。返されたStreamResourceInfoの.Streamプロパティ。

    次に、たとえばnew Uri( "loadwavfrom://mysound.wav")のようなものを使用できます。

  • おそらく、PackageStoreを使用して...すべてのWAVファイルをパーツとしてストアに追加します...次に、そのパッケージの「パーツ」にURIを取得し、それを.Sourceとして渡します。

  • http://msdn.microsoft.com/en-us/library/3tf230ta

  • http://hackingsilverlight.blogspot.co.uk/2009/12/silverlight-hosting-in-wpf.html


アップデート:

RegisterPrefixとPackageStoreを試しましたが、機能しませんでした。

この投稿を参照してください:

MediaPlayer/MediaTimelineなどはその下でWindowsMediaPlayerを使用しているため、Windows Mediaがネイティブアプリであると考えると、.NETアセンブリ内から「リソース」にアクセスできるかどうかは非常に疑わしいです。

そのため、見た目では、ローカルまたはHTTPベースのURIを経由する場合を除いて、メディアにアクセスする方法がわかりません。

「コンテンツ」ファイルを指す「アプリケーション」パックURIを使用する場合、これは、下のメディアプレーヤーに渡されるときに、ローカルファイルのURLにマップされる必要があります。

したがって、私が考えることができる可能な回避策は次のとおりです。

  • WAVファイルを「リソース」として保持します...ただし、必要に応じてデータを一時ファイルに書き込みます...そしてその一時ファイルをURIとして提供します。

  • WAVファイルを「コンテンツ」としてプロジェクトに配置します...そしてそのファイルに適切なURIを提供します

  • 独自の基本的なローカルHTTPサーバーを作成するか、IISを使用してWAVファイルを「ホスト」します...次に、ファイルにアクセスするためのHTTPベースのURLを使用できます。(私が知っている多くの面倒)。

  • 別のメディアプレーヤーコントロールを使用します。..NETアセンブリ内のリソースへのアクセスをサポートするか、プレーヤーにデータを提供するプロキシを提供できるようにします。あなたはhttp://vlcdotnet.codeplex.com/を見ることができます

于 2012-08-29T18:01:37.253 に答える