質問者
MediaPlayerコントロールを2つ配置して同時に再生するとフリーズすることがある

質問
-
2つの内容の異なる、長さは同じな音声ファイル(wav)を1セットとして、複数のセットを1セットずつ同時に再生するツールを作成する必要があり、C#2005にて
http://msdn.microsoft.com/ja-jp/library/bb383953%28v=VS.90%29.aspx
を参考にして、フォームに2つMediaPlayerコントロールを貼り付け、同時に再生するアプリケーション(exe)を作成しています。
このツールではさらに、両方の音声ファイルが再生終了状態になると次のセットの再生を開始するようにしています。
しかし、最初のセットを再生するときや、次のセットを再生する際、まれにMediaPlayerコントロールがフリーズし、アプリケーション自体が不正終了することがあります。
そこで質問したいのですが、そもそも、1つのアプリケーション上で、MediaPlayerコントロールを2つ並べて同時に実行させるということ自体、MediaPlayerからすると想定外で当然エラーも起きるようなことなのでしょうか?といいますのは、今更調べてみると、
http://www.microsoft.com/japan/windows/windowsmedia/mp10/faq.aspx#1_12
引用開始 ----
1.12 Player のインスタンスを複数実行することはできますか?
Windows Media Player 7 以降では、Player のインスタンスを複数実行することはできません。ただし、Web ページに Windows Media Player 7 以降のインスタンスを複数組み込むことはできます。---- 引用終わり
とあり、そもそもこのような、MediaPlayerコントロールを複数同時に再生状態にするという使い方自体に問題があるような気がしております。上記からすると、結局C#で書いても、例えば言語を変えHTMLのObjectタグからclassId指定で呼出すにしても、そもそもこういった場合MediaPlayerは使えないのでは、と。
なお、フリーズまでの経過は以下のようになっています。
(axPlayer1、axPlayer2がMediaPlayerコントロール。これらを自動再生trueにしたうえで、URLプロパティに再生対象のファイルを指定しています。以下のログでは、このURLプロパティへの再生対象ファイルのセット後に発生したMediaPlayerコントロールのOpenStateChange, StatusChange, PlayStateChangeイベントにて通知された状態情報をログ出力しています。)
ログ引用 ----------------
2012-10-09 12:16:58,832 axPlayer1_OpenStateChange 0 - >> WMPLib.WMPOpenState.wmposPlaylistChanging
2012-10-09 12:16:58,834 axPlayer1_StatusChange 0 - >>
2012-10-09 12:16:58,836 axPlayer1_PlayStateChange 0 - >> WMPLib.WMPPlayState.wmppsTransitioning
2012-10-09 12:16:58,843 axPlayer1_StatusChange 0 - >>
2012-10-09 12:16:58,845 axPlayer1_OpenStateChange 0 - >> WMPLib.WMPOpenState.wmposPlaylistChanged
2012-10-09 12:16:58,846 axPlayer1_OpenStateChange 0 - >> WMPLib.WMPOpenState.wmposPlaylistOpenNoMedia
2012-10-09 12:16:58,846 axPlayer1_StatusChange 0 - >>
2012-10-09 12:16:58,847 axPlayer1_OpenStateChange 0 - >> WMPLib.WMPOpenState.wmposOpeningUnknownURL
2012-10-09 12:16:58,847 axPlayer1_StatusChange 0 - >> 接続しています...
2012-10-09 12:16:58,848 axPlayer1_PlayStateChange 0 - >> WMPLib.WMPPlayState.wmppsTransitioning
2012-10-09 12:16:58,848 axPlayer1_StatusChange 0 - >> 接続しています...
2012-10-09 12:16:58,858 axPlayer2_OpenStateChange 0 - >> WMPLib.WMPOpenState.wmposPlaylistChanging
2012-10-09 12:16:58,858 axPlayer2_StatusChange 0 - >>
2012-10-09 12:16:58,859 axPlayer2_PlayStateChange 0 - >> WMPLib.WMPPlayState.wmppsTransitioning
2012-10-09 12:16:58,859 axPlayer2_StatusChange 0 - >>
2012-10-09 12:16:58,860 axPlayer2_OpenStateChange 0 - >> WMPLib.WMPOpenState.wmposPlaylistChanged
2012-10-09 12:16:58,861 axPlayer2_OpenStateChange 0 - >> WMPLib.WMPOpenState.wmposPlaylistOpenNoMedia
2012-10-09 12:16:58,864 axPlayer2_StatusChange 0 - >>
2012-10-09 12:16:58,867 axPlayer2_OpenStateChange 0 - >> WMPLib.WMPOpenState.wmposOpeningUnknownURL
2012-10-09 12:16:58,867 axPlayer2_StatusChange 0 - >> 接続しています...
2012-10-09 12:16:58,870 axPlayer2_PlayStateChange 0 - >> WMPLib.WMPPlayState.wmppsTransitioning
2012-10-09 12:16:58,870 axPlayer2_StatusChange 0 - >> 接続しています...
2012-10-09 12:16:58,925 axPlayer1_OpenStateChange 0 - >> WMPLib.WMPOpenState.wmposMediaOpen
2012-10-09 12:16:58,929 axPlayer1_StatusChange 0 - >> '20121009_8075_recv_cnfjkgl1.lan' を再生中: 13 K ビット/秒
2012-10-09 12:16:58,939 axPlayer1_PlayStateChange 0 - >> WMPLib.WMPPlayState.wmppsPlaying
2012-10-09 12:16:58,944 axPlayer1_StatusChange 0 - >> '20121009_8075_recv_cnfjkgl1.lan' を再生中: 13 K ビット/秒
------------ ログ引用終了上記の最後、「2012-10-09 12:16:58,944 axPlayer1_StatusChange」が出力された後、フリーズしてしまいます。このとき、axPlayer2のほうのMediaPlayerコントロールのステータスには、「接続しています...」が表示されたままとなっていました。
すべての返信
-
投稿者です。このエラーが発生し、アプリケーションを強制終了したときのOSのアプリケーションログを確認したところ、以下のエラーが出ていました。
全般タブ
- ログの名前 ・・・ アプリケーション
- ソース ・・・ Application Hang
- イベントID ・・・ 1002
- レベル ・・・ エラー
さらに、詳細タブにて「表示」を選択すると、下に「バイナリデータ」という箇所があり、そこの「バイト形式」に、「Cross-thread Deadlock」とでています。この再生ツールでは、マルチスレッド処理を使っておらず、状況からするとMediaPlayerを同時に再生させようとしたときに、MediaPlayer側で問題が起きているような気がしている(デバイスの取り合いとか?)のですが、いかがでしょうか?
- 編集済み ikdsj 2012年10月12日 8:40
-
投稿者です。継続して調査しておりましたが、MediaPlayerコントロールをフォームに10個並べて、全て自動再生設定をtrueにし、URLプロパティにそれぞれ異なるファイルを1メソッド内で以下のようにセットすると、
axPlayer01.URL = "xxx01.wav"; axPlayer02.URL = "xxx02.wav"; axPlayer03.URL = "xxx03.wav"; // 省略 axPlayer10.URL = "xxx10.wav";
ほぼ確実にフリーズすることが分かりましたので、やっぱりそもそもこんなこと無理なんだよね。。ということになりました。全プレイヤーに対して同時に再生開始するのではなく、1つづつ、playStateがplayingになるのを見計らって次のプレイヤーを再生してこれがまたplayingになったら次の・・・のように再生して、全部再生状態になったときに再生位置を調整する、みたいにしてみると、とりあえずうまくいっているようですので、ひとまずこれでいってみます。
お騒がせしました。