Я пытаюсь получить в приложении функцию выбора идентификаторов файлов WAV, который загружает & играет с использованием NSURLRequest/Connect
& AVAudioPlayer
,
Я продолжаю сталкиваться OSStatus error 1954115647
(Операция не может быть завершена. (Тип файла, очевидно, не поддерживается)).
Подробности файла PCM S16 LE - Mono - 8000Hz - 16 bit/sample
Для дальнейшего изучения я попытался прочитать аудио прямо из потока, где он размещен, с помощью сафари iPhone. К сожалению, кажется, что браузер также не может воспроизвести файл (прекрасно работает в MAC-сафари, а также в других браузерах).
PHP для размещения потока выглядит следующим образом:
$filename = "audio.wav";
header('Content-type: audio/x-wav');
header('Content-length: ' . strlen($file));
header('Content-disposition: inline; filename="' . $filename);
header('X-Pad: avoid browser bug');
header('Cache-Control: no-cache');
echo $file;
Я удивлен, что это проблема общего использования WAV-файла, как этот. Я ищу альтернативный формат & конвертировать / деконвертировать, чтобы заставить это работать, или есть большая вероятность ошибки где-то еще?
Я читаю Вот что iPhone не поддерживает определенные кодировки, однако это было опубликовано в 2007 году.
Общее решение (запрос к размещенному файлу):
@interface audioPlayer()<AVAudioPlayerDelegate, AVAudioPlayerDataSource>{
@property AVAudioPlayer *player;
}
...
-(void) playFile{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager setCredential:[NSURLCredential credentialWithUser:@"USER" password:@"PASSWORD" persistence:NSURLCredentialPersistenceNone]];
[manager GET:@"http://example.com/audio.wav" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Download Complete!");
NSData *data = responseObject;
NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"audio.wav"];
NSError *error;
[data writeToFile:filePath options:NSDataWritingAtomic error:&error];
NSLog(@"file error - %@", error); //should be (null)
NSURL *path = [NSURL fileURLWithPath:filePath];
/*
CFURLRef sysSound;
SystemSoundID soundID;
sysSound = (__bridge CFURLRef)path;
AudioServicesCreateSystemSoundID(sysSound, &soundID);
AudioServicesPlaySystemSound(soundID);
*/
NSError *playError;
player = [[AVAudioPlayer alloc] initWithContentsOfURL:path fileTypeHint:@"wav" error:&playError];
NSLog(@"play error - %@", playError);
[player setDelegate:self];
[player setVolume:1.0];
BOOL prepareCheck = [player prepareToPlay];
NSLog(@"prepare - %hhd", prepareCheck);
BOOL playCheck = [player play];
NSLog(@"play - %hhd", playCheck);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
}
Внимание: это не работает на симуляторе iOS
Вы заметите CFURLRef
& SystemSoundID
строки закомментированы. Изначально мне удалось воспроизвести аудиофайл, однако функции звукового сопровождения системы были ограничены (менее 30 секунд, только звук типа PCM).
Это нормально, если вы используете аудио в рамках этих ограничений, но мне потребовалось около минуты аудио. AVAudioPlayer
решил это. Смотрите код для легкой реализации, но, пожалуйста, имейте в виду, что указание на AVAudioPlayer
Локальная функция не будет работать. Плеер должен быть глобальным для файла реализации (см. @property
под @interface
)
Других решений пока нет …