2013-10-31 103 views
5

我正在嘗試獲取音頻文件的持續時間。對於我使用下面的代碼:Media.getduration返回-1

$.fntReproducir=function(){ 
    //obtenemos una instancia del elemento que contiene la info. de cancion a reproducir 
    var $objContenedorCancion=$('#olCanciones').children().eq(iCancionActual); 
    //obtenemos la ruta del archivo que se va a reproducir y se lo asignamos 
    //al source del audio player de HTML5 
    objReproductor = new Media($objContenedorCancion.attr('rel'), stopAudio, null); 
    //var timerDur = setInterval(GetCurrPosition, 1000); 
    //desmarcamos cualquier cancion en la lista (si es que estuviese marcada alguna) 
    $('#olCanciones li').removeClass('clsSeleccionado'); 
    //marcamos en la lista la cancion que vamos a reproducir 
    $objContenedorCancion.addClass('clsSeleccionado'); 
    meState = myMediaState.play 

    //reproducir la cancion con el metodo play 
    objReproductor.play(); 
    //PlayMusic(objReproductor); 


    $('#lblDuracion').find('span').text('enters'); 
// Play audio 
    if (objReproductor) { 
     //objReproductor.play(); 
     //document.getElementById('PlayStatusID').innerHTML = "<p></p>Status: playing..."; 
     $('#lblDuracion').find('span').text('enters2'); 
     //setButtonState(myMediaState.playback); 
     // Update media position every second 
     clearProgressTimmer(); 
     $('#lblDuracion').find('span').text('enters4'); 
     progressTimmer = setInterval(function() { 
      // get my_audio position 
      $('#lblDuracion').find('span').text('enters5'); 
      objReproductor.getCurrentPosition(
      // success callback 
      function (position) { 
       //document.getElementById('lblCancion').innerHTML = "<p></p>Status: enters "; 
       $('#lblDuracion').find('span').text('enters8'); 
       if (position >= 0){ 
        $('#lblDuracion').find('span').text('enters6'); 
        $('#lblEstado').find('span').text(position); 
       }else { 
        $('#lblEstado').find('span').text('0 sec'); 
       } 

      }, 
      // error callback 
      function (e) { 
       $('#lblEstado').find('span').text('0 sec' + e); 
      }); 

      $('#lblDuracion').find('span').text(objReproductor.getDuration()); 
      //$('#lblEstado').find('span').text(count); 
     }, 1000); 
    } 

    $('#btnPausar').val('Play'); 
    $('#btnPausar').find('img').attr('src','img/pause.png'); 
    //$('#lblDuracion').find('span').text(objReproductor.getDuration()); 
    //ocultamos suavemente los datos de la cancion anterior 
    $('#divInfoCancion').find('label').stop(true.true).animate({ 
     opacity: 0 
    },function(){ 
     //obtenemos una instancia del elemento que contiene los datos de la cancion 
     var $objContenedorCancion=$('#olCanciones').children().eq(iCancionActual);   
     //actualizamos la informacion de la cancion que se esta reproduciendo 
     //duracion total 

     //nombre de la cancion 
     //$('#lblCancion').find('span').text($objContenedorCancion.find('strong').text()); 
     $('#lblCancion').text($objContenedorCancion.find('.li_song').text()); 
     //artista 
     //$('#lblArtista').find('span').text($objContenedorCancion.find('em').text()); 
     $('#lblArtista').text($objContenedorCancion.find('.li_artist').text()); 
     //tiempo transcurrido 
     //$('#lblEstado').find('span').text('00:00'); 
     //imagen 
     $('#current_img').attr('src',$objContenedorCancion.find('img').attr('src')); 
     //mostramos suavemente la info. de la nueva cancion 
     $(this).stop(true,true).animate({ 
      opacity: 1 
     }); 
    }); 

我在一些論壇上的setInterval是強制使用getDuration看到了,這就是爲什麼我使用它,但它不給我任何結果。該文件加載得很好,因爲我可以聽到它,並且它進入GetCurrentPosition,因爲文本「duration = -1」出現,因此很明顯,它給出了-1值。我怎樣才能獲得正確的持續時間值?

編輯

我把更多的代碼,並添加getCurrentPosition巫不工作。我把不同的$('#lblDuracion')。find('span')。text('entered');使用不同的數字來查看'lblDuracion'中出現的值是什麼,它是'進入5',但它也從行$('#lblEstado')。find('span')。text(objReproductor.getDuration() );返回-1。

回答

0

即使文件系統肯定說:/ android_assets

函數需要/ android_asset - 否則就會返回-1爲無證「找不到文件」。

調用.getDuration()方法需要一個時間片循環 - 否則它也會返回-1。

playFile: function() { 

    var audiofile = new Media(
     'file:///android_asset/www/audio/Rumble_Pack_-_Mad_Robots.wav', 
     function(i){} 
    ); 

    var counter = 0; 
    var timerDur = setInterval(function() { 
     counter = counter + 100; 
     if(counter > 2000) {clearInterval(timerDur);} 
     var duration = audiofile.getDuration(); 
     if(duration > 0) { 
      clearInterval(timerDur); 
      console.debug(duration + ' seconds'); 
     } 
    }, 100); 

    audiofile.play(); 
} 
+0

感謝您的答覆。我已經檢查了MediaGet()構造函數的phoneGap上的文檔。我試圖遵循那裏出現的例子,但它並不適合我。我知道值-1意味着持續時間未知,但爲什麼持續時間未知?它必須是因爲它得到的錯誤,因爲我正在使用具有修復持續時間的普通mp3文件。 –

+0

這絕對不是「錯誤」,而onError回調沒有觸發 - 猜測它只適用於本地文件 - 而路徑有點奇怪,例如,/android_assets/...最好的實踐是掛鉤一個函數onError回調並將其輸出記錄到控制檯(但我猜它甚至不會被觸發)。這不是C並且返回值-1被記錄爲不是錯誤。 –

+0

我正在使用/ android_assets/...路徑和歌曲正在播放,所以新媒體(...)運行良好。但我不知道爲什麼getDuration()方法總是返回-1。 –

0

科爾多瓦插件刪除科爾多瓦 - 插件 - 媒體

然後

科爾多瓦插件添加[email protected]