2011-01-06 4 views
2

Windows Phone 용 Silverlight에서 MediaElement 컨트롤에 문제가 있습니다. 사용자가 단추를 누를 때 두 가지 색조를 재생하는 것이 목표입니다. 이렇게하기위한 방법은 각 음색에 대해 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

전혀 들리지 않는 이유는 모르겠지만 사용자가 버튼을 클릭 할 때 두 개의 연속 톤을 듣고 싶다면, 미리 톤을 하나의 파일로 결합한 다음 그냥 연주 해?

+0

재생할 두 톤은 런타임까지 알 수 없습니다. (만약 내가 가능한 모든 조합을 미리 만들었다면 많은 양의 파일이 될 것입니다. 프로그래밍 방식으로 처리하려고합니다.) –

+0

오, 알았습니다.아무도 다른 사람들이 같은 제안을하지 않도록 내 답변을 남겨 둘 것입니다. – MusiGenesis

+0

내 생각 엔 우리스에 뭔가 문제가있는 것 같습니다. 온라인으로 코드 샘플을 찾아서 점차적으로 수정하는 것이 좋습니다. – MusiGenesis

1

URI 및 해당 위치가 Silverlight 응용 프로그램과 관련이있는 모든 종류의 이상한 것을 얻을 수 있습니다. 데이터 바인딩은 악명이 높습니다. 내 권고안은 XAML에서 직접 MP3 파일에 절대 URI를 하드 코딩하여 문제를 해결하는 것입니다. 일단 작업이 끝나면 상대 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 앱에서 절대 URI가 무엇인지 확신 할 수 없습니다. "c : \ path \ to \ project \ a.mp3"을 의미하지 않습니다. 그렇습니까? –

+0

WP7 앱의 경우, 실제로 휴대 전화의 파일 시스템에있는 위치에서 시작하십시오. –

+0

WP7에서 내 응용 프로그램의 격리 된 저장소에있는 파일의 절대 경로는 무엇입니까? –

1

MediaElement. 대신 Microsoft.Xna.Framework.dll (예, Silverlight 프로젝트에서도)에 대한 참조를 추가 한 다음 SoundEffect을 사용하십시오.

뭔가 등 :

MediaElement에
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

참고하시기 바랍니다. 이전에이 방법에 대해서만 wav 파일을 사용했습니다. 자세한 내용은 MP3 파일 형식을 확인하십시오. http://msdn.microsoft.com/en-us/library/ff462087(v=vs.92).aspx –

+0

'Thread.Sleep()'호출이 UI를 차단합니까? –

+0

@Rosarch 현재 스레드를 차단합니다. UI에서이 코드를 실행하여 필요한 경우 UI에서 재생을 호출 할 수 있습니다. –

1

는 한 번에 미디어의 한 조각을 재생하기위한 것입니다. 다른 사람들이 언급했듯이, SoundEffect 또는 SoundEffectInstance 클래스를 사용하여 동시에 소리를 들으십시오. 한 번에 최대 16 개의 SoundEffect를 재생할 수 있습니다.

또한주의해서 사용하지 않으면 MediaElement를 사용하면 인증에 문제가 발생할 수 있습니다. 예를 들어, XAML에 MediaElement 소스를 설정하면 현재 재생중인 미디어가 중지됩니다. 미디어 재생을 중지 할 수있는 사용자 권한을 요청하지 않으면 인증에 실패하게됩니다.

+0

나는 두 사람의 음색이 동시에 연주되는 것이 아니라 연속적으로 연주 될 것이라고 생각했다. – MusiGenesis

+0

예, 연속적인 음색을 원했습니다. –

+1

MediaElement에서 두 개의 미디어 파일을 연속해서 재생할 때 두 샘플 사이에 시간 차이가 있음을 알고 있어야합니다. 휴대 전화에는 갭리스 재생이 없습니다. –

0

전화 앱에서 여러 MediaElements를 사용할 수있는 적이 없었습니다. 나는 너와 똑같은 문제를 안고, 나는 미디어를 재생할 수 없다.

나는 당신이 오직 하나만 활성화 할 수 있다고 믿지만 그 효과에 대한 문서화를 보지 못했다. 내가 주위에 작업 한 방법은

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

App.XAML

한 MediaElement를 정의하고 응용 프로그램 클래스의 속성으로 노출하는 것입니다.

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

그런 다음 MediaElement를 이와 같이 호출하십시오.

App.Current.MediaElement.Source = new Uri(_musicLocation, UriKind.Relative);