2011-01-06 9 views
2

Silverlight for Windows Phone 7でMediaElementコントロールで問題が発生しました。私の目標は、ユーザーがボタンを押したときに2つのトーンを再生することです。私が思いついたこれを行う方法は、各トーンのためにMediaElementを持つことです。 (おそらくより良い方法はありますか?)SilverlightのMediaElementでの問題

<phone:PhoneApplicationPage 
    x:Class="MediaElementTest.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"> 

    <StackPanel x:Name="LayoutRoot" Background="Transparent"> 

      <MediaElement 
       x:Name="firstTone" 
       MediaEnded="firstTone_MediaEnded" 
       Source="{Binding FirstTone}" /> 
      <MediaElement 
       x:Name="secondTone" 
       Source="{Binding SecondTone}" /> 
      <Button Content="Play" Click="Button_Click" /> 

    </StackPanel> 

</phone:PhoneApplicationPage> 

コードビハインド:

public partial class MainPage : PhoneApplicationPage 
    { 
     public Uri FirstTone 
     { 
      get 
      { 
       return new Uri("A.mp3", UriKind.Relative); 
      } 
     } 

     public Uri SecondTone 
     { 
      get 
      { 
       return new Uri("B.mp3", UriKind.Relative); 
      } 
     } 

     public MainPage() 
     { 
      InitializeComponent(); 
      LayoutRoot.DataContext = this; 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      firstTone.Stop(); 
      secondTone.Stop(); 

      firstTone.Play(); 
     } 

     private void firstTone_MediaEnded(object sender, RoutedEventArgs e) 
     { 
      secondTone.Play(); 
     } 
    } 

私はボタンをクリックして

は、何の音が再生されません。どうしてこれなの?私は間違って何をしていますか?

答えて

0

何も聞こえない理由はわかりませんが、ユーザーがボタンをクリックしたときに連続する2つの音を聞きたい場合は、前もって音を1つのファイルに結合してからちょうどそれをプレーする?

+0

再生する2つのトーンは、実行時まで認識されません。 (私がすべての可能な組み合わせをあらかじめ作っていたのであれば、それは大量のファイルになるだろう。私はむしろプログラムでそれをやっているだろう) –

+0

ああ、OK。誰も同じ提案をしないように私は私の答えを残します。 – MusiGenesis

+0

あなたのウリスに何か問題があると思います。私は、動作するコードサンプルをオンラインで見つけて、それを徐々に修正することをお勧めします。 – MusiGenesis

1

奇妙なことに、URIとその場所がSilverlightアプリケーションに関連していることがあります。データバインディングは正しく取得することは難しいとされています。私の推奨は、絶対URIをXAMLのMP3ファイルに直接ハードコードすることでこれをトラブルシューティングすることです。これを実現したら、相対URIに切り替えて、それが機能している場合は、コードビハインド(またはViewModelなど)にデータバインディングに切り替えます。

あなたは分離ストレージに配置されたファイルを、このような何かが動作するはず(WP7でそれをテストしていない)持っていれば:

var store = IsolatedStorageFile.GetUserStoreForApplication(); 
var iStream = store.OpenFile("a.mp3", System.IO.FileMode.Open,FileAccess.Read); 
firstTone.SetSource(iStream); 
firstTone.Play(); 
+0

私はWP7アプリケーションで絶対URIsが何であるか分かりません。あなたは "c:\ path \ to \ project \ a.mp3"という意味ではありませんか? –

+0

WP7アプリの場合は、実際に電話機のファイルシステム上のどこから始めるのですか。 –

+0

WP7上の私のアプリケーションの隔離されたストレージのファイルの絶対パスは何ですか? –

1

このためMediaElementを使用しないでくださいを。代わりにMicrosoft.Xna.Framework.dllへの参照を追加して(はい、Silverlightプロジェクトでも)SoundEffectを使用してください。

のようなもの:

using Microsoft.Xna.Framework; 
using Microsoft.Xna.Framework.Audio; 

using (var stream = TitleContainer.OpenStream("a.mp3")) 
{ 
    var effect = SoundEffect.FromStream(stream); 
    effect.Play(); 

    // This will pause while the first sound plays 
    // so they don't play over each other but as it also blocks! 
    Thread.Sleep(effect.Duration); 
} 

using (var stream = TitleContainer.OpenStream("b.mp3")) 
{ 
    var effect = SoundEffect.FromStream(stream); 
    effect.Play(); 
} 
+0

FYI。以前はこの方法でwavファイルしか使用していませんでした。 http://msdn.microsoft.com/en-us/library/ff462087(v=vs.92).aspx –

+0

の 'Thread.Sleep()'呼び出しがUIをブロックするでしょうか? –

+0

@Rosarch現在のスレッドをブロックします。これをUIから実行して、必要に応じて再生をUIに呼び出すことができます。 –

1

のMediaElementを一度にメディアの一枚を再生するためのものです。他の人が触れたように、SoundEffectクラスまたはSoundEffectInstanceクラスは、擬似サウンドに使用します。一度に最大16のSoundEffectを再生することができます。

また、注意しないと、MediaElementを使用すると認証に問題が発生する可能性があります。たとえば、MediaElementソースをXAMLに設定すると、現在再生中のメディアがすべて停止します。あなたがメディアの再生を停止するユーザーの許可を求める場合を除き、あなたは認証に失敗します。

+0

私は、2つのトーンを同時に聞くのではなく、連続して演奏することを意図していたと思います。 – MusiGenesis

+0

ええ、私は連続したトーンを聞きました –

+1

MediaElementで2つのメディアファイルを連続して再生する場合、2つのサンプルの間に時間差があることに注意してください。電話にはギャップレス再生はありません。 –

0

電話アプリで複数のMediaElementsを使用することはできませんでした。私はあなたと同じ問題を抱えている、私はメディアを再生することはできません。

私はあなたが1つしかアクティブにすることはできないと信じていますが、私はその影響についてのドキュメンテーションを見ていません。私が取り組んだのは、1つのMediaElementをApp.XAMLで定義することです。

<!--Application Resources--> 
<Application.Resources> 
    <MediaElement 
     x:Key='mediaElement' AutoPlay='True' Source='/music/GroovinIntro.wav'/> 
</Application.Resources> 

これをApplicationクラスのプロパティとして公開します。

public MediaElement MediaElement 
{ 
    get 
    { 
    return this.Resources["mediaElement"] as MediaElement; 
    } 
} 

次に、このようにMediaElementを呼び出します。

App.Current.MediaElement.Source = new Uri(_musicLocation, UriKind.Relative); 
関連する問題