Silverlight(C#)でMediaElementの使用方法について

Category: windows phone apps_ja

Question

ueshiman on Tue, 23 Oct 2012 14:58:40


まだプログラム初心者なので、初歩的なミスかもしれませんが、ネットで検索しても解決策が分かりませんでしたので、フォーラムにて失礼いたします。

MediaElementを使用して効果音を再生しようと試みたのですが、なぜか一方の音源しか再生されません。なお、mp3ファイルはプロパティからビルドアクションを「Resource」に変更しております(どこかのサイトで載っていたのを参考にしました)。

①xaml

<MediaElement x:Name="sound1" Source="sound1.mp3" AutoPlay="False" ></MediaElement>
<MediaElement x:Name="sound2" Source="sound2.mp3" AutoPlay="False"></MediaElement>

②xaml.cs

sound1.play();

sound2.play();

上記のプログラムを実行した結果、sound2の効果音が2度再生され、sound1は再生されませんでした。xamlの記述を上下入れ替えてみると、sound1の効果音が再生され、sound2の効果音は再生されませんでした。おそらく後に書いたMediaElementのSourceで音源が上書きされているのではないか、と考えているのですが仕組みが分からず解決に至っておりません。お手数ではございますが、原因と上記のような問題の回避策を教えていただけないでしょうか。

よろしくお願いいたします。


Replies

みっと on Wed, 24 Oct 2012 06:43:54


下記の書き込みにもあるように、複数のMediaElementを同時に制御できないのは(今のところ)Windows Phoneの制約のようです。

http://social.msdn.microsoft.com/Forums/ja-JP/wp7fbja/thread/781af552-e250-4896-9e37-13e2a6ff6bb0

>> MediaElementを使用して効果音を再生しようと試みたのですが、なぜか一方の音源しか再生されません。

で、この質問なのですが、2つのファイルを連続して再生したいのか同時に(重ねて)再生したいのかがわかりません。
同時再生したい場合は上記書き込みにもあるようにXNAを使う必要があります。

連続再生であれば、下記のような方法で(一応)実現できました。

<phone:PhoneApplicationPage 
    x:Class="PhoneApp1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible="True">

    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <MediaElement Name="element" />

        <Button Grid.Row="1" Content="button1" Click="Button_Click"/>
    </Grid>
 
</phone:PhoneApplicationPage>

    public partial class MainPage : PhoneApplicationPage
    {
        public MainPage()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            element.Source = new Uri("Sound1.mp3", UriKind.Relative);
            element.MediaEnded += OnMediaEnded;
            element.Play();
        }

        private void OnMediaEnded(object sender, RoutedEventArgs e)
        {
            element.Source = new Uri("Sound2.mp3", UriKind.Relative);
            element.Play();
            element.MediaEnded -= OnMediaEnded;
        }

    }

要は、Sound1.mp3の再生終わりをMediaEndedイベントで待って、イベント発生を受けてSound2.mp3の再生に移行する、ということですね。
以上、参考になれば幸いです。

ueshiman on Wed, 24 Oct 2012 15:33:52


みっと 様

ご回答いただきましてありがとうございます。質問の内容が言葉足らずで申し訳ございません。

音源を連続して(実際にはTimerを使用して1秒ずらしで)再生したいと考えております。しかし、実際に再生すると2種類あるはずの音源が1種類しか鳴らず、しかもSound1.Play()としてもSound2の音源が再生されてしまう、といった現象でした。

ご記入いただいたソースの通りにしてみても同じ現象が起きてしまったのですが、Windows7上で「既定のメディアプレイヤー」がZuneになっていたのを「WindowsMediaPlayer」に切り替えた途端に改善されました(以前のソースでも動作しました)。

全く理由が分からないのですが、おそらくPCの動作不良(またはZuneがトラブルの原因)だったと思われます。

しかしながら、動的(?)にMediaElementのSourceにmp3ファイルの指定を行う方法が分かっていなかったので、とても良い勉強になりました。作成するアプリはみっと様のソースを参考にいたします。

お忙しい中、お騒がせいたしまして申し訳ございませんでした。