Подтвердить что ты не робот

IPhone: не поддерживаемый тип файла AVAudioPlayer

Мое приложение загружает mp3 с нашего сервера и воспроизводит его обратно пользователю. Файл имеет 64 кбит/с (что вполне соответствует допустимому диапазону для iPhone, если я правильно понимаю). Я искал, как это сделать на десятках сайтов, и все они предлагают, чтобы я сделал именно это:

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://.../file.mp3"]];
NSError *e = nil;
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithData:data error&e];
[player setDelegate:self];

Когда я запускаю код, игрок возвращается к нулю, и я получаю эту ошибку:

2011-02-04 10:44:46.176 MyApp[6052:207] Error loading audio: Error Domain=NSOSStatusErrorDomain Code=1954115647 "The operation couldn’t be completed. (OSStatus error 1954115647.)"
2011-02-04 10:44:49.647 MyApp[6052:207] unsupported file type

Я проверил файл, и я знаю, что он работает. Он будет проигрываться без проблем в проигрывателе Windows Media и Quicktime на Mac. Я также загрузил файл в эмулятор iPhone, и он играет без проблем. Файл в порядке, но по какой-то причине AVAudioPlayer ему не нравится.

Есть ли что-то, что мне нужно изменить? Есть ли какие-то настройки для NSData, чтобы указать, какой файл он есть? Кто-нибудь знает?

4b9b3361

Ответ 1

Наконец-то я нашел решение этой проблемы! Вместо инициализации аудиоплеера с помощью объекта NSData я сохранил файл в папке "Документы", а затем инициализировал проигрыватель с URL-адресом файла

//download file and play from disk
NSData *audioData = [NSData dataWithContentsOfURL:someURL];
NSString *docDirPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filePath = [NSString stringWithFormat:@"%@/%@.mp3", docDirPath , fileName];
[audioData writeToFile:filePath atomically:YES];

NSError *error;
NSURL *fileURL = [NSURL fileURLWithPath:filePath];
player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error];
if (player == nil) {
    NSLog(@"AudioPlayer did not load properly: %@", [error description]);
} else {
    [player play];
}

Когда приложение будет завершено с файлом, его можно удалить. Надеюсь, что он помогает не только мне!

Ответ 2

Мы имели дело с одной и той же проблемой - сначала нам пришлось записать файл на диск. В итоге я обнаружил, что данные, которые мы загружали, имели в начале дополнительные байты. При чтении с диска с помощью initWithContentsOfURL, AVAudioPlayer знал, как с этим бороться, но при загрузке из NSData с помощью initWithData этого не произошло. Обрезание этих байтов исправлено.

Ответ 3

Из iOS 7 AVAudioPlayer имеет новый инициализатор

NSError *error;
[[AVAudioPlayer alloc] initWithData:soundData fileTypeHint:AVFileTypeMPEGLayer3 error:&error]

Поддерживаемые UTI

NSString *const AVFileType3GPP;
NSString *const AVFileType3GPP2;
NSString *const AVFileTypeAIFC;
NSString *const AVFileTypeAIFF;
NSString *const AVFileTypeAMR;
NSString *const AVFileTypeAC3;
NSString *const AVFileTypeMPEGLayer3;
NSString *const AVFileTypeSunAU;
NSString *const AVFileTypeCoreAudioFormat;
NSString *const AVFileTypeAppleM4V;
NSString *const AVFileTypeMPEG4;
NSString *const AVFileTypeAppleM4A;
NSString *const AVFileTypeQuickTimeMovie;
NSString *const AVFileTypeWAVE;

Ответ 4

Если ваше имя продукта содержит пробел, вы получите сообщение об ошибке.
Название моего продукта проекта: Panorama 1453 TR. initWithContentsOfURL метод не может получить путь к файлу. поэтому он не работал. вы можете поместить breakPoint в NSURL *fileURL =. После шага вы можете увидеть файлURL, какие данные есть.  
Я изменился на Panorama1453TR, это действительно сработало.