2008-11-16 11 views
3

Je voudrais jouer le fichier son qui chargé de l'Internet, alors j'ai essayé de démarrer à partir de l'exemple de l'iPhone SDK SpeakHere. J'ai enregistré le son, puis enregistré et téléchargé sur internet, j'ai pu télécharger ce fichier et jouer sans problème avec les outils sonores. Mais quand j'ai essayé de lire cette URL de SpeakHere, je reçois l'erreur Program received signal: “EXC_BAD_ACCESS”.SpeakHere échantillon ne peut pas jouer le son qui charge de l'Internet

Après avoir parcouru, j'ai trouvé que le -[AudioPlayer calculateSizesFor:], il a défini bufferByteSize à un nombre énorme 806128768, ce qui a causé l'allocation de tampon a échoué.

Et parce que dans

AudioFileGetProperty(audioFileID, kAudioFilePropertyPacketSizeUpperBound, &propertySize, &maxPacketSize); 

Le maxPacketSize retourné est 806128768.

Je me demande comment faire AudioFileGetProperty travail.

Mon fichier son est here, vous pouvez cliquer avec le bouton droit et télécharger de here.

Je me sers de cette façon de définir l'URL dans la méthode -[AudioViewController playOrStop]:

// AudioPlayer *thePlayer = [[AudioPlayer alloc] initWithURL: self.soundFileURL]; 
AudioPlayer *thePlayer = [[AudioPlayer alloc] initWithURL: 
    [NSURL URLWithString: @"http://chineseresume.com/localbiz/uploads/myfilename_7_Recording.caf"]]; 

Toute suggestion est très bienvenue.

Répondre

4

Oui, vous devez utiliser Audio File Stream Services pour jouer directement depuis Internet.

Je trouve l'exemple "AudioFileStreamExample" utile, qui devrait être installé dans

/Developer/Examples/CoreAudio/Services/AudioFileStreamExample/ 

également, Matt Gallagher a un article intitulé "Streaming and playing an MP3 stream" qui inclut le code exemple iPhone. Je ne l'ai pas examiné attentivement, mais il semble que cela puisse vous être utile.

1

J'ai trouvé une solution de contournement. C'est copier le contenu d'Internet dans un fichier local, puis lire le son à partir de ce fichier local. Et semble résoudre le problème.

Pas parfait, mais fonctionne seulement. Si quelqu'un a une vraie solution, s'il vous plaît faites le moi savoir.

Voici le code à copier d'Internet vers un fichier local.

-(CFURLRef)saveURL:(NSString *)urlString { 
    NSURL *url = (NSURL*)[[NSURL alloc] initWithString:urlString]; 
    NSData *data = [[NSData alloc] initWithContentsOfURL:url]; 
    NSArray *filePaths = NSSearchPathForDirectoriesInDomains (      NSDocumentDirectory,              NSUserDomainMask,             YES             ); 

    NSString *recordingDirectory = [filePaths objectAtIndex: 0]; 

    CFStringRef fileString = (CFStringRef) [NSString stringWithFormat: @"%@/BufferFile.caf", recordingDirectory]; 
    NSLog(@"fileString = %@" , fileString); 
    // create the file URL that identifies the file that the recording audio queue object records into 
    CFURLRef fileURL = CFURLCreateWithFileSystemPath (            NULL, fileString,            kCFURLPOSIXPathStyle,            false); 
    SInt32 err = 0; 

    CFURLWriteDataAndPropertiesToResource (
    fileURL, (CFDataRef)data, nil, &err); 
    return fileURL; 
} 
3

Je pense que le principal problème est que le code que vous utilisez traite AudioFile objets (fichiers audio locaux sur le disque), mais lorsque vous chargez audio à partir du réseau que vous souhaitez utiliser AudioFileStream, qui a son propre ensemble d'appels d'API à utiliser tels que AudioFileStreamOpen, AudioFileStreamParseBytes, etc.