多趣味まるの日常

跡取り息子を辞めたスーパー多趣味人間の日常や便利アイテムの紹介

C# リソースファイルのwavファイルをDirectX.AudioVideoPlaybackで再生できるようになった話

こんにちは。まるです。

 

プログラミングやらない人にとってはそもそも見ようと思わない記事かもしれませんね汗

 

私のブログではなるべくプログラムに興味ない人でも読めるような記事を心がけようと思ってます。

 

最後にもちじょーの写真も入れようと思うのでお楽しみに。

 

 

タイトルの件ですが、まずどういうことかといいますと、

 

 

前回の日記でほかの人に対局時計アプリをテストしてもらったらエラーになっちゃったという記事を書いたかと思います。

 

 

これが解決しましたよというお話です。

 

 

そもそも何が問題だったかというと、DirectXというよくゲームとかやる方にはおなじみのものがあるのですが、

 

そのDirectXに音楽を再生したり、動画を再生したりできるようなものがあるんですね。

 

 

で、それを使って対局時計の音声を再生したかったわけです。

 

 

ただ人様のPCで使えなかったので、その相手のPCのDirectXのバージョンが古いからとか、そういう問題だと思っていたのですが、

 

実際はそんなことはなく、単純に再生させるファイルの指定の仕方が悪かったという、完全に私のせいでしたorzごめんなさい。

 

 

もともとどう指定していたかというと、

 

Audio(c:\Users\〇〇〇\....)   //アプリの各フォルダがある同じ場所

 

のようにファイルパスを指定していました。

 

 

私の勝手なイメージでビルド(アプリにしてまとめる処理)する際に勝手にそこがなんらかうまい具合にその音ファイルを指定してくれるものだと思っていたのですが、

 

パスはパスでしたorz

 

なので私のPCにあるフォルダの、そのフォルダの中の音ファイル(=wav)でしかないので人のPCに渡ったら再生されるわけがなくエラーで落ちるということでした。

 

 

で!

 

 

じゃあどうしようかと思ったときに思いつく方法は、

 

1 絶対に変わらないパスを指定できないか

2 アプリがあるパスを何らかの方法で取得できないか

3 そもそもアプリ自体にwavファイルを組み込めないのか

 

この3つでした。

 

結論から言うとすべて可能でした。

 

1はアプリが起動したときに、一時フォルダ=(Tempフォルダ(必ずwindowsならあるフォルダで一時的なファイルを保存する場所))を作ってしまって、そこのパスを取得するという方法。

 

2はexeファイル(対局時計を起動させるファイル)がある場所を取得して、そこに音フォルダをあらかじめ入れておくという方法です。

 

3はそのままずばりですが、exeファイル自体に音ファイルを取り込んで組み込んでしまうという方法です。

 

 

結論を言うと3が可能になったので、フォルダの中のファイルを変更されたり、消されたり、名前を変更されたりする恐れがなくなったのでこれが一番いい方法でした。

 

 

C#やってる人で困ってる人用に一応コード貼り付けておきます。

※3か月未満の経験者が書いたコードなので直して使ってください。

 

//リソースファイル(wav)はStreamで保存されている

Stream streamStartGame = Properties.Resources.StartGame;

//文字列で保存されている(?)ためそれを書きだす。

byte[] bufferStartGame = new Byte[streamStartGame.Length];

//読み込む
streamStartGame.Read(bufferStartGame, 0, (int)bufferStartGame.Length);
streamStartGame.Close();

//一時ファイルに書き込む

FileStream FSStartgame = new FileStream(tempNameStartGame, FileMode.Create);
FSStartgame.Write(bufferStartGame, 0, (int)bufferStartGame.Length);
FSStartgame.Close();

 

var playStartGame = new Audio(tempNameStartGame);


playStartGame.Play();

 

 

こんな感じです。

 

 

これで音源が「秒読みちゃん」であることを除いては問題はなくなり完成となりました。

 

 

あとはunityかXamarinを覚えてそちらに導入できればなと思ってます。

 

 

www.youtube.com

 ※動画音小さかったです汗 ごめんなさい。

 

 

 

f:id:maruUsual:20200301075142j:plain

 

かわいいもちくん貼っておきます。

 

 

それではまた