Проблема с MediaElement в Silverlight - PullRequest
2 голосов
/ 06 января 2011

У меня проблемы с элементом управления MediaElement в Silverlight для Windows Phone 7. Моя цель - сыграть два тона, когда пользователь нажимает кнопку.Метод, который я придумал, - это 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();
        }
    }

Когда я нажимаю кнопку, звук не воспроизводится.Почему это?Что я делаю не так?

Ответы [ 5 ]

1 голос
/ 07 января 2011

MediaElement предназначен для воспроизведения одного фрагмента мультимедиа за раз.Как уже упоминалось, используйте классы SoundEffect или SoundEffectInstance для одновременных звуков.Вы можете воспроизводить до 16 звуковых эффектов одновременно.

Кроме того, использование MediaElement может вызвать проблемы с сертификацией, если вы не будете осторожны.Например, если вы установите источник MediaElement в своем XAML, это остановит все воспроизводимые в данный момент медиафайлы на телефоне.Если вы не попросите разрешения пользователя остановить воспроизведение мультимедиа, вы не пройдете сертификацию.

1 голос
/ 06 января 2011

Вы можете получить все виды странных вещей, происходящих с URI и их местоположением относительно приложения Silverlight;и связывание данных, как известно, трудно получить правильно.Я бы порекомендовал начать устранение неполадок с жесткого кодирования абсолютных URI в файлах MP3 непосредственно в XAML.Как только у вас это заработает, переключитесь на относительные URI, а когда это сработает, переключитесь на привязку данных к их коду (или ViewModel или как угодно).

Если у вас есть файл, помещенныйв изолированном хранилище что-то вроде этого должно работать (не проверял на WP7):

var store = IsolatedStorageFile.GetUserStoreForApplication();
var iStream = store.OpenFile("a.mp3", System.IO.FileMode.Open,FileAccess.Read);
firstTone.SetSource(iStream);
firstTone.Play();
1 голос
/ 06 января 2011

Не используйте 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 голосов
/ 07 января 2011

Мне никогда не удавалось заставить несколько MediaElements работать в приложении для телефона.Я вижу те же проблемы, что и вы, я не могу воспроизвести мультимедиа.

Я считаю, что у вас может быть только один активный, но я не видел документации на этот счет.Чтобы обойти это, я должен определить один 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);
0 голосов
/ 06 января 2011

Я не знаю, почему вы вообще ничего не слышите, но если вы хотите слышать два последовательных тона, когда пользователь нажимает кнопку, почему бы не объединить тоны заранее в один файл, а затем просто играть что?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...