Domanda

Vorrei riprodurre un file audio caricato da Internet, quindi ho provato ad iniziare dall'esempio SDK SpeakHere per iPhone. Ho registrato il suono, quindi salvato e caricato su Internet, ho potuto scaricare quel file e riprodurlo senza problemi dagli strumenti audio. Ma quando ho provato a riprodurre quell'URL da SpeakHere, ricevo l'errore Segnale ricevuto dal programma: & # 8220; EXC_BAD_ACCESS & # 8221; .

Dopo aver rintracciato, ho scoperto che in - [AudioPlayer calcoliSizeFor:] , imposta bufferByteSize su un numero enorme 806128768, causando un errore nell'allocazione del buffer.

E questo perché in

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

Il maxPacketSize restituito è 806128768.

Mi chiedo come far funzionare AudioFileGetProperty .

Il mio file audio è qui , puoi fare clic con il tasto destro e scaricare da qui .

Sto usando questo modo per impostare l'URL nel metodo - [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"]];

Qualsiasi suggerimento è il benvenuto.

È stato utile?

Soluzione

Sì, devi usare Audio File Stream Services per giocare direttamente da Internet.

Ho trovato " AudioFileStreamExample " esempio utile, che dovrebbe essere installato in

/Developer/Examples/CoreAudio/Services/AudioFileStreamExample/

Inoltre, Matt Gallagher ha un articolo chiamato " Streaming e riproduzione di un flusso MP3 " che include il codice di esempio di iPhone. Non l'ho esaminato attentamente, ma sembra che possa esserti utile.

Altri suggerimenti

Penso che il problema principale sia che il codice che stai usando riguarda gli oggetti File audio (file audio locali su disco) ma quando carichi l'audio dalla rete vuoi usare AudioFileStream , che ha un proprio set di chiamate API da utilizzare come AudioFileStreamOpen , AudioFileStreamParseBytes , ecc.

Ho trovato una soluzione alternativa. Cioè copiare il contenuto da Internet in un file locale, quindi riprodurre l'audio da quel file locale. E sembra risolvere il problema.

Non perfetto, ma funziona e basta. Se qualcuno ha una soluzione reale, per favore fatemelo sapere.

Ecco il codice da copiare da Internet nel file locale.

-(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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top