2015-03-23 6 views
1

Я пытаюсь получить в функции приложения работают выбора идентификаторов WAV файлов, который загружает & пьесы с использованием NSURLRequest/Connect & AVAudioPlayer.IOS, WAV аудио не играет

Я продолжаю работать в OSStatus error 1954115647 (операция не может быть завершена. (Тип файла не поддерживается, очевидно)).

Детали файлов PCM S16 LE - Mono - 8000Hz - 16 bit/sample
Для дальнейшего исследования я пытался читать аудио непосредственно из потока, где он размещен, используя сафари iPhone в. К сожалению, браузер также не может воспроизвести файл (отлично работает в сафари MAC, а также в других браузерах).

РНР для размещения потока выглядит следующим образом:

$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, как это. Я ищу альтернативный формат & convert/deconvert, чтобы сделать эту работу, или есть вероятность того, что это ошибка в другом месте?

Я прочитал here, что iPhone не поддерживают некоторые кодировки, однако это было опубликовано в 2007 году

+0

Работает ли он с использованием аудиофайла со стандартной частотой дискретизации 44100 Гц? –

+0

аудио используется в телекоммуникационной сети, поэтому требуется 8000 выборочных частот –

ответ

0

Общего решения (запрос на размещенный файл):

@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)