C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

埋め込みリソースのファイルパスを取得するには? /boryo (19/05/15(Wed) 12:18) #90969
Re[1]: 埋め込みリソースのファイルパスを取得するには? /Hongliang (19/05/15(Wed) 12:39) #90970
Re[1]: 埋め込みリソースのファイルパスを取得するには? /魔界の仮面弁士 (19/05/15(Wed) 14:03) #90973
  └ Re[2]: 埋め込みリソースのファイルパスを取得するには? /魔界の仮面弁士 (19/05/15(Wed) 14:16) #90974
    └ Re[3]: 埋め込みリソースのファイルパスを取得するには? /boryo (19/05/15(Wed) 14:54) #90980
      └ Re[4]: 埋め込みリソースのファイルパスを取得するには? /魔界の仮面弁士 (19/05/15(Wed) 15:07) #90981


親記事 / ▼[ 90970 ] ▼[ 90973 ]
■90969 / 親階層)  埋め込みリソースのファイルパスを取得するには?
□投稿者/ boryo (1回)-(2019/05/15(Wed) 12:18:03)

分類:[.NET 全般] 

http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=2323

10年以上前の古い記事ですが
このページと全く同じ質問です。


VBを使っており、
https://dobon.net/vb/dotnet/programing/playmidifile.html
mciSendString関数を使って、
埋め込みリソースのMP3を再生したいと考えています。

ストリームとして読み込むには
myAssembly.GetManifestResourceStream("WindowsApplication1.xxx.wav")

が使えますが、
ファイルパスとして読み込むにはどうしたら良いですか?

最新のバージョンでも
この一時ファイルとして出力する方法を使うしかないのでしょうか?



[ □ Tree ] 返信 編集キー/

▲[ 90969 ] / 返信無し
■90970 / 1階層)  Re[1]: 埋め込みリソースのファイルパスを取得するには?
□投稿者/ Hongliang (801回)-(2019/05/15(Wed) 12:39:45)
MCIを使う限りは、一時ファイルにするしかありません。
最新バージョンも何も、MCIはずいぶん昔から更新されていないはずですし。

異なる音楽再生ライブラリにはメモリから読み込むことができるものもあります。
例えば、NuGetから参照できるNAudioなど。
[ 親 90969 / □ Tree ] 返信 編集キー/

▲[ 90969 ] / ▼[ 90974 ]
■90973 / 1階層)  Re[1]: 埋め込みリソースのファイルパスを取得するには?
□投稿者/ 魔界の仮面弁士 (2163回)-(2019/05/15(Wed) 14:03:45)
No90969 (boryo さん) に返信
> 埋め込みリソースのMP3を再生したいと考えています。

MP3 形式に拘らないのであれば、WAV 形式を採用したほうがお手軽です。
これならば、リソースやメモリーからの読み取りも可能です。

VB なら My.Computer.Audio.Play メソッドを通じて簡単に再生できますし、
C# などからでも、PlaySound API でメモリ上からの再生が可能です。


> この一時ファイルとして出力する方法を使うしかないのでしょうか?

メモリ上のデータを MCI で再生する方法は、サポート技術情報 155360 の
『SDK32:MCI を使って AVI/WAVE ファイルをメモリ上で演奏する』
として公開されていました。VB 向けの記事では無いですけれどね。

上記のオンラインでの公開はすでに終了しているようですが、
 https://www.microsoft.com/ja-jp/download/details.aspx?id=20955
で提供されているオフライン リファレンスをダウンロードすれば、
 ms-help://MS.MSDNQTR.v90.ja/ja_kbwin32sdk/win32sdk/155360.htm
のアドレスにて引き続き閲覧できます。


試したことは無いので保証は出来かねますが、ざっくり書くとこんな感じでしょうか。


(1) 3 文字の半角大文字で構成される未知の拡張子、たとえば "BRY" を用意しておきます。

(2) それを mmioFOURCC("B"c, "R"c, "Y"c, " "c) として
 32bit 整数な FOURCC (Four-character code) に変換しておきます。

(3) MCI の OPEN コマンドにて、"OPEN TEST.BRY+ TYPE MPEGVideo ALIAS EXAMPLE" のように、
 拡張子の後ろに "+" を付与しておきます。
 + がついている場合、mmioOpen はファイルをオープンせず、かわりに
 カスタム入出力プロシージャを通るようになります。

(4) mmioInstallIOProc API で、(2) の FOURCC を指定して、コールバック先となる
 カスタム入出力プロシージャのデリゲートを渡しておきます。
 mmioInstallIOProc(FOURCC, New IOProcDelegate(AddressOf IOProc), MMIO_INSTALLPROC Or MMIO_GLOBALPROC)

(5) 上記で渡したコールバックメソッドにて、第 2 引数が MMIOM_READ だった時に、
 オーディオデータを、台を lParam1 の IntPtr に対して書き込めば OK です。
 データ位置は第 1 引数(LPMMIOINFO) の .lDiskOffset で示されるので、
 メソッドを Return する前に、lDiskOffset を更新しておく必要があります。


mmioInstallIOProc を用いた C++ な実装例が下記にあります。
http://mrkk.ciao.jp/memorandom/aviplaybackfrommemory/step1_mci.html
[ 親 90969 / □ Tree ] 返信 編集キー/

▲[ 90973 ] / ▼[ 90980 ]
■90974 / 2階層)  Re[2]: 埋め込みリソースのファイルパスを取得するには?
□投稿者/ 魔界の仮面弁士 (2164回)-(2019/05/15(Wed) 14:16:07)
2019/05/15(Wed) 14:28:23 編集(投稿者)

No90973 (魔界の仮面弁士) に追記
> メモリ上のデータを MCI で再生する方法は、サポート技術情報 155360 の
> 『SDK32:MCI を使って AVI/WAVE ファイルをメモリ上で演奏する』
> として公開されていました。VB 向けの記事では無いですけれどね。

Internet Archive に英語版の記事がアーカイブされていました。
https://web.archive.org/web/20121113011951/http://support.microsoft.com/kb/155360

(日本語版が読みたい場合は、先述のオフラインライブラリをご覧ください)



> 試したことは無いので保証は出来かねますが、ざっくり書くとこんな感じでしょうか。

ザックリ解説ということで、MMIOM_READ 以外のメッセージの処理方法や、
コールバックメソッドの削除などの解説は省略しています。

mmioInstallIOProc を使った方法については、サポート技術情報などの
実際のサンプルを読んでもらった方が確実かと思います。
(VB 向けに書きおこされた記事が見つかるかどうかは分かりませんが)

---
追記:

VB5 向けのサンプル
https://jeffpar.github.io/kbarchive/kb/173/Q173668/

PowerBASIC 向けのサンプル
https://forum.powerbasic.com/forum/user-to-user-discussions/source-code/742948-mcisendstring-with-callback

C# 構文での質問
https://social.msdn.microsoft.com/Forums/en-US/fa2171df-4d0d-42f9-af49-80eec0d84ef9/callback-function-in-mci?forum=csharpgeneral
[ 親 90969 / □ Tree ] 返信 編集キー/

▲[ 90974 ] / ▼[ 90981 ]
■90980 / 3階層)  Re[3]: 埋め込みリソースのファイルパスを取得するには?
□投稿者/ boryo (2回)-(2019/05/15(Wed) 14:54:00)
ありがとうございます。

MP3にこだわってはおらず、
音量を調整できる機能を必要としています。

System.Media.SoundPlayer
の方法だと簡単なコードでは音量調節できないようだったので、
別の方法を模索していました。

My.Computer.Audio.Play メソッドやPlaySound API
だと音量調節可能でしょうか?


[ 親 90969 / □ Tree ] 返信 編集キー/

▲[ 90980 ] / 返信無し
■90981 / 4階層)  Re[4]: 埋め込みリソースのファイルパスを取得するには?
□投稿者/ 魔界の仮面弁士 (2166回)-(2019/05/15(Wed) 15:07:57)
2019/05/15(Wed) 15:09:19 編集(投稿者)

No90980 (boryo さん) に返信
> System.Media.SoundPlayer
> の方法だと簡単なコードでは音量調節できないようだったので、
> 別の方法を模索していました。

System.Media.SoundPlayer の場合は、
下記の WaveStream クラスの実装を使えば音量を下げられます。
(元の音よりも大きくすることはできません)
https://smdn.jp/programming/netfx/tips/set_volume_of_soundplayer/


> My.Computer.Audio.Play メソッドやPlaySound API
> だと音量調節可能でしょうか?

それらでは出来ませんが、Hongliang さんが紹介されている NAudio であれば可能ですね。
https://github.com/naudio/NAudio
https://stackoverflow.com/questions/20302117/naudio-change-volume-in-runtime
[ 親 90969 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -