PDA

Просмотр полной версии : Seek Bar для mp3-плеера созданный вручную косячит


alexeyco
13.11.2008, 00:15
Здравствуйте!

У меня маленький вопрос. Я лепил mp3-плеер на локалке. Все замечательно работает но на локалке. Как только дело дошло до испытаний в интернете, случилось следующее:

1. ID3-теги читаются только после того, как звук полностью будет загружен.

2. Самодельный seek bar скачет, т.к. my_sound.duration во время загрузки меняется.

Как бороться с первой проблемой - я ума не приложу. Вторая проблема кажется мне разрешимой: ведь еще до завершения загрузки можно получить общее кол-во данных... и кол-во загруженных.

Получается, в случае когда звук еще не загружен (байтс лоадед != байтс тотал) мы можем динамически вычислить длину трека. То есть.. ну конечно если кол-во байтов целиком и полностью зависит от длины трека (в чем я кстати сомневаюсь), мы можем прикинуть сколько в загруженной длительности трека байтов и спроецировать это на общее кол-во байтов. И хоть как-то отрисовать сикбар...

Господа, посоветуйте, пожалуйста, что делать...

etc
13.11.2008, 00:31
1. Значит они записаны в конце файла;

2. Конечно изменяется, это время проигрывания загруженной части.

alexeyco
13.11.2008, 00:36
Ну хорошо... я просто не разбираюсь в спецификации мп3... нельзя разобрать id3-теги до полной загрузки - черт с ними, уберем их совсем.

Парит seek bar. Как определить суммарную длину трека (время) до (в процессе) загрузки? Или посоветуйте как выйти из положения?

scarbo
13.11.2008, 00:38
var KonSound:Sound = new Sound()
var L = KonSound.getBytesLoaded();
var T = KonSound.getBytesTotal();
var ST = KonSound.duration*T/L/1000;
Выдаст в секундах

etc
13.11.2008, 00:47
alexeyco, надо сделать так, чтобы ID3-теги шли в начале файла (а это, кажется, теги первой версии). Тогда при получении тегов можно получить и время трека (тег TIME или как-то так).

scarbo, никаких секунд не будет, будет некая цифра, которая от реальных секунд такая же далекая, как Москва от Токио.

alexeyco
13.11.2008, 01:15
Ну а как (какой программой ли) сделать чтобы теги шли в начале?

scarbo
13.11.2008, 01:47
ну не так уж и на много,на 2-4 сек,Понятно дело,что время трека можно и через xml и ID3-теги передавать.

alexeyco
13.11.2008, 02:26
Я пока вот что придумал:function getDuration (my_sound:Sound) {

var total = my_sound.getBytesTotal();
var loaded = my_sound.getBytesLoaded();

if (loaded == total) {

_root.isLoaded = true;
return my_sound.duration;

} else if (my_sound.id3.TIME != undefined) {

return my_sound.id3.TIME;

} else {

return my_sound.duration * (total / loaded);

}

} // getDuration();Это может и не с хирургической точностью отражает картину, но спасает сильно - не так дрыгается бегунок... когда _root.isLoaded == true - кадр перестает запаривать эту функцию и просто пользуется своей переменной _root.trackDuration...

Возникает другой вопрос - я пользовался AIMP'ом - так вот после очистки ID3 и его восстановлении ничего хорошего не произошло - то есть, переменная my_sound.id3.TIME не перестала быть undefined... помогите пожалуйста разобраться

etc
13.11.2008, 12:41
ну не так уж и на много,на 2-4 сек,
Битрейты разные бывают, более того — переменные.