konto usunięte

Temat: Problem z klasą Sound i ID3

Mam problem z dotarciem do informacji ID3 z pliku mp3. Mam 2 funkcje:
1. Pobiera plik mp3 z dysku i wyciąga z niego kilka własności. Tworze sobie globalną zmienną s:Sound i ładuje do niej url pliku pobranego w funkcji.Dopisuje eventListener, który dobiera sie do informacji ID3.

private var s:Sound = new Sound();
private function filesSelected(e:FileListEvent):void{

for(var i:Number = 0;i<a.length;i++){
var f:File = File(a[i]);
var audioFile:AudioFile = new AudioFile();
audioFile.fileName = f.name;
audioFile.filePath = f.nativePath;
audioFile.url = f.url;

var urlReq:URLRequest = new URLRequest(f.nativePath);
s.addEventListener(Event.ID3,onID3InfoReceived);
s.load(urlReq);

ac.audioCollection.addItem(audioFile);
listOfAudio_id.dataProvider = ac.audioCollection;
}

2. Ta funkcja pobiera tagi z pliku mp3 i zapisuje je w tablicy. I tu wszystko ładnie śmiga, ale ni jestem w stanie zwrócić tych informacji do tej pierwszej funkcji, a muszę to zrobić, gdyż tam tworzy się lokalna zmienna audioFile to której te informacje muszę przekazać. audioFile nie może być zmienną globalną.

private function onID3InfoReceived(event:Event):void
{
var id3:ID3Info = event.target.id3;
var i:int = 0;
var ID3tags:Array = new Array(); //tablica z info o ID3
for(var propName:String in id3)
{
ID3tags[propName]=[id3[propName]];
} }

I jeszcze jedno pytanko: w pierwszej funkcji jak przypisuję url pliku do obiektu sound, przy debugowaniu pokazuje mi że wszystkie własności tego obiektu są albo 0 albo null, łącznie z url'em...chociaż plik się odgrywa bez problemu...

Będę wdzięczna za pomoc, bo już mnie to wkurza :)Katarzyna Jasik edytował(a) ten post dnia 28.12.10 o godzinie 12:58
Piotr Zarzycki

Piotr Zarzycki Open Source
Developer

Temat: Problem z klasą Sound i ID3

Witam. :)

Rozwiązaniem może być załadowanie wszystkich informacji i dopiero na końcu dodanie każdego AudoFile do kolekcji itd. Miałem zbliżony problem.


//aktualny licznik plikow
private var _fileListCount:int;
private var _files:Array;
private var _file:Object;
//Informacje
private var _info:Array;

private var s:Sound = new Sound();

private function filesSelected(e:FileListEvent):void
{
//a jest zmienna prywatna ?
_filesListCount = a.length;
_files = a;
loadDetails();
}

private function loadDetails(currentCount:int = 0):void
{
if (currentCount < _files.length)
{
var urlReq:URLRequest = new URLRequest(f.nativePath);
s.addEventListener(Event.ID3,onID3InfoReceived);
s.load(urlReq);
}
}

private function onID3InfoReceived(event:Event):void
{
//dodajemy wszystkie informacje ktore sa potrzebne
//Prosze utworzyc jakis obiekt zawierajacy wszelkie niezbedne informacje
_info.push({});
if (_fileListCount == _files.length)
{
for (var i:int = 0; i < _info.length; i++)
{
//wszystkie operacje
//var f:File = File(a[i]);
//var audioFile:AudioFile = new AudioFile();
//audioFile.fileName = f.name;
//audioFile.filePath = f.nativePath;
//audioFile.url = f.url;
//ac.audioCollection.addItem(audioFile);
//listOfAudio_id.dataProvider = ac.audioCollection;
}
}
else
{
_fileListCount++;
loadDetails(_fileListCount);
}
}


Pozdrawiam.;)

konto usunięte

Temat: Problem z klasą Sound i ID3

Ok, trochę przerobiłam...w sumie z tym przeniesieniem audioFile'a to nie był zły pomysł. Tyle tylko, że mam teraz nowy problem. Funkcja onID3InfoReceived() z jakiegoś powodu wywołuje się dwukrotnie! Więc do dataGrida z plikami zamiast jednego, lądują dwa...

Pytanie, czy s.load() nie powoduje ponownego wywołania listenera? Trochę by to było bez sensu, ale..

konto usunięte

Temat: Problem z klasą Sound i ID3

Ok, temat ogarnięty. Z dużą pomocą p.Piotra - facet ma łeb! :) Dzięki.

Następna dyskusja:

Flex & telnet Client problem




Wyślij zaproszenie do