konto usunięte

Temat: Zwrócenie czasu trwania mp3

Pytanie za sto punktów - potrzebuję zwrócić i zapisać do własności obiektu AudioFile, czas trwania pliku mp3. Problem polega na tym, że ta wartość widoczna jest tylko w ciele funkcji wywoływanej przy zajściu eventa Event.COMPLETE, a muszę mieć do niej dostęp w innej funkcji. Z grubsza

/**
* Wyświetla okno wyboru plików mp3
*/
private function addFiles():void{
var localFile:File = new File();
var txtFilter:FileFilter = new FileFilter("Mp3", "*.mp3");
localFile.browseForOpenMultiple("Wybierz pliki mp3",[txtFilter]);
localFile.addEventListener('selectMultiple', filesSelected);
}
/**
* Dodaje wybrane pliki mp3 do biblioteki
*/
private var _fileListCount:int;
private var _files:Array;
private function filesSelected(e:FileListEvent):void{
_fileListCount = 0;
_files = e.files;
loadDetails();
}

private function loadDetails(currentCount:int = 0):void
{
var urlReq:URLRequest = new URLRequest(_files[currentCount].nativePath);
s = new Sound();
s.addEventListener(Event.COMPLETE, addAdditionalInfoToFile);
//----------------------------------- i tu w tej funkcji
pobierany jest czas, ALE
TUTAJ, PONIŻEJ WYWOŁUJE SIĘ KOLEJNA FUNKCJA W LISTENERZE, W KTÓREJ POTRZEBUJĘ WYKORZYSTAĆ TĘ WARTOŚĆ
if (!s.hasEventListener(Event.ID3)){
s.addEventListener(Event.ID3,onID3InfoReceived);
}
s.load(urlReq)
}
private function addAdditionalInfoToFile(event:Event):void{

var mySound:Sound = event.target as Sound;
var songLen:Number;
songLen = mySound.length / mySound.bytesLoaded * mySound.bytesTotal;
songLen = Math.round(songLen / 1000);
var m:Mp3Player = new Mp3Player();
String(m.formatTimeValue(s.length/1000)))
//------------------------ ta instrukcja zwaraca czas w formacie
00:00:00 i tę wartość potrzebuję w dalszej kolejności przekazać DO FUNKCJI PONIŻEJ
}

private function onID3InfoReceived(event:Event):void
{
//tutaj wykorzystuje tagi ID3 , ktore przypisuję do paramentów obiektu AudioFile i tutaj też chciałabym przypisac wartość CZAS do jednego z parametrów. Później obiek ten jest dodawany do kolekcji, a nastepnie kolekcja służy jako dataProvider dla AdvancedDataGrid'a
}

Problem leży w tym, że nie posiadam dostepu do wartosci CZAS poza funkcją addAdditionalInfoToFile, a że listenery wywołują się asynchronicznie, jest jeszcze tak, ze najpierw wywoła się onID3 a potem dopiero kończy się addAdidionalInfo...no i jestem troche w d...moze sie okazać, że cały ten fragment trzeba będzie przepisać...tylko jak?

JAkiekolwiek sugestie będą mile widziane, bo już popadam w desperację...:)
Albert D.

Albert D. Software Developer

Temat: Zwrócenie czasu trwania mp3

Czy możesz opóźnić ten fragment:
if (!s.hasEventListener(Event.ID3)){
s.addEventListener(Event.ID3,onID3InfoReceived);
}
i dodać go w obsłudze COMPLETE (addAdditionalInfoToFile), przypisujac jednoczesnie wartosc czasu pobrana w COMPLETE do atrybutu obiektu albo jakiejs tablicy tak zeby miec dostep do niej w onID3InfoReceived?

Albo innym rozwiazaniem jest zbudowac najpierw kolekcje dla dataProvidera, w COMPLETE uzupelniac ta kolekcje o potrzebny czas, a potem przypisac ta kolekcje do dataProvidera.

konto usunięte

Temat: Zwrócenie czasu trwania mp3

Okazuje się , że pierwsza opcja dała po części radę, ale nie do końca...nadal przy np. ładowaniu 3 czy więcej liczby mp3, ten czas zaczyna po chwili wariować...zamiast 6:00 jest np. 5:09, albo 0:00...Jest super jesli ładuje się jedną mp3, ale przy wielu nadal jest problem...Katarzyna Jasik edytował(a) ten post dnia 11.05.11 o godzinie 01:32
Albert D.

Albert D. Software Developer

Temat: Zwrócenie czasu trwania mp3

Nie wiem jak to zaimplementowalas ale powinnas stworzyc kolekcje widoczna w obu funkcjach w ktorej bedzie przechowywany obiekt typu Sound i czas jego trwania (przypisane w addAdditionalInfoToFile) a potem w onID3InfoReceived
przeszukujesz ta kolekcje porownujac pole typu Sound z event.target - tam gdzie sa rowne masz czas trwania danej mp3.
Nie jest to "ladne" rozwiazanie ale dziala u mnie przy ladowaniu obrazkow do grida - w trakcie ladowania pobieram i wyswietlam ilosc zaladowanych bajtow, zeby widziec postep ladowania.
Na razie nie znalazlem lepszego rozwiazania tego problemu a Flex niedawno zaczalem sie bawic.Albert D. edytował(a) ten post dnia 11.05.11 o godzinie 11:51

konto usunięte

Temat: Zwrócenie czasu trwania mp3

Zaimplementowane jest tak:
1.Funkcja loadDetail() w której tworzę obiekt sound1 i do niego podpinam listenera (event.Complete, addAdditionalInfo). Potem sound1.load(url):
2.Funckja addAdditionalInfo:
var mySound:Sound = event.target as Sound;
//pobieram czas trwania mp3 i przypisuje
mp3Length[mp3Counter] = String(m.formatTimeValue(mySound.length/1000));

I już tutaj nie pobiera się tak jak trzeba. Początkowe się pobierają dobrze, potem mam wrażenie, jakby funkcja load() nie kończyła się wykonywać i dlatego niektóre wartości czasu nie zdążą sie 'policzyć' Potem wartości są albo krótsze niż być powinny, albo takie same jak w przypadku poprzedniej mp3, albo w ogole ich niema.

//podpinam listenera wywołującego funkcję onID3InfoReceived
sound2.addEventListener(Event.ID3,onID3InfoReceived);
sound2.load(new URLRequest(mySound.url));
3.Funkcja onID3InfoReceived
//tutaj przypisuje wartości czasu zapisane w Array'u do obiektu AudioFile
for each(var a:AudioFile in ac.audioCollection){
var destIndex:int = ac.audioCollection.getItemIndex(a);
a.fileDuration = mp3Length[destIndex];
}

Może problem leży w tym, że id3 pobierane są szybciej niż czas i wszystko się rozjeżdża...Może zamiast Array'a przechowującego obiekty typu String z wartościami czasu, powinnam stworzyć kolekcję obiektów Sound?
Albert D.

Albert D. Software Developer

Temat: Zwrócenie czasu trwania mp3

Rozjeżdża Ci się na indeksowaniu mp3Length.
Upewnij się, że mp3Counter ma taka sama wartość co
var destIndex:int = ac.audioCollection.getItemIndex(a);
dla określonego a (AudioFile).
Niedawno miałem dokładnie ten sam problem przy ladowaniu obrazkow :)

Zastosowanie kolekcji nie rozwiąże problemu - zmieni się tylko podejście do
sposobu wyszukiwania interesujacego Cie wiersza.

Wygląda na to że robisz identyczną funkcjonalność co ja tylko ładujesz mp3 zamiast obrazków i napotykasz na te same problemy :)

konto usunięte

Temat: Zwrócenie czasu trwania mp3

Mimo uzależnienia indeksu od indeksu rozważanego obiektu audioFile, nadal się mieszają, zamieniają się miejscami wartości czasu...Cały czas mam wrażenie że to kwestia spóźnionego działania addAditionalInfo...Katarzyna Jasik edytował(a) ten post dnia 11.05.11 o godzinie 18:42

Następna dyskusja:

ByteArray z mikrofonu do m...




Wyślij zaproszenie do