2016-06-27 10 views
7

ここに私のプレイ機能があります:私は複数の場所でsetVolume()を見ることができます。これは全く効果がありません。私は0.8、0.2に設定しようとしましたが、動作しても問題ありません。私はまた、値がObj-Cモジュール内の浮動小数点valに変換されるので、実際には問題にならない非文字列値を試しました。私はまた、値が正しく渡されていることを保証するためにNSLoggedしています。Cordova Media Plugin setVolume()not working

iPadでテストするiOS 9.2 |コルドバ6.2 | Cordova Media Plugin 2.3.1。

play: function(src, seekTime) 
     { 
      App.Log.info('Playing audio source', src); 
      seekTime = seekTime ? seekTime : 0; 
      var obj = { 
       source: src, 
       startTime: new Date().getTime(), 
       seekTime: seekTime, 
       duration: 0, 
       preloadedNext: false, 
       audioSource: false 
      }; 
      obj.audioSource = new Media(src, function(event){ 
       $this.player().onAudioEnd(event, obj); 
      }, function(){ 
       //on error 
      }, function(status) 
      { 
       obj.audioSource.setVolume("0.0"); 
       if(status == 2){ 
        obj.audioSource.setVolume("0.0"); 
        obj.audioSource.seekTo(obj.seekTime * 1000); 
        obj.timer = setInterval(function(){ 
         obj.seekTime++; 
         obj.duration = obj.audioSource._duration; 
         if(obj.duration < 0){ 
          return; 
         } 
         if(obj.seekTime >= (obj.duration - $this.default.fadeTime)) 
         { 
          if(obj.preloadedNext){ 
           return; 
          } 
          obj.preloadedNext = true; 
          $this.player().preloadNext(obj); 
         } 
        }, 1000); 
       } 

      }); 
      obj.audioSource.setVolume("0.0"); 
      obj.audioSource.play(); 
      obj.audioSource.setVolume("0.0"); 
      obj.audioSource.seekTo(obj.seekTime * 1000); 
      console.log('Audio Source', JSON.stringify(obj)); 
      $this.playing.push(obj); 
} 

どのようなヘルプや指示が素晴らしいでしょう。

+0

issues.cordova.io – jcesarmobile

+0

のバグレポートの記入を検討してください。「Android」バージョンを確認しましたか?私はすぐに私の上に 'mac'を持っていませんが、実行をチェックしましたか?https://github.com/apache/cordova-plugin-media/blob/master/src/iosで' if'を入力してください/CDVSound.m#L260? – oak

+0

@ anthony.cサンプルアプリケーションでメディアプラグインを試してみましたが、setvolumeはうまく動作します。テストアプリケーションを私のgithubに投稿しました - https://github.com/gandhirajan/Cordova_Mediaそれが役立つかどうかを調べてください。また、あなたが言及したプラグインのバージョンが2.3.1であることに気付きました。しかし、私がaddコマンドを使用してプラグインを追加した場合、利用できる最新のバージョンは2.3.0です。マスターブランチを調べて、役立つかどうか確認してください。私が掲示し続ける – Gandhi

答えて

1

次のサンプルコードは正常に動作し、それは、Android & iOSデバイスでテストされています

のindex.html:

<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="utf-8" /> 
     <meta name="format-detection" content="telephone=no" /> 
     <!-- WARNING: for iOS 7, remove the width=device-width and height=device-height attributes. See https://issues.apache.org/jira/browse/CB-4323 --> 
     <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" /> 
     <link rel="stylesheet" type="text/css" href="css/index.css" /> 
     <meta name="msapplication-tap-highlight" content="no" /> 
     <title>Hello World</title> 
    </head> 
    <body> 
     <button id="playMp3">Play MP3</button><br><br> 
     <button id="playMp3Mild">Play MP3 Mild</button><br><br> 
     <button id="playRemoteFile">Play Remote File</button> 

     <script type="text/javascript" src="cordova.js"></script> 
     <script type="text/javascript" src="js/index.js"></script> 
    </body> 
</html> 

index.js:

document.addEventListener('deviceready', onDeviceReady, false); 

function onDeviceReady() { 
    document.querySelector("#playMp3").addEventListener("touchend", playMP3, false); 
    document.querySelector("#playMp3Mild").addEventListener("touchend", playMp3Mild, false); 
    document.querySelector("#playRemoteFile").addEventListener("touchend", playRemoteFile, false); 

}; 

function playMP3() { 
    var mp3URL = getMediaURL("sounds/button-1.mp3"); 
    var media = new Media(mp3URL, null, mediaError); 
    media.setVolume(1.0); 
    media.play(); 
} 

function playMp3Mild() { 
    var mp3URL = getMediaURL("sounds/button-1.mp3"); 
    var media = new Media(mp3URL, null, mediaError); 
    media.setVolume(0.1); 
    media.play(); 
} 

function playRemoteFile() { 
    var media = new Media("http://SERVER_IP:PORT/media/test.mp3"); 
    media.setVolume(0.1); 
    media.play(); 
} 

function getMediaURL(s) { 
    if(device.platform.toLowerCase() === "android") return "/android_asset/www/" + s; 
    return s; 
} 

function mediaError(e) { 
    alert('Media Error'); 
    alert(JSON.stringify(e)); 
} 

サンプルアプリはgithub pageからダウンロードできます。メディアとデバイスプラグインを追加して、同じものをテストするようにしてください。詳細は、サンプルアプリケーションのREADMEファイルを参照してください。それが役に立てば幸い。

+1

@DavidNathanこんにちはDavid、私はこの問題が私の答えにどのように関係しているのか分かりません – Gandhi

0

これはあなたの問題を解決するかどうかはわかりませんが、ボリュームがゼロに設定されていない可能性があります。これは、setVolumeがあまりに早く呼び出されるためです。私のソリューションを改良するために、このコードを試して、最終的にいくつかのログを報告してください。

play: function(src, seekTime) 
     { 
      App.Log.info('Playing audio source', src); 
      seekTime = seekTime ? seekTime : 0; 
      var obj = { 
       source: src, 
       startTime: new Date().getTime(), 
       seekTime: seekTime, 
       duration: 0, 
       preloadedNext: false, 
       audioSource: false 
      }; 
      obj.audioSource = new Media(src, function(event){ 
       $this.player().onAudioEnd(event, obj); 
      }, function(){ 
       //on error 
      }, function(status) 
      { 
       obj.audioSource.setVolume("0.0"); 
       if(status == 2){ 
        obj.audioSource.setVolume("0.0"); 
        obj.audioSource.seekTo(obj.seekTime * 1000); 
        obj.timer = setInterval(function(){ 
         obj.seekTime++; 
         obj.duration = obj.audioSource._duration; 
         if(obj.duration < 0){ 
          return; 
         } 
         if(obj.seekTime >= (obj.duration - $this.default.fadeTime)) 
         { 
          if(obj.preloadedNext){ 
           return; 
          } 
          obj.preloadedNext = true; 
          $this.player().preloadNext(obj); 
         } 
        }, 1000); 
       } 

      }); 
      //obj.audioSource.setVolume("0.0"); 
      obj.audioSource.play(); 
      setTimeout(function() { //try to set volume to 0 after 10 milliseconds 
       obj.audioSource.setVolume("0.0"); 
      }, 10); 
      setTimeout(function() { //try to seekTo after 1 second 
       obj.audioSource.seekTo(obj.seekTime * 1000); 
      }, 1000); 
      console.log('Audio Source', JSON.stringify(obj)); 
      $this.playing.push(obj); 
} 
+0

上記のif(status == 2){}ブロックで気付いた場合、返信する時間をいただき、ありがとうございます。ステータス= 2の場合、オーディオファイルが「実行状態」にあることを意味します。そのブロックの外側にまだ準備ができていなくても、ボリュームコントロールができるはずです。 –

0

ミュート遅延を1秒以上に設定して、少なくとも正しい遅延動作を生成できるかどうかを確認できますか? (削除のプロセス)

setTimeout(function() { 
obj.audioSource.setVolume("0.0"); 
}, 1000);