1

Silverlight で作成されたアプリを変換していますが、これまでのところ、1 つを除いてすべての問題を解決することに成功しています。

何らかの理由で、エミュレーターはアプリのオーディオ ファイルの再生を拒否し、例外もスローしません。確認したところ、着信音カテゴリでは音が出ます。

元のコードは次のとおりです。

<Grid x:Name="sharedFullScreenFilePathContainer"
Tag="{Binding StringFormat=\{0\},Converter={StaticResource fullScreenImageConverter}}">

    <Image x:Name="fullScreenImage" Stretch="Fill"
Source="{Binding ElementName=sharedFullScreenFilePathContainer,Path=Tag, StringFormat=../Assets/images/\{0\}.jpg}"
ImageFailed="onFullScreenImageFailedToLoad" MouseLeftButtonDown="onPressedOnFullScreenImage" />

    <MediaElement x:Name="mediaPlayer" AutoPlay="True"
Source="{Binding ElementName=sharedFullScreenFilePathContainer,Path=Tag, StringFormat=../Assets/sounds/\{0\}.wma}" />
</Grid>

そのため、このアイテムのコンテキストに設定した画像は実際に表示されますが、設定したパスに実際に存在するサウンドは再生されません (「Bin」フォルダーで確認しました)。

xaml の代わりにコードを使用しようとしましたが、まだ同じ問題があります。

私はこれを試しました(通常はバックグラウンドミュージックに使用されます):

AudioTrack audioTrack = new AudioTrack(new Uri("../Assets/sounds/" + fileToOpen, UriKind.Relative), "", "", "", null);
BackgroundAudioPlayer player = BackgroundAudioPlayer.Instance;
player.Track = audioTrack;
player.Play();

何も再生されず、例外もスローされませんでした。

次のコードも試しましたが、例外 (ファイルが見つからない例外) がスローされます。おそらく、正しく呼び出していないためです。

Stream stream = TitleContainer.OpenStream("@Assets/sounds/" + fileToOpen);
SoundEffect effect = SoundEffect.FromStream(stream);
FrameworkDispatcher.Update();
effect.Play();

wmaファイルも試してみましたが、うまくいきませんでした。

また、mp3 ファイルの「copy to output directory」パラメーター (「always」および「only if new」) と「build action」パラメーター (「none」および「content」) を試してみました。何も役に立ちません。

誰でも私を助けてもらえますか?私は非常に長い間 Silverlight/WP の開発を行っていませんでしたが、修正方法がわかりません。

ところで、後でサウンドの再生がいつ終了したかを知る必要があるため (また、停止できるようにする必要があるため)、とにかくコードを使用したいと思います。やり方も教えていただけると嬉しいです(必要であれば新しい投稿で質問できます)。


編集: わかりました、問題を発見しました: MediaPlayer.Play()メソッドを使用しているときに奇妙な例外が発生し続け、例外についてチェックアウトした後、それが既知の問題であることがわかりました。FrameworkDispatcher.Update();を呼び出す必要があります。Play() メソッドを呼び出す直前。

したがって、解決策は次のようにすることです。

Song song = Song.FromUri(...);
MediaPlayer.Stop(); 
FrameworkDispatcher.Update();
MediaPlayer.Play(song);

例外は次のとおりです。

System.Windows.ni.dll で 'System.InvalidOperationException' が発生しました"

ここで解決策を見つけました。

ここで問題になるのは、Windows Phone のデモで関連するものを見つけられなかった理由です。また、この関数が何をするのか知りたいです。


どちらの質問にも誰も答えてくれなかったので、賞金をあげたいので、別の質問をします。

Windows phone の MediaPlayer クラスを使用する以外に解決策がない場合、オーディオ ファイルの再生を終了するイベントをキャプチャするにはどうすればよいですか? オーディオファイルの長さを取得しても機能しません(使用しようとしたクラスに関係なく、 0 length を返し続けます)...

4

5 に答える 5

2

BackgroundAudioPlayer は、分離ストレージまたはリモート URI からのファイルを再生できます。

ファイルをアプリ内のリソースとして持っている場合は、まずそれらを分離ストアにコピーしてから、分離ストア内のファイルへの参照を BackgroundAudioPlayer に作成する必要があります。

    private void CopyToIsolatedStorage()
    {
        using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            string[] files = new string[] 
                { "Kalimba.mp3", 
                    "Maid with the Flaxen Hair.mp3", 
                    "Sleep Away.mp3" };

            foreach (var _fileName in files)
            {
                if (!storage.FileExists(_fileName))
                {
                    string _filePath = "Audio/" + _fileName;
                    StreamResourceInfo resource = Application.GetResourceStream(new Uri(_filePath, UriKind.Relative));

                    using (IsolatedStorageFileStream file = storage.CreateFile(_fileName))
                    {
                        int chunkSize = 4096;
                        byte[] bytes = new byte[chunkSize];
                        int byteCount;

                        while ((byteCount = resource.Stream.Read(bytes, 0, chunkSize)) > 0)
                        {
                            file.Write(bytes, 0, byteCount);
                        }
                    }
                }
            }
        }
    }

そして、あなたの曲のリストを作ることができます

    private static List<AudioTrack> _playList = new List<AudioTrack>
    {
        new AudioTrack(new Uri("Kalimba.mp3", UriKind.Relative), 
                        "Kalimba", 
                        "Mr. Scruff", 
                        "Ninja Tuna", 
                        null),

        new AudioTrack(new Uri("Maid with the Flaxen Hair.mp3", UriKind.Relative), 
                        "Maid with the Flaxen Hair", 
                        "Richard Stoltzman", 
                        "Fine Music, Vol. 1", 
                        null),

        new AudioTrack(new Uri("Sleep Away.mp3", UriKind.Relative), 
                        "Sleep Away", 
                        "Bob Acri", 
                        "Bob Acri", 
                        null),

        // A remote URI
        new AudioTrack(new Uri("http://traffic.libsyn.com/wpradio/WPRadio_29.mp3", UriKind.Absolute), 
                        "Episode 29", 
                        "Windows Phone Radio", 
                        "Windows Phone Radio Podcast", 
                        null)
    };

そしてあなたのトラックを演奏してください!

    private void PlayNextTrack(BackgroundAudioPlayer player)
    {
        if (++currentTrackNumber >= _playList.Count)
        {
            currentTrackNumber = 0;
        }

        PlayTrack(player);
    }

    private void PlayPreviousTrack(BackgroundAudioPlayer player)
    {
        if (--currentTrackNumber < 0)
        {
            currentTrackNumber = _playList.Count - 1;
        }

        PlayTrack(player);
    }

    private void PlayTrack(BackgroundAudioPlayer player)
    {
        // Sets the track to play. When the TrackReady state is received, 
        // playback begins from the OnPlayStateChanged handler.
        player.Track = _playList[currentTrackNumber];
    }
于 2013-02-05T13:25:46.457 に答える
2

コードから MediaElement を動作させたい場合は、次のようにすることができます。

        MediaElement me = new MediaElement();
        // Must add the MediaElement to some UI container on 
        // your page or some UI-control, otherwise it will not play!
        this.LayoutRoot.Children.Add(me);
        me.Source = new Uri("Assets/AwesomeMusic.mp3", UriKind.RelativeOrAbsolute);
        me.Play();
于 2013-02-06T22:53:10.350 に答える
0

オーディオ トラックは、分離ストレージに保存されているか、インターネット経由でストリーミングされているオーディオ ファイルを再生します。

于 2013-01-27T16:00:42.693 に答える
0

アプリケーション パッケージ内に保存されているオーディオ ファイルの再生は問題なく動作します。プロジェクト フォルダ Resources\Alarms に「Alarm01.wma」という名前のファイルを取得しました。次に、これらの音を次のように再生します。

using Microsoft.Xna.Framework.Media;
...
Song s = Song.FromUri("alarm", new Uri(@"Resources/Alarms/Alarm01.wma", UriKind.Relative));
MediaPlayer.Play(s);

また、 Microsoft.Xna.Frameworkライブラリを参照することも忘れないでください。

mp3ファイルやIsolatedStorageに保存されているファイルでもうまくいくはずです。

于 2013-02-05T09:16:56.883 に答える
0

代わりに MediaElement を使用してください。これにより、アプリケーションに保存されているメディア ファイルを再生できますが、アプリケーションが停止すると再生が停止します (アプリを実行し続けるために事前にチャンスを作ることができますが、うまく機能しません)。

XAML で:

        <Button x:Name="PlayFile"
                Click="PlayFile_Click_1"
                Content="Play mp3" />

あなたのコードビハインドで:

    MediaElement MyMedia = new MediaElement();
    // Constructor
    public MainPage()
    {
        InitializeComponent();

        this.LayoutRoot.Children.Add(MyMedia);

        MyMedia.CurrentStateChanged += MyMedia_CurrentStateChanged;
        MyMedia.MediaEnded += MyMedia_MediaEnded;
    }

    void MyMedia_MediaEnded(object sender, RoutedEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("Ended event " + MyMedia.CurrentState.ToString());
        // Set the source to null, force a Close event in current state
        MyMedia.Source = null;
    }

    void MyMedia_CurrentStateChanged(object sender, RoutedEventArgs e)
    {

        switch (MyMedia.CurrentState)
        {
            case System.Windows.Media.MediaElementState.AcquiringLicense:
                break;
            case System.Windows.Media.MediaElementState.Buffering:
                break;
            case System.Windows.Media.MediaElementState.Closed:
                break;
            case System.Windows.Media.MediaElementState.Individualizing:
                break;
            case System.Windows.Media.MediaElementState.Opening:
                break;
            case System.Windows.Media.MediaElementState.Paused:
                break;
            case System.Windows.Media.MediaElementState.Playing:
                break;
            case System.Windows.Media.MediaElementState.Stopped:
                break;
            default:
                break;
        }

        System.Diagnostics.Debug.WriteLine("CurrentState event " + MyMedia.CurrentState.ToString());
    }

    private void PlayFile_Click_1(object sender, RoutedEventArgs e)
    {
        // Play Awesome music file, stored as content in the Assets folder in your app
        MyMedia.Source = new Uri("Assets/AwesomeMusic.mp3", UriKind.RelativeOrAbsolute);
        MyMedia.Play();
    }
于 2013-02-05T21:10:36.143 に答える