2013-04-25 1 views
5

AVAudioPlayer를 사용하여 음악을 재생하는 앱을 만들었습니다. 노래를 업로드 또는 다운로드하고, 코어 데이터에 기록한 다음, 선택시 재생하도록 호출합니다. 내가 테스트 한 15 곡은 모두 iPhone Music Client와 내 컴퓨터를 사용하여 정상적으로 작동합니다.AudioPlayer iOS 및 m4a

그러나 세 개는 앱에서 재생되지 않습니다. 구체적으로 말하자면,이 15 개의 노래를 순서에 상관없이 업로드하고, Model.sqlite를 지우고, 앱에 다시 다운로드하고, 그 중 3 명이 재생되지 않는 것을 발견 할 수 있습니다. 그러나 그들은 적절한 제목과 예술가를 가지고 있습니다.

이것을 살펴보면, 작동하지 않는 파일이 .m4a라는 점이 다릅니다. AVAudioPlayer로 해당 형식의 파일을 재생하려면 어떻게해야합니까?

EDIT ("뭐죠"리콜 "어떤 URL 당신이 AVAudioPlayer을 초기화합니까?"?) : 사용자가 응용 프로그램을 통해 액세스 할 수있는 노래와 서버가

. 검색 할 하위 집합 S를 선택한 후 응용 프로그램은 S를 다운로드하고 NSManagedObjectContext를 사용하여 CoreModel에 씁니다. 각 노래는 고유 한 ID와 하위 집합 엔티티 (이 경우 S)와의 관계로 별도의 엔티티로 저장됩니다.

AppDelegate를 사용하여 컨텍스트를 사용하여 올바른 노래를 얻으 려 할 때도 데이터가 반환됩니다. 나는 그 때문에 같은 AVAudioPlayer를 초기화 :

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

는 ... 그래서 나는 그 쓴 후 실제로 (바보 나) 오류가 무엇인지 체크 아웃하지 않은 것을 깨달았다. 지원되지 않는 파일 형식으로 반환하는 것은 OSStatus error 1954115647입니다. 이것을 조금 더 살펴보면, 나는 이것을 iPhone: AVAudioPlayer unsupported file type이라고 알았습니다. 해결책은 처음에는 불량 데이터를 없애거나 URL 내용으로 초기화하는 것으로 나타납니다. 핵심 모델에서 데이터를 작성하여 URL로 제공 할 수 있습니까?

편집 : (. 파일을 비교하여 서로 다른 있습니까?)

네,이다. 내 서버에서 샘플 .m4a 파일을 가져오고 있는데,이 파일은 앱에 의해 업로드되었으며 iTunes에있는 파일과 비교됩니다. 내가 찾은 것은 파일이 오프셋 (offset) 229404 (2906191 바이트 중) 전에 잘려서, 20680001 A0000E21으로 시작한다는 것입니다. iTunes 버전에서는 0028D83B 6D646174이 해당 바이트 앞에 놓입니다. 그 전에는 큰 블록 인 영 (zero)으로 시작하여 아이튠즈 인코딩 정보가 선행 된 커다란 데이터 블록이있다. 맨 위에는 파일을 M4A로 나열하는 인코딩 정보가 더 있습니다.

답변

0

코덱이 iOS에서 지원되는지 확인 하시겠습니까? AVAudioPlayer는 iOS에서 지원하는 모든 포맷을 재생해야하며 여기에서 지원되는 포맷 목록을 읽을 수 있습니다 : http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/MultimediaPG/UsingAudio/UsingAudio.html#//apple_ref/doc/uid/TP40009767-CH2-SW6.

iTunes를 통해 장치에 수동으로 파일을 추가하고 iPod에서 재생 해보는 것이 좋습니다. 코드가 재생되지 않으면 문제는 코드 또는 SDK가 아닌 형식입니다.

+0

예, .m4a는 iOS에서 지원되며 모든 파일은 일반적인 방법으로 iPhone에서 재생해도 문제가 없습니다. – user592419

0

재생을 어떻게 상기시키는가요? m4a 확장자가있는 임시 파일에 파일을 쓰고 있습니까?이 m4a 확장자가 필요할 수 있습니다.

+0

고유 ID로 키 데이터를 핵심 데이터에 쓴 다음 해당 ID를 통해 재생할 시간이되었을 때이를 리콜합니다. – user592419

+0

What is "recalling?", AVAudioPlayer를 초기화하는 URL은 무엇입니까? –

+0

질문 등을 반영하여 편집되었습니다. – user592419

0

이것은 직접적인 해결책은 아니지만, 아마도 shouldn't be saving the blobs in Core Data입니다. 파일을 캐시 된 위치에 기록하고 파일 경로를 핵심 데이터에 저장하십시오. 이 방법은 데이터베이스를보다 효율적으로 사용하고 AVAudioPlayer에 제공 할 로컬 파일 경로를 제공하므로 문제가 발생하지 않습니다.

+0

또는 코어 데이터의 옵션을 사용하여 외부 저장소를 허용하는 경우이 답변의 다음 위치를 찾을 수 있습니다. http://stackoverflow.com/questions/9801944/storing-blobs-in-external-location-using -built-in-coredata-option하지만 특정 크기 (현재 1MB) 이상의 객체에만 적용됩니다. – Don

+0

응용 프로그램을 st 데이터를 로컬 url dataLocation에 저장 한 다음 해당 문자열을 coremodel에 저장합니다. 이것은 일반 노래에도 적용되지만 m4a에서는 여전히 작동하지 않습니다. 나는 이것을 발견했다. http://stackoverflow.com/questions/10545658/m4a-raw-data-from-ipod-library-not-playing, 같은 문제를 묘사하고있는 것 같다. exportsession을 할 때 헤더 정보를 포함하는 더 큰 파일을 얻지 만 s3 putObject를받지 못하면 다른 문제가 발생합니다. – user592419