3

私の問題:

Cordova の Media Class を使用しています。MP3 ファイルは 1 回 (初回) だけ再生されます。

コード:

このコードを Cordova Starter プロジェクトに追加して、問題を再現します。

    var playCounter = 0;
    function playMP3(){
      console.log("playMP3() counter " + playCounter);
      var my_media = new Media("app/www/test.mp3");//ressource buildAction == content
      my_media.play();
      playCounter++;
    }
    [...]
    <p onclick="playMP3();">Click to Play MP3</p>

VS出力:

[...]
GapBrowser_Navigated :: /app/www/index.html
'UI Task' (Managed): Loaded 'System.ServiceModel.Web.dll'
'UI Task' (Managed): Loaded 'System.ServiceModel.dll'
Log:"onDeviceReady. You should see this message in Visual Studio's output window."
'UI Task' (Managed): Loaded 'Microsoft.Xna.Framework.dll'
Log:"playMP3() counter 0"
'UI Task' (Managed): Loaded 'System.SR.dll'
Log:"media on status :: {\"id\": \"fa123123-bc55-a266-f447-8881bd32e2aa\", \"msg\": 1, \"value\": 1}"
A first chance exception of type 'System.ArgumentException' occurred in mscorlib.dll
Log:"media on status :: {\"id\": \"fa123123-bc55-a266-f447-8881bd32e2aa\", \"msg\": 1, \"value\": 2}"
Log:"media on status :: {\"id\": \"fa123123-bc55-a266-f447-8881bd32e2aa\", \"msg\": 2, \"value\": 2.141}"
Log:"media on status :: {\"id\": \"fa123123-bc55-a266-f447-8881bd32e2aa\", \"msg\": 1, \"value\": 4}"
Log:"playMP3() counter 1"
A first chance exception of type 'System.ArgumentException' occurred in mscorlib.dll
A first chance exception of type 'System.IO.IOException' occurred in mscorlib.dll
A first chance exception of type 'System.IO.IsolatedStorage.IsolatedStorageException' occurred in mscorlib.dll
Log:"media on status :: {\"id\": \"2de3388c-bbb6-d896-9e27-660f1402bc2a\", \"msg\": 9, \"value\": 5}"

私の設定:

  • コルドバ-1.6.1.js
  • ルミア800
  • WP 7.5 (7.10.7740.16)

回避策(種類):

  • アプリを無効にする(画面をオフにする)
  • アプリを再起動します(画面をオンにします)
  • -> もう 1 ショット取得します。

5 月からブロックされており、有用な情報がどこにも見つからなかったので、どんな助けも歓迎します。

また、このコードがあなたの設定で機能するかどうか教えてもらえますか?

.

.

.

更新: デモ コード、Cordova 1.8.0rc1 を追加します。

グローバル変数を使用します。インスタンスの存続。

結果

  • test2.mp3 が再生され、問題なく再生できます。
  • test.mp3 はまったく再生されません。
  • 機能するのは、再生する最初のファイルです。

コード

  function onDeviceReady()
  {
  document.getElementById("welcomeMsg").innerHTML += "Cordova is ready! version=" + window.device.cordova;
  console.log("onDeviceReady. You should see this message in Visual Studio's output window.");
  my_media = new Media("app/www/test.mp3");//ressource buildAction == content
  my_media2 = new Media("app/www/test2.mp3");//ressource buildAction == content
  }

  var playCounter = 0;
  var my_media = null;
  function playMP3(){
    console.log("playMP3() counter " + playCounter);
    my_media.play();
    playCounter++;
  }

  var my_media2 = null;
  function playMP32(){
    console.log("playMP32() counter " + playCounter);
    my_media2.play();
    playCounter++;
  }

</script>
[...]

<p onclick="playMP3();">Click to Play MP3</p>
<p onclick="playMP32();">Click to Play MP3 2</p>

VS出力:

Log:"onDeviceReady. You should see this message in Visual Studio's output window."
INFO: startPlayingAudio could not find mediaPlayer for 71888b14-86fe-4769-95c9-a9bb05d5555b
Log:"playMP32() counter 0"
INFO: startPlayingAudio could not find mediaPlayer for 71888b14-86fe-4769-95c9-a9bb05d5555b
Log:"playMP32() counter 1"
Log:"playMP3() counter 2"
INFO: startPlayingAudio could not find mediaPlayer for b60fa266-d105-a295-a5be-fa2c6b824bc1
A first chance exception of type 'System.ArgumentException' occurred in System.Windows.dll
Error: El parámetro es incorrecto. 
Log:"playMP32() counter 3"
INFO: startPlayingAudio could not find mediaPlayer for 71888b14-86fe-4769-95c9-a9bb05d5555b

.

.

.

更新: コルドバ 2.0.0

Apache バグ レポートを 2.0.0 のテスト ケースで更新しました。

誰でもこれを再現できますか?

バグ レポートへのリンク: https://issues.apache.org/jira/browse/CB-941

4

5 に答える 5

2

Media2回目のクリックでIsolatedStorageExceptionが発生していることがわかります。これにより、ファイルが最初のインスタンスによって開かれたままになり、再度アクセスできなくなると思われます。

Mediaファイルごとに のインスタンスを 1 つだけ作成するか、最初に古いインスタンスを破棄する方法があるかどうかを確認することをお勧めします。

これが私が試すことです(ただし、テストしていません):

 var playCounter = 0;

 // moved my_media here so it won't be recreated
 var my_media = new Media("app/www/test.mp3");//ressource buildAction == content

    function playMP3(){
      console.log("playMP3() counter " + playCounter);
      my_media.play();
      playCounter++;
    }
    [...]
    <p onclick="playMP3();">Click to Play MP3</p>
于 2012-06-19T17:15:15.047 に答える
1

ほとんど忘れていました...これは私の目的のために機能します。それが役に立てば幸い ;-)

WP7.5/コルドバ 1.9.0

要件: 私が知る限り、.wav ファイルでのみ動作します。.mp3 ファイルは醜い例外をスローするため、変換する必要がありました。

プラグイン:C#:

namespace Cordova.Extension.Commands
{
    public class PGSoundFX : BaseCommand
    {
        public Dictionary <string, SoundEffect> fxSoundMap = new Dictionary<string,SoundEffect>();

    public enum FXType
    {
        Load=0,
        Play=1
    }

    [DataContract]
    public class FXOption
    {
        [DataMember]
        public string audioSrc;
        [DataMember]
        public string audioRef;
        [DataMember]
        public FXType fxType; 
    }

    public void groAudio(string options)
    {
        FrameworkDispatcher.Update(); 
        FXOption opts;

        opts = WP7CordovaClassLib.Cordova.JSON.JsonHelper.Deserialize<FXOption>(options);

        if (opts != null)
        {
            try
            {
                switch (opts.fxType)
                {
                    case FXType.Load:
                        loadSound(opts.audioSrc, opts.audioRef);
                        break;
                    case FXType.Play:
                        Dictionary<string, SoundEffect>.KeyCollection keyCol = fxSoundMap.Keys;
                        foreach (string tmp in keyCol)
                        {
                            if ((opts.audioRef).Equals(tmp))
                                playSound(fxSoundMap[tmp]);
                        }
                        break;
                }
            }
            catch
            {
                Debug.WriteLine("PGSoundFX: loadSound Error ... null parameter(s).");
            }
        }
    }

    /// <summary> 
    /// Loads a wav file into an XNA Framework SoundEffect. 
    /// </summary> 
    /// <param name="Sound">The SoundEffect to play.</param> 
    private void playSound(SoundEffect Sound)
    {
        Sound.Play();
        DispatchCommandResult(new PluginResult(PluginResult.Status.OK));
    }

    /// <summary> 
    /// Loads a wav file into an XNA Framework SoundEffect. 
    /// </summary> 
    /// <param name="SoundFilePath">Relative path to the wav file.</param> 
    /// <param name="Sound">The SoundEffect to load the audio into.</param> 
    private void loadSound(String SoundFilePath, String SoundName)
    {
        if (fxSoundMap.Keys != null)
        {
            Dictionary<string, SoundEffect>.KeyCollection keyColl = fxSoundMap.Keys;
            foreach (string tmp in keyColl)
            {
                if (SoundName.Equals(tmp))
                    return;
            }
        }

        SoundEffect Sound = null;

        try
        {
            // Holds informations about a file stream. 
            StreamResourceInfo SoundFileInfo = Application.GetResourceStream(new Uri(SoundFilePath, UriKind.Relative));
            // Create the SoundEffect from the Stream 
            Sound = SoundEffect.FromStream(SoundFileInfo.Stream);
            fxSoundMap[SoundName] = Sound;
            DispatchCommandResult(new PluginResult(PluginResult.Status.OK));
        }
        catch (NullReferenceException)
        {
            Debug.WriteLine("Couldn't load sound " + SoundFilePath);
        }
        } 
    }
}

Javascript:プラグイン:

PhoneGap.addConstructor(function() {

navigator.plugins.pgSoundFX = 
{
    playSound:function(fxName)
    {
    var options = {"audioRef":fxName,"fxType":1};
    PhoneGap.exec(null, null, "PGSoundFX", "groAudio", options);
    },

    loadSound:function(fxSrc, fxName)
    {
    var options = {"audioSrc":fxSrc,"audioRef":fxName,"fxType":0};
    PhoneGap.exec(null, null, "PGSoundFX", "groAudio", options);
    }
}
});

Javascript:使用:

//NOTE: Allows you to pre-load sound effect files

//initialize pgSoundFX plugin
if (!navigator.plugins) {
    console.log("plugIns do not exist!");
    navigator.plugins = {};
}

navigator.plugins.pgSoundFX.loadSound("www/audio/file1.wav", "item1");
navigator.plugins.pgSoundFX.loadSound("www/audio/file2.wav", "item2");
navigator.plugins.pgSoundFX.loadSound("www/audio/file3.wav", "item3");
    :
    :

//NOTE: Play whenever needed
navigator.plugins.pgSoundFX.playSound("item1");

もちろん、ファイルの場所 (www/audio/)、名前 (file1 など)、および参照名 (item1 など) は任意です。ほとんどの場合と同様に、このコードを改善する方法はたくさんあります...自由に感じてください。私のユース ケースでは、サイズが 28k ~ 364k の範囲の 5 つの .wav ファイルをプリロードし、ユーザーのゲーム プレイ中にそれらを再生します。

于 2012-07-06T21:02:01.507 に答える
0

問題は、Silverlight がページごとに 1 つのメディア インスタンスしか許可しないという制限にあると思います...そして PG/Cordova は本質的に単一ページの webBrowser インスタンスであるため、1 つのメディア インスタンスしか持てません。この問題を回避するために、XNA SoundEffect プラグインを構築して遊んでいます。

于 2012-06-22T17:51:07.423 に答える
0

Cordova のバグでした https://issues.apache.org/jira/browse/CB-941

gitHub のレポにある purpulecabbage によって解決されました。バグレポートのコメントを参照してください。

于 2012-09-28T17:11:23.730 に答える
0

私はそれを試していないので、それが正しい答えであるかどうかはわかりませんが、ブレインストーミングと考えてください.

最初にctorでオーディオを作成し、成功したら再生するだけで、エラーが発生した場合は最初にコードvar my_media = new Media(src, onSuccess, onError);でリリースしてみてください。media.release

リリースする他のイベントまたはアクションがわかっている場合は、それがより適切になります。

編集: メディアに使用していないことに気付きました。たとえば、メディアが null でない場合の最初に最初に停止しようとするstopなど、必要なときに使用することもできます。playMP3()

乾杯。

于 2012-06-20T08:38:39.773 に答える