Media.getduration返回-1

时间:2013-10-31 16:41:05

标签: cordova phonegap-build

我正在尝试获取音频文件的持续时间。为此,我使用以下代码:

$.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('enter');使用不同的数字来查看'lblDuracion'中显示的值是什么,它是'enter5'但它也从$('#lblEstado')行传递.find('span')。text(objReproductor.getDuration() );返回-1。

3 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

cordova插件删除cordova-plugin-media

然后

cordova插件添加cordova-plugin-media@2.3.0

答案 2 :(得分:0)

如果有人仍在寻找cordova-plugin-media的getDuration()答案。您可以参考答案here