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 не работает. Я ставлю разные $('#lblDuración').find('span').text('enters'); с разными числами, чтобы увидеть, какое значение появилось в 'lblDuración', и оно равно 'enters5', но оно также переходит из строки $('#lblEstado').find('span').text(objReproductor.getDuration() ); который возвращает -1.


person Iban Arriola    schedule 31.10.2013    source источник


Ответы (3)


Даже если файловая система определенно говорит: /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();
}
person Community    schedule 06.11.2013
comment
Спасибо за ответ. Я уже проверил документы на phoneGap для конструктора Media(). Я пытался следовать примеру, который там появляется, но у меня это не сработало. Я знаю, что значение -1 означает, что продолжительность неизвестна, но почему продолжительность неизвестна? Это должно быть из-за ошибки, которую он получает, потому что я использую обычный mp3-файл с фиксированной продолжительностью. - person Iban Arriola; 06.11.2013
comment
Это определенно не ошибка, пока обратный вызов onError не срабатывает - думаю, он работает только с локальными файлами - хотя путь там немного странный, например. /android_assets/... лучшая практика - слишком подключить функцию к обратному вызову onError и записать ее вывод на консоль (но я думаю, что она даже не будет запущена). Это не C, и документально подтверждено, что возвращаемое значение -1 не является ошибкой. - person Martin Zeitler; 07.11.2013
comment
Я использую путь /android_assets/..., и песня воспроизводится, поэтому новый носитель (...) работает хорошо. Но я не знаю, почему метод getDuration() всегда возвращает -1. - person Iban Arriola; 07.11.2013
comment
вы уверены, что применяете этот цикл с разделением по времени, как в примере - при вызове его только один раз он всегда будет возвращать -1 - поэтому console.info(val) должен регистрировать 20 раз -1, если это действительно так. Можете попробовать это здесь один раз - из любопытства, сколько попыток требуется, чтобы получить значение. - person Martin Zeitler; 10.11.2013
comment
Я также пытаюсь использовать getCurrentPosition, и это тоже не работает. Это даже не входит в метод. Я буду в этой теме, чтобы показать вам, как у меня это сейчас. - person Iban Arriola; 10.11.2013
comment
проверьте мой обновленный ответ, -1, скорее всего, означает «файл не найден». - person Martin Zeitler; 10.11.2013
comment
Я использовал /android_asset/... и это не может быть ошибка «файл не найден», потому что файл воспроизводится, я его слышу, и play(), pause() и stop() работают хорошо. Только метод продолжительности вызывает у меня проблемы. И getDuration, и getCurrentPosition у меня не работают. Я пытаюсь использовать код, который вы указали, но он продолжает возвращать -1. - person Iban Arriola; 11.11.2013
comment
Я предполагаю, что вы, вероятно, просто разместили аудиофайл не в том месте - я пробовал его в течение довольно долгого времени и всегда получал -1, исследовал код Java - и выяснил, почему. Кроме того, вы можете себе представить, что вашему AndroidManifest.xml может не хватать прав на запись временного файла .3gp. - person Martin Zeitler; 12.11.2013
comment
Вы вызываете функцию прямо в своем коде - так она определенно не работает - я бы посоветовал в первую очередь избавиться от некоторой сложности - и попытаться использовать цикл с разделением по времени, чтобы получить продолжительность. - person Martin Zeitler; 12.11.2013
comment
Честно говоря, нельзя применять логику к чему-то, что ведет себя нелогично... если не возвращаются продолжительность и позиция, файл находится не в том месте (или неправильный путь) - даже если все остальное работает. - person Martin Zeitler; 12.11.2013
comment
Я имею в виду, что приведенный выше код доказал свою работоспособность, хотя я не думаю, что буду больше тратить на это время (просто потому, что другие люди платят мне за написание сценариев). - person Martin Zeitler; 15.11.2013
comment
Я все больше и больше тестировал все функции, которые предоставляют носители, и пришел к выводу, что асинхронные функции не работают, а синхронные работают. Надеюсь, поможет. - person Iban Arriola; 17.11.2013

Плагин Cordova удалить Cordova-plugin-media

а потом

плагин Cordova добавить [email protected]

person Ivan Paredes    schedule 12.08.2016

Если кто-то все еще ищет ответ на getDuration() для cordova-plugin-media. Вы можете сослаться на ответ здесь.

person Kevin Ng    schedule 22.04.2020