Pregunta

Me gustaría reproducir el archivo de sonido que se cargó desde internet, así que intenté comenzar desde el iPhone SDK SpeakHere sample. Grabé el sonido, luego lo guardé y subí a Internet, pude descargar ese archivo y reproducirlo sin problemas desde las herramientas de sonido. Pero cuando intenté reproducir esa URL desde SpeakHere, recibo la señal de error Program recibido: & # 8220; EXC_BAD_ACCESS & # 8221; .

Después de rastrear, descubrí que en - [AudioPlayer CalculateSizesFor:] , estableció bufferByteSize en un número enorme 806128768, lo que provocó un error en la asignación del buffer.

Y eso porque en

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

El maxPacketSize devuelto es 806128768.

Me pregunto cómo hacer que AudioFileGetProperty funcione.

Mi archivo de sonido es aquí , puede hacer clic derecho y descargar desde aquí .

Estoy usando esta manera para configurar la URL en el método - [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"]];

Cualquier sugerencia es muy bienvenida.

¿Fue útil?

Solución

Sí, debe usar Audio File Stream Services para jugar directamente desde Internet.

Encontré el " AudioFileStreamExample " ejemplo útil, que debe instalarse en

/Developer/Examples/CoreAudio/Services/AudioFileStreamExample/

Además, Matt Gallagher tiene un artículo llamado " Transmisión y reproducción de una transmisión de MP3 " eso incluye el código de ejemplo de iPhone. No lo he mirado cuidadosamente, pero parece que puede ser útil para usted.

Otros consejos

Creo que el problema principal es que el código que está utilizando trata con objetos AudioFile (archivos de audio locales en el disco) pero cuando carga audio desde la red quiere usar AudioFileStream , que tiene su propio conjunto de llamadas API para usar, como AudioFileStreamOpen , AudioFileStreamParseBytes , etc.

Descubrí una solución alternativa. Es decir, copie el contenido de Internet a un archivo local, luego reproduzca el sonido de ese archivo local. Y parece resolver el problema.

No es perfecto, pero simplemente funciona. Si alguien tiene una solución real, hágamelo saber.

Aquí está el código para copiar desde Internet a un archivo 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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top