iPhone: AVAudioPlayer неподдерживаемый тип файла - PullRequest
26 голосов
/ 04 февраля 2011

Мое приложение загружает 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 Player и Quicktime на Mac.Я также загрузил файл в эмулятор iPhone, и он воспроизводится без проблем.Файл в порядке, но по какой-то причине AVAudioPlayer это не нравится.

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

Ответы [ 4 ]

31 голосов
/ 10 марта 2011

Наконец-то я нашел решение этой проблемы! Вместо инициализации аудиоплеера с помощью объекта 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];
}

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

12 голосов
/ 19 марта 2011

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

11 голосов
/ 06 июля 2015

В 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;
1 голос
/ 23 мая 2015

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

...