Question

J'aimerais lire un fichier son chargé depuis Internet. J'ai donc essayé de démarrer à partir de l'exemple 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 lorsque j'ai essayé de lire cette URL à partir de SpeakHere, le message d'erreur reçu par le programme: & # 8220; EXC_BAD_ACCESS & # 8221; .

Après avoir fait le tour de l'écran, j'ai constaté que dans - [AudioPlayer CalculateSizesFor:] , il définissait bufferByteSize sur un nombre énorme 806128768, ce qui entraînait l'échec de l'allocation de mémoire tampon.

Et cela parce que dans

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

Le maxPacketSize renvoyé est 806128768.

Je me demande comment faire fonctionner AudioFileGetProperty .

Mon fichier audio est ici , vous pouvez cliquer avec le bouton droit de la souris et télécharger le fichier depuis ici .

J'utilise cette méthode pour 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 la bienvenue.

Était-ce utile?

La solution

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

J'ai trouvé le fichier "AudioFileStreamExample". exemple utile, qui devrait être installé dans

/Developer/Examples/CoreAudio/Services/AudioFileStreamExample/

Matt Gallagher a également publié un article intitulé "a href =" http://cocoawithlove.com/2008/09/streaming-and-playing-live-mp3-stream.html "rel =" nofollow noreferrer ". > Lecture en continu et lecture de flux MP3 " cela inclut le code d'exemple iPhone. Je ne l'ai pas examiné attentivement, mais il semble que cela puisse vous être utile.

Autres conseils

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

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

Pas parfait, mais ça marche. Si quelqu'un a une solution réelle, s'il vous plaît faites le moi savoir.

Voici le code pour copier d’Internet dans 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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top