2013-04-25 13 views
5

Zrobiłem aplikację, która odtwarza muzykę za pomocą AVAudioPlayer. Pobiera lub pobiera utwory, zapisuje je w danych podstawowych, a następnie odtwarza je, gdy są wybrane. Wszystkie z piętnastu piosenek, które testowałem, działają normalnie przy użyciu zarówno iPhone Music Client, jak i mojego komputera.AudioPlayer iOS i m4a

Jednak trzy z nich nie są odtwarzane w aplikacji. W szczególności mogę przesłać te piętnaście utworów w dowolnej kolejności, wyczyścić mój Model.sqlite, pobrać je ponownie do aplikacji i stwierdzić, że trzy z nich po prostu nie grają. Mają jednak odpowiedni tytuł i artystę.

Patrząc na to zauważyłem, że różnica polega na tym, że niepracujące pliki to .m4a. Jak odtwarzać pliki tego formatu za pomocą AVAudioPlayer?

EDIT („Co«przypominając», co URL pan zainicjować AVAudioPlayer z?”):

Jest to serwer z utworami, które użytkownik może uzyskać dostęp za pośrednictwem aplikacji. Po wybraniu podzbioru S do pobrania aplikacja pobiera S i zapisuje je do CoreModela za pomocą NSManagedObjectContext. Każda piosenka jest przechowywana jako osobna jednostka z unikalnym identyfikatorem i relacją do jednostki podzbioru (w tym przypadku S).

Kiedy "przywołuję" używając AppDelegate, aby uzyskać odpowiednią piosenkę za pomocą kontekstu, dane są również zwracane. I następnie zainicjować AVAudioPlayer tak:

[[AVAudioPlayer alloc] initWithData:(NSData *)[currentSong valueForKey:@"data"] error:nil]; 

... Więc napisałem, że i wtedy uświadomiłem sobie, że nie zostały faktycznie sprawdził się, co jest błąd (głupi mnie). Zauważyłem, że jest to OSStatus error 1954115647, który zwraca jako nieobsługiwany typ pliku. Patrząc na to nieco więcej, znalazłem to iPhone: AVAudioPlayer unsupported file type. Rozwiązanie jest tam przedstawiane jako usuwanie złych danych na początku lub inicjowanie z treści adresu URL. Czy możliwe jest znalezienie, gdzie dane są zapisywane w modelu podstawowym, aby podać go jako adres URL?

EDIT: (. Porównaj Pliki są one różne?)

Tak, są. Pobieram przykładowy plik .m4a z mojego serwera, który został przesłany przez aplikację i porównuje go z tym, który jest w iTunes. Odkryłem, że plik jest odcinany przed przesunięciem 229404 (z 2906191 bajtów), który rozpoczyna się 20680001 A0000E21. W wersji iTunes 0028D83B 6D646174 znajduje się przed tymi bajtami. Przed tym jest duży blok zer poprzedzony dużym blokiem danych poprzedzonym informacjami o kodowaniu iTunes. Na samym szczycie znajduje się więcej informacji kodujących, zawierających plik M4A.

Odpowiedz

0

Czy jesteś pewien, że twój kodek jest obsługiwany w systemie iOS? AVAudioPlayer powinien odtwarzać dowolny format obsługiwany przez iOS. Listę obsługiwanych formatów można znaleźć tutaj: http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/MultimediaPG/UsingAudio/UsingAudio.html#//apple_ref/doc/uid/TP40009767-CH2-SW6.

Proponuję spróbować ręcznie dodać te pliki do urządzenia przez iTunes i odtwarzać je w iPodzie, jeśli nie będą grać, problem nie dotyczy kodu ani SDK, ale formatu.

+0

Tak, .m4a jest obsługiwane w iOS i wszystkie pliki nie mają problemu z odtwarzaniem na iPhonie w zwykły sposób. – user592419

0

Jak sobie radzisz z odtwarzaniem - czy zapisujesz je w pliku tymczasowym z rozszerzeniem m4a - prawdopodobnie wymagane jest rozszerzenie m4a.

+0

Piszę je do podstawowych danych, wpisując unikalny identyfikator, a następnie przywołując je, gdy nadszedł czas, aby odtworzyć ten identyfikator. – user592419

+0

Co "przypominając?", Z jakiego adresu URL inicjujesz AVAudioPlayer? –

+0

Edytowane w celu odzwierciedlenia pytania i innych kwestii. – user592419

0

To nie jest bezpośrednie rozwiązanie, ale prawdopodobnie użytkownik bezpośrednio odpowiada shouldn't be saving the blobs in Core Data. Zapisz pliki w pamięci podręcznej i zapisz ścieżki plików w danych podstawowych. Dzięki temu zarówno bardziej wydajnie wykorzystasz bazę danych, jak i podasz lokalną ścieżkę dostępu do pliku AVAudioPlayer, która obejmie problem.

+0

Lub, jeśli korzystasz z opcji w danych podstawowych, aby zezwolić na pamięć zewnętrzną, możesz znaleźć lokalizację po tej odpowiedzi: http://stackoverflow.com/questions/9801944/storing-blobs-in-external-location-using -built-in-coredata-opcja, ale to będzie dotyczyło tylko obiektów powyżej pewnego rozmiaru (obecnie 1 MB) – Don

+0

Poprawiłem aplikację do pracy Zapisuję dane w lokalnej lokalizacji danych, a następnie zapisuję ten ciąg w coremodelu. Działa to w przypadku zwykłych piosenek, ale nadal nie działa z m4a. Znalazłem to, http://stackoverflow.com/questions/10545658/m4a-raw-data-from-ipod-library-not-playing, co wydaje się opisywać ten sam problem. Kiedy wykonuję exportsession, otrzymuję większy plik, który zawiera informacje nagłówka, ale teraz mam inny problem z s3 putObject, który nie może go odebrać. – user592419

Powiązane problemy