質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

3787閲覧

WPFでリソース(ローカルパス)からwavを再生したい(SoundPlayer)

paseri528

総合スコア7

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1グッド

1クリップ

投稿2021/12/24 07:43

VisualC#初心者です。
こちらのサイトで紹介されているように、WPFにてSoundPlayerを用いwavの効果音を再生したいのですが、紹介されている例では絶対パス(C:~)で引数のlocationを設定しているものばかりで、ローカルパス(リソース?)から指定する方法がわかりません。
それっぽい記述は色々試してみたのですがどれもエラーになるor音が出ないです。
ご教授いただければ幸いです。

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/12/24 07:51

リソースデータの抽出までは出来てるんでしょうか?
paseri528

2021/12/24 08:06

すみません、初心者なものでリソースファイル自体についてもよくわかっておらず扱えていません。 Resouceフォルダを作ってwavファイルを置きはしたのですが…
BeatStar

2021/12/24 09:50

リソースって……違うでしょ…… リソースと言えば、一般的(?)には「実行ファイルやDLLに埋め込まれたもの」です。たとえばアイコンとかそういうの。 単純に同梱のファイルを読み込む場合は、「ファイルがそのパスにないとできない」です。 それと、「それっぽい記述は色々試してみたのですがどれもエラーになるor音が出ないです」というのはやめましょう。エラ―メッセージは暴言ではありません。ランダムに出力されるでたらめなものでもありません。エラ―メッセージはコンパイラ等からのメッセージです。メッセージにヒントが隠されています。 質問者さんは今、何か作るよりも先に基礎からやった方がよさそうです。
paseri528

2021/12/24 10:44

すみません、リソースの定義は知ってますがwpfでの仕様がよくわかっていません。 エラーについても説明が雑でしたがファイルの場所を特定できない旨なので質問と同義だと思います。ヒントを見てわからないから質問しているのですが???? 質問に答えて頂けると嬉しいです????
BeatStar

2021/12/24 11:00 編集

> ヒントを見てわからないから質問しているのですが まず、ご自分の質問を第三者的視点で読んでみてください。つまり、ご兄弟か誰かが急に質問者さんに質問してきたとかと考えてみてください。「えーっと、どのようにやったの?」とか思いませんか? 回答者は質問者ではありません。同じ環境に無いので提示された情報からしかわかりません。 ましてや他のユーザはネットを介しています。 それと、ディレクトリの構成はどのようになっていますか? どこにどういう風に何があるのかを提示してください。例えば コマンドプロンプトでの treeコマンドでの結果とかを出すとか。
paseri528

2021/12/24 11:06

すみません、試行結果周りはあまり説明が足りてませんでした。 時間ができ次第追記します????
BeatStar

2021/12/24 22:48

(あ、普通にリソースファイルとして使いたいってことだったんですね…余計なローカルってのが違う意味にしか読めなかった…)
guest

回答2

0

ベストアンサー

ローカルパス(リソース?)から指定する方法がわかりません。

まず結論から(画像なんかはまた話が違ってきます)

exeに埋め込みたい場合:

Propertiesの中のResources.resxを開いて、wavファイルをドラッグ&ドロップで入れてください。
Resources.resx

Propertiesがない場合(.NET Coreや.NET 5以降だとデフォルトで作られません)
Propertiesフォルダを作って中に「リソース ファイル」Resources.resxを新しい項目から追加します。

↓のように使用します。

cs

1new SoundPlayer(Properties.Resources.PropertiesResources).Play();

相対パスで指定したい場合:

wavファイルのプロパティでビルドアクションをなしかコンテンツにして、「出力ディレクトリにコピー」を、「常にコピーする」または「新しい場合にコピーする」としてください。
エクスプローラー

(カレントディレクトリを変更しなければ)↓のように使用します。

cs

1new SoundPlayer("Resources/None.wav").Play();

わたしもこのあたり結構難しいなと感じていたのでまとめてみました。

ビルドアクション - リソース(Resource)

WPFで新たに入った埋め込み方法。
埋め込みリソースと仕組みは同じだが、xamlから簡単に読めるようになっている。
画像なんかはこれ一択でしょう。

ビルドアクション - コンテンツ(Content)

埋め込まれません。
「出力ディレクトリにコピー」を、「常にコピーする」または「新しい場合にコピーする」にしないと意味がない。
カレントディレクトリを変更していなければ、相対パスで読める。
なし(None)との違いはよくわからない^^;

ビルドアクション - なし(None)

埋め込まれません。
「出力ディレクトリにコピー」を、「常にコピーする」または「新しい場合にコピーする」にしないと意味がない。
カレントディレクトリを変更していなければ、相対パスで読める。

ビルドアクション - 埋め込みリソース(Embedded Resource)

昔からある埋め込み方法。
ビルドアクションでわざわざこれを選ぶ理由はない?

Properties.Resources.resx

Windows フォームでリソースといえばこれ。
埋め込みリソースになるが専用のGUIがついていてわかりやすいし、アクセスが簡単になるように自動でコード生成される。
xamlで使うつもりがないのであれば、これでいいのかな?


アプリケーションのリソース ファイル、コンテンツ ファイル、およびデータ ファイル - WPF .NET Framework | Microsoft Docs

One more time about Resource vs. EmbeddedResource – Ivan Krivyakov

xml

1<Window 2 x:Class="Questions375405.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 Width="800" 6 Height="450"> 7 <StackPanel> 8 <Button Click="ResourceButton_Click" Content="Resource" /> 9 <Button Click="ContentButton_Click" Content="Content" /> 10 <Button Click="NoneButton_Click" Content="None" /> 11 <Button Click="EmbeddedResourceButton_Click" Content="EmbeddedResource" /> 12 <Button Click="PropertiesResourcesButton_Click" Content="PropertiesResources" /> 13 </StackPanel> 14</Window>

cs

1using System; 2using System.Media; 3using System.Reflection; 4using System.Windows; 5 6namespace Questions375405 7{ 8 public partial class MainWindow : Window 9 { 10 public MainWindow() 11 { 12 InitializeComponent(); 13 14 //Environment.CurrentDirectory = @"C:\"; 15 } 16 17 // ビルドアクション - リソース(Resource) 18 private void ResourceButton_Click(object sender, RoutedEventArgs e) 19 { 20 var uri = new Uri("Resources/Resource.wav", UriKind.Relative); 21 var info = Application.GetResourceStream(uri); 22 new SoundPlayer(info.Stream).Play(); 23 } 24 25 // ビルドアクション - コンテンツ(Content) 26 private void ContentButton_Click(object sender, RoutedEventArgs e) 27 { 28 var uri = new Uri("Resources/Content.wav", UriKind.Relative); 29 var info = Application.GetContentStream(uri); 30 new SoundPlayer(info.Stream).Play(); 31 32 // カレントディレクトリを変更しないのであればこれでいい 33 //new SoundPlayer("Resources/Content.wav").Play(); 34 } 35 36 // ビルドアクション - なし(None) 37 private void NoneButton_Click(object sender, RoutedEventArgs e) 38 { 39 var uri = new Uri("Resources/None.wav", UriKind.Relative); 40 var info = Application.GetRemoteStream(uri); 41 new SoundPlayer(info.Stream).Play(); 42 43 // カレントディレクトリを変更しないのであればこれでいい 44 //new SoundPlayer("Resources/None.wav").Play(); 45 } 46 47 // ビルドアクション - 埋め込みリソース 48 private void EmbeddedResourceButton_Click(object sender, RoutedEventArgs e) 49 { 50 var assembly = Assembly.GetExecutingAssembly(); 51 var stream = assembly.GetManifestResourceStream("Questions375405.Resources.EmbeddedResource.wav"); 52 new SoundPlayer(stream).Play(); 53 } 54 55 // Properties.Resources.resx 56 private void PropertiesResourcesButton_Click(object sender, RoutedEventArgs e) 57 { 58 new SoundPlayer(Properties.Resources.PropertiesResources).Play(); 59 } 60 } 61}

xml

1<Project Sdk="Microsoft.NET.Sdk"> 2 3 <PropertyGroup> 4 <OutputType>WinExe</OutputType> 5 <TargetFramework>net6.0-windows</TargetFramework> 6 <Nullable>enable</Nullable> 7 <UseWPF>true</UseWPF> 8 </PropertyGroup> 9 10 <ItemGroup> 11 <None Remove="Resources\Content.wav" /> 12 <None Remove="Resources\EmbeddedResource.wav" /> 13 <None Remove="Resources\Resource.wav" /> 14 </ItemGroup> 15 16 <ItemGroup> 17 <Content Include="Resources\Content.wav"> 18 <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 19 </Content> 20 </ItemGroup> 21 22 <ItemGroup> 23 <EmbeddedResource Include="Resources\EmbeddedResource.wav" /> 24 </ItemGroup> 25 26 <ItemGroup> 27 <Resource Include="Resources\Resource.wav" /> 28 </ItemGroup> 29 30 <ItemGroup> 31 <Compile Update="Properties\Resources.Designer.cs"> 32 <DesignTime>True</DesignTime> 33 <AutoGen>True</AutoGen> 34 <DependentUpon>Resources.resx</DependentUpon> 35 </Compile> 36 </ItemGroup> 37 38 <ItemGroup> 39 <EmbeddedResource Update="Properties\Resources.resx"> 40 <Generator>ResXFileCodeGenerator</Generator> 41 <LastGenOutput>Resources.Designer.cs</LastGenOutput> 42 </EmbeddedResource> 43 </ItemGroup> 44 45 <ItemGroup> 46 <None Update="Resources\None.wav"> 47 <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 48 </None> 49 </ItemGroup> 50 51</Project>

投稿2021/12/24 11:15

編集2023/08/15 09:52
TN8001

総合スコア9862

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

paseri528

2021/12/24 16:04

色々な方法でご提示いただきありがとうございます!ビルドアクションについて調べてもよくわからなかったので解説すごく助かりました! 後から変更しやすいように相対パス方式にしました 相対パスは出力ディレクトリにコピーしないとダメだったんですね…無事できましたm(__)m Properties.Resources見つからないと思ったら作らないとダメだったんですね! すごく理解が深まりました、ありがとうございますm(__)m
guest

0

とりあえず、リソースに埋め込む方法と取り出し方は下記の記事を読んでみてください。
画像やテキストファイルを実行ファイルに埋め込む

アセンブリからGetManifestResourceStreamでStreamを取得できるので、あとはそれをSoundPlayerクラスに渡せば再生出来ます。

リソースから再生する簡単なサンプルを作成してみました。
音声は、プロジェクト内に"Sound"というフォルダを作成し、その中に"test.wav"を配置してビルドアクションを"埋め込みリソース"に設定しています。

C#

1using System.Windows; 2 3namespace WpfApp1 4{ 5 public partial class MainWindow : Window 6 { 7 private System.Media.SoundPlayer _SoundPlayer = new(); 8 9 public MainWindow() 10 { 11 InitializeComponent(); 12 } 13 14 private void Button_Click(object sender, RoutedEventArgs e) 15 { 16 var asm = System.Reflection.Assembly.GetExecutingAssembly(); 17 var strm = asm.GetManifestResourceStream($"{asm.GetName().Name}.Sound.test.wav"); 18 _SoundPlayer.Stream = strm; 19 _SoundPlayer.Play(); 20 } 21 } 22}

投稿2021/12/24 11:05

編集2021/12/24 11:08
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

paseri528

2021/12/24 15:59

サンプルまで用意していただきありがとうございます!埋め込みリソースはStreamにアクセスするのですね 参考になります、ありがとうございましたm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問