【问题标题】:Phonegap Sound stops playing after calling playAudio() 30 to 40 timesPhonegap Sound 在调用 playAudio() 30 到 40 次后停止播放
【发布时间】:2014-03-29 12:55:51
【问题描述】:

在我的应用程序中,我在鼠标点击时给出了声音响应。我就是这样做的

我已经这样调用函数了

<center><input id="click_flip" type="button" value="Click Me" class="clickme" onclick="callplay()"></center>

这里是函数

<script type="text/javascript" charset="utf-8">

        function callplay()
        {
                                         if(voice=="male")
                                        playAudio('/android_asset/www/Mobile/sound/Male/'+rand1+'.mp3');
                                        else
                                        playAudio('/android_asset/www/Mobile/sound/Female/'+rand1+'.mp3');
        }
        // Audio player
        //

      var my_media = null;

        // Play audio
        //
        function playAudio(src) {




                // Create Media object from src

                my_media = new Media(src, onSuccess, onError);
            // else play current audio
            // Play audio
            my_media.play();



        }





        // onSuccess Callback
        //
        function onSuccess() {
            console.log("playAudio():Audio Success");
        }

        // onError Callback 
        //
        function onError(error) {
         //   alert('code: '    + error.code    + '\n' + 
                  'message: ' + error.message + '\n');
        }


        </script>

但是当我重复按钮单击多次(大约 30 到 40 次)时。声音没有给出任何响应。

之后使用这个link我已经添加了这个功能

if(my_media){ 
   my_media.stop();
   my_media.release();
 }

也试过了

function playAudio(url) {
    try {

        var my_media = new Media(url,
            // success callback
            function () {
                **my_media.release();**
            },
            // error callback
            function (err) {
                **my_media.release();**
            });

        // Play audio
        my_media.play();
    } catch (e) {
        alert(e.message);
    }
}

但不工作。请推荐

【问题讨论】:

    标签: android cordova media


    【解决方案1】:

    我有同样的问题,并通过在创建新媒体之前发布以前的媒体来解决问题:

    var my_media = null;
    
    function playAudio(src)
    {
        if(my_media != null) my_media.release();
        my_media = new Media(src);
        my_media.play();
    }
    

    如果你释放你不需要停止的硬件,因为释放会自动停止当前媒体。不知何故,如果您尝试在成功或错误回调中释放它并不总是有效。

    有时(尤其是用户输入)如果您在前一个媒体未完成之前尝试播放新媒体,整个事情就会中断。

    【讨论】:

      【解决方案2】:

      在我的情况下,我有手机间隙的扫描应用程序。 当通过我们的 API 扫描票扫描失败时,它会振动并发出哔哔声。 并且通过我们的 API 扫描票有无振动的成功声音。

      35 到 40 次后,它无法振动或播放声音。

      修复前的代码:

      在 HTML 中

          <audio id="successSound" 
            src="/android_asset/www/audio/correct.mp3" 
            type="audio/mpeg">
           </audio>
      
      
      
      var my_media = null;
      var mediaTimer = null;
      
      function playAudio(id) {
          var audioElement = document.getElementById(id);
          var src = audioElement.getAttribute('src');
          // Create Media object from src
          // alert(src);
          // alert(getPathMedia());
          my_media = new Media(src, onSuccess, onError);
      
          // Play audio
          my_media.play();
      
          // Update my_media position every second
          if (mediaTimer == null) {
              mediaTimer = setInterval(function() {
                  // get my_media position
                  my_media.getCurrentPosition(
                      // success callback
                      function(position) {
                          if (position > -1) {
                              setAudioPosition((position) + " sec");
                          }
                      },
                      // error callback
                      function(e) {
                          console.log("Error getting pos=" + e);
                          setAudioPosition("Error: " + e);
                      }
                  );
              }, 1000);
          }
      }
      
      // Pause audio
      function pauseAudio() {
          if (my_media) {
              my_media.pause();
          }
      }
      
      // Stop audio
      function stopAudio() {
          if (my_media) {
              my_media.stop();
          }
          clearInterval(mediaTimer);
          mediaTimer = null;
      }
      
      // onSuccess Callback
      //
      function onSuccess() {
          // alert('success');
      }
      
      // onError Callback
      function onError(error) {
          switch(error.code){
              case MediaError.MEDIA_ERR_ABORTED:
              alert('MEDIA_ERR_ABORTED code: '    + error.code);
              break;
              case MediaError.MEDIA_ERR_NETWORK:
              alert('MEDIA_ERR_NETWORK code: '    + error.code);
              break;
              case MediaError.MEDIA_ERR_DECODE:
              alert('MEDIA_ERR_DECODE code: '    + error.code);
              break;
              case MediaError.MEDIA_ERR_NONE_SUPPORTED:
              alert('MEDIA_ERR_NONE_SUPPORTED code: '    + error.code);
              break;
              default:
              {
                  alert('Un Known: '    + error.code);
                  navigator.notification.vibrate(2000);
                  playAudio("errorSound");
              }
          }
      }
      
      function setAudioPosition(position) {
          document.getElementById('audio_position').innerHTML = position;
      }
      

      修复后的代码:

      var failCounter = 0;
      var successCounter = 0;
      
      var srcSuccess = "/android_asset/www/audio/correct.mp3";
      var srcFail = "/android_asset/www/audio/error_long.mp3";
      
      var my_media_success = null;
      var my_media_fail = null;
      function playAudioSuccess() {
          // stopAudio(my_media);
          if (my_media_success != null) {
              my_media_success.release();
          }
          successCounter = successCounter + 1;
          // Create Media object from src
          // alert(src);
          // alert(getPathMedia());
          try {
              my_media_success = new Media(srcSuccess, onSuccess, onError);
              // my_media.setVolume('1.0');
              // if (successCounter >= 35) {
              //     alert("success count " + successCounter + " total counting " + ( successCounter + failCounter));
              // }
              // Play audio
              my_media_success.play();
      
          } catch (err) {
              alert(err);
          }
      
      }
      
      function playAudioFail() {
          try {
              // stopAudio(my_media);
              if (my_media_fail != null) {
                  my_media_fail.release();
              }
      
              failCounter = failCounter + 1;
              // Create Media object from src
              // alert(src);
              // alert(getPathMedia());
              my_media_fail = new Media(srcFail, onSuccess, onError);
              // my_media_fail.setVolume('1.0');
              // if (failCounter >= 35) {
              //     alert("fail count " + failCounter + " total counting " + ( successCounter + failCounter));
              // }
      
              // Play audio
              my_media_fail.play();
          } catch (err) {
              alert(err);
          }
      }
      
      // Pause audio
      function pauseAudio() {
          if (my_media) {
              my_media.pause();
          }
      }
      
      // Stop audio
      function stopAudio(my_media) {
          if (my_media) {
              my_media.stop();
          }
          // clearInterval(mediaTimer);
          // mediaTimer = null;
      }
      
      // onSuccess Callback
      //
      function onSuccess() {
          // alert('success');
      }
      
      // onError Callback
      function onError(error) {
          switch(error.code){
              case MediaError.MEDIA_ERR_ABORTED:
              alert('MEDIA_ERR_ABORTED code: '    + error.code);
              break;
              case MediaError.MEDIA_ERR_NETWORK:
              alert('MEDIA_ERR_NETWORK code: '    + error.code);
              break;
              case MediaError.MEDIA_ERR_DECODE:
              alert('MEDIA_ERR_DECODE code: '    + error.code);
              break;
              case MediaError.MEDIA_ERR_NONE_SUPPORTED:
              alert('MEDIA_ERR_NONE_SUPPORTED code: '    + error.code);
              break;
              default:
              {
                  alert('Un Known: '    + error.code);
                  navigator.notification.vibrate(1000);
                  setTimeout(function() {
                      playAudioFail();
                  }, delayInMilliseconds);
              }
          }
      }
      
      function setAudioPosition(position) {
          document.getElementById('audio_position').innerHTML = position;
      }
      

      经过大量的尝试和错误以及各处的警报!

      1) 我避免使用getElementById 来获取我刚刚将其定义为全局变量的 src 路径。

      2)我将成功和失败的方法分开(重构)

      3) 我尽可能将变量设为局部变量,以避免任何内存泄漏、重叠和超出堆栈等。

      4) 我删除了setAudioPosition 方法,因为它没有被使用和无故调用。

      (经验教训)当您从 Internet 获取代码时,请注意您真正需要的内容。

      5) 我注意到当我添加警报时它起作用了,但是当我删除它们时它不起作用,所以我的

      MAIN SOLUTION在第一次调用的振动和像这样的关键部分的播放方法之间添加Timeout

      navigator.notification.vibrate(1000);
                  setTimeout(function() {
                      playAudioFail();
                  }, delayInMilliseconds);
      

      6) 我添加了发布方法,但是

      (经验教训)注意把它放在哪里 所以我把它放在自己调用游戏之前,当然要正确引用同一个变量。

      if (my_media_fail != null) {
                  my_media_fail.release();
              }
      

      7) 最后一个建议作为它的 javascript,你可以使用 try 和 catch 以防万一)) Try catch W3School

      【讨论】:

        猜你喜欢
        • 2012-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-14
        • 1970-01-01
        • 2020-02-09
        • 2012-07-18
        相关资源
        最近更新 更多