Frage

Ich mag Tondatei spielen, die aus dem Internet geladen, so dass ich versuchte, von iPhone SDK SpeakHere Probe zu starten. Ich nahm den Ton, dann gespeichert und an das Internet hochgeladen, konnte ich diese Datei herunterladen und ohne Probleme von Sound Tools spielen. Aber als ich versuchte, diese URL von SpeakHere zu spielen, ich bin immer Fehler Program received signal: “EXC_BAD_ACCESS”.

Nach Spur herum, fand ich, dass die in -[AudioPlayer calculateSizesFor:], setzen Sie ihn bufferByteSize zu einer großen Zahl 806128768, die Zuweisung fehlgeschlagen verursacht puffern.

Und das, weil in

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

Die maxPacketSize zurückgegeben wird, ist 806.128.768.

Ich frage mich, wie AudioFileGetProperty Arbeit zu machen.

Meine Sounddatei ist hier , Sie könnten die rechte Maustaste und herunterladen von hier .

Ich verwende diese Art und Weise die URL in dem -[AudioViewController playOrStop] Verfahren einzustellen:

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

Jeder Vorschlag ist sehr willkommen.

War es hilfreich?

Lösung

Ja, müssen Sie Audio verwenden, Datei-Stream Dienstleistungen direkt aus dem Internet zu spielen.

Ich fand das "AudioFileStreamExample" Beispiel nützlich, die in

installiert werden sollen
/Developer/Examples/CoreAudio/Services/AudioFileStreamExample/

Auch Matt Gallagher hat einen Artikel namens „ Streaming und Wiedergabe einer MP3-Stream “, das iPhone Beispielcode enthält. Ich habe nicht auf sie sorgfältig geprüft, aber es scheint, wie es für Sie hilfreich sein kann.

Andere Tipps

Ich denke, das Hauptproblem ist, dass der Code, den Sie Angebote verwenden, der mit Audiofile Objekte (lokale Audio-Dateien auf der Festplatte), aber wenn Sie aus dem Netzwerk-Audio laden Sie AudioFileStream , die über einen eigenen Satz von API haben Anrufe wie AudioFileStreamOpen zu verwenden, AudioFileStreamParseBytes, etc.

dachte ich, eine Abhilfe aus. Das ist den Inhalt aus dem Internet in einer lokalen Datei kopieren, dann Ton aus dieser lokalen Datei. Und scheint das Problem zu lösen.

Nicht perfekt, aber nur funktioniert. Wenn jemand wirkliche Lösung hat, lassen Sie es mich wissen.

Hier ist der Code aus dem Internet auf lokale Datei zu kopieren.

-(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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top