DOBON.NET DOBON.NETプログラミング掲示板過去ログ

オーディオ切替の方法(WMPLib.WindowsMediaPlayer)

環境/言語:[Windows8/VB]
分類:[.NET]

「MIDI、MP3などの音楽ファイルを再生する」の情報を参考に
WMPLib.WindowsMediaPlayerを使った動画再生を試みています。

オーディオ切替機能の実装を考えており
「WindowsMediaPlayer SDK オーディオ切替」等を
キーワードにググっていますがそれらしい情報がみあたらず
行き詰まっている状態です。

オーディオの一覧取得とオーディオ切替の方法がわかれば
目的の機能の実装は可能と考えておりますが
何か情報をご存じの方がいらっしゃれば情報を頂けないでしょうか。
> オーディオ切替機能の実装を考えており
> 「WindowsMediaPlayer SDK オーディオ切替」等を
> キーワードにググっていますがそれらしい情報がみあたらず
> 行き詰まっている状態です。
>
> オーディオの一覧取得とオーディオ切替の方法がわかれば
> 目的の機能の実装は可能と考えておりますが
> 何か情報をご存じの方がいらっしゃれば情報を頂けないでしょうか。

  切替って何を指し示しているのでしょうか?
  出力先のデバイス(オーディオデバイスが複数ある?)を切り替える
  と言う話であれば、WMPLib.WindowsMediaPlayerが搭載していなけれ
  ば対応できません。

  デバイスの列挙と言う面では、折角dobonさんのサイトに投稿されて
  いるんですから、Tipsの方を見て下さい。
  ttp://dobon.net/vb/dotnet/system/getservices.html
  サンプルは、サービスの列挙になっていますが、デバイスの列挙も
  行えますので・・・

  WMI を使って、デバイスの列挙もできます。
  ttp://uchukamen.com/Programming/WMI/

  Win32_SoundDevice を探すことになります。
  ttp://www.wmifun.net/sample/win32_sounddevice.html
  ※ コードは、VB6用です。ご注意ください。

以上。参考まで
>切替って何を指し示しているのでしょうか?
なるほど。
読み方によってはオーディオデバイスの列挙と取れるかもしれませんね。
ご指摘ありがとうございます。

主旨はWindows Media Playerでの
「オーディオおよび言語トラック」→音声トラック選択 と
同等の操作をVBのコードから行うことを目的としております。

ActiveXコントロールのWindows Media Player Controlを
フォームに追加し動画の再生を行うまでは実装できましたが
そこから「オーディオおよび言語トラック」を
Windows Media Player Controlのコンテキストメニュ等使わず
コードから直接指定をして切り替えたいと考えています。
■No32017に返信(くるりさんの記事)
> 主旨はWindows Media Playerでの
> 「オーディオおよび言語トラック」→音声トラック選択 と
> 同等の操作をVBのコードから行うことを目的としております。

未経験なので外しているかもしれませんが、ざっと検索してみた感じだと、
Windows Media Player なら、このあたりだと思います。
http://msdn.microsoft.com/en-us/library/windows/desktop/dd563194.aspx

XAML アプリの MediaElement ならこのあたりかな? 今回は関係ありませんが。
http://msdn.microsoft.com/ja-jp/library/windows/apps/hh871378.aspx
魔界の仮面弁士さん、情報のご提供ありがとうございます。

IWMPControls3の使い方がいまいちよくわからないので試行錯誤してみます。
使い方がわかればgetAudioLanguageIDやgetAudioLanguageDescriptionで
情報の取得ができ、一歩前進ができそうな気がします。

さらにMediaElementクラスのSetAudioLanguageと同等の命令が見つかれば
一気に解決するかもしれません。

デスクトップアプリの開発でMediaElementクラスが使えれば
そちらを使ったほうが良いという結論に至るかもしれませんが
現時点ではWindows Media Playerでの解決を目指してみます。

とりあえず、糸口は見えてきましたが
確認に時間がかかるかと思いますので、結果は後ほどご報告いたします。
2013/12/22(Sun) 19:41:01 編集(投稿者)

■No32019に返信(くるりさんの記事)
> IWMPControls3の使い方がいまいちよくわからないので試行錯誤してみます。
同インターフェイスの currentPositionTimecode プロパティの
使用例が参考になりそうです。恐らくは、コントロールの
Ctlcontrols プロパティを受け取って、それを IWMPControls3 型に
キャストして取得するのでしょう(未確認)。
http://msdn.microsoft.com/en-us/library/windows/desktop/dd562401.aspx


> さらにMediaElementクラスのSetAudioLanguageと同等の命令が見つかれば
> 一気に解決するかもしれません。
同インターフェイスのプロパティのことではなく?
currentAudioLanguage/currentAudioLanguageIndex とか…。


> デスクトップアプリの開発でMediaElementクラスが使えれば
もし、WinForm アプリから WPF コントロールを扱うのだとすれば、
ElementHost コントロール経由で利用することになるでしょう。

http://www.atmarkit.co.jp/fdotnet/dotnettips/800wpfonwinform/wpfonwinform.html
http://stackoverflow.com/questions/10657533/how-can-be-added-mediaelement-in-wpf-in-windows-form


――多分! (^^;
答えておいて何ですが、私自身は WMP も WPF も XAML も全く知らないので…。
魔界の仮面弁士さん、ご助言ありがとうございます。

CtlcontrolsプロパティをIWMPControls3 型にキャストするという発想は
私ではできなかったと思います。すばらしい。

おかげで目的の機能が実現できましたので、解決済みとさせていただきます。


以下、サンプルコードです。
もっと良いやり方があるかもしれませんがご参考までに。

--------------------------------------------
'Imports WMPLib

Dim axWMP3 As IWMPControls3 = CType(AxWMP.Ctlcontrols, IWMPControls3)

Dim i1 As Integer

'▼AudioLanguageの一覧取得(添え字は1から始まる様子)
For i1 = 1 To axWMP3.audioLanguageCount
Debug.Print("getAudioLanguageID(" & i1 & ")=" & axWMP3.getAudioLanguageID(i1).ToString)
Debug.Print("getAudioLanguageDescription(" & i1 & ")=" & axWMP3.getAudioLanguageDescription(i1))
Next

'▼現在のAudioLanguage情報を取得
Debug.Print("currentAudioLanguage=" & axWMP3.currentAudioLanguage)
Debug.Print("currentAudioLanguageIndex=" & axWMP3.currentAudioLanguageIndex)

'▼AudioLanguage切り替え(1→2)
axWMP3.currentAudioLanguageIndex = 2
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板