Media.getduration returns -1

南楼画角 提交于 2019-12-23 10:49:10

问题


I am trying to get the duration of the audio files. For that I am using the following code:

$.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
        });
    });

I saw in some forums that setInterval was mandatory to use getDuration, that is why I use it but it is not giving me any result. The file is loaded well because I can hear it and it enters in GetCurrentPosition because the text "duration = -1" appears so it is clear that is giving -1 value. How can I make to get the correct duration value?

EDIT

I put more code and also add getCurrentPosition witch is not working. I put different $('#lblDuracion').find('span').text('enters'); with different numbers to see what was the value that appears in 'lblDuracion' and it is 'enters5' but it also passes from the line $('#lblEstado').find('span').text(objReproductor.getDuration()); that returns -1.


回答1:


Even if the file-system definitely says: /android_assets

The function expects /android_asset - or it will return -1 as an undocumented "file not found".

Calling the .getDuration() method requires a time-sliced loop - else it will return -1 as well.

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();
}



回答2:


cordova plugin remove cordova-plugin-media

and then

cordova plugin add cordova-plugin-media@2.3.0



来源:https://stackoverflow.com/questions/19712124/media-getduration-returns-1

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!