2015-03-23 1 views
1

Je suis en train d'obtenir une fonctionnalité d'application de travail de sélection ids de fichiers wav, qui télécharge & joue à l'aide NSURLRequest/Connect & AVAudioPlayer.iOS, audio WAV ne joue pas

Je continue à courir dans OSStatus error 1954115647 (L'opération n'a pas pu être terminée. (Type de fichier non pris en charge apparemment)).

Les détails du fichier sont PCM S16 LE - Mono - 8000Hz - 16 bit/sample
Pour étudier plus j'ai essayé de lire l'audio directement à partir du flux où il est hébergé à l'aide de Safari de l'iPhone. Malheureusement, il semble que le navigateur est également incapable de lire le fichier (fonctionne très bien dans MAC Safari ainsi que d'autres navigateurs).

Le PHP pour accueillir le flux est le suivant:

$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; 

Je suis surpris que c'est un problème à l'usage commun du fichier WAV comme cela. Est-ce que je cherche un autre format & convertir/déconvertir pour que cela fonctionne ou est-il plus probable qu'il y ait une erreur ailleurs sur la ligne?

Je lis here que l'iPhone ne prend pas en charge certains encodages, mais cela a été publié en 2007.

+0

Fonctionne-t-il avec un fichier audio avec la fréquence d'échantillonnage standard de 44100 Hertz? –

+0

l'audio est utilisé sur le réseau téléphonique télécom donc 8000 taux d'échantillonnage est nécessaire –

Répondre

0

solution globale (demande de fichier hébergé):

@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); 
}]; 
} 

Attention: cela ne semble pas pour travailler sur le simulateur iOS

Vous remarquerez les CFURLRef & SystemSoundID lignes commentées. C'était à l'origine comment j'ai réussi à lire le fichier audio, mais les fonctions sonores du système sont limitées (moins de 30 secondes, audio de type PCM seulement).

Ceci est très bien si vous êtes l'audio est dans ces restrictions, mais j'ai besoin d'environ une minute audio. AVAudioPlayer a résolu ceci. Voir le code pour la mise en œuvre facile, mais s'il vous plaît être conscient que l'intimation de la AVAudioPlayer locale à la fonction ne fonctionnera pas. Le lecteur doit être global dans le fichier d'implémentation (voir le @property sous @interface)