Pergunta

Eu gostaria de jogar arquivo de som que carregado a partir de internet, então eu tentei começar a partir de amostra de iPhone SDK SpeakHere. Eu gravei o som, em seguida, guardado e carregado para a internet, eu poderia baixar o arquivo e jogar sem problema a partir de ferramentas de som. Mas quando eu tentei jogar essa URL de SpeakHere, estou ficando Program received signal: “EXC_BAD_ACCESS” erro.

Depois de traço ao redor, eu achei que o no -[AudioPlayer calculateSizesFor:], ele conjunto bufferByteSize a um grande número 806128768, o que causou alocação de buffer falhou.

E isso porque em

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

O maxPacketSize retornado é 806128768.

Eu estou querendo saber como fazer o trabalho AudioFileGetProperty.

O meu arquivo de som é aqui , você pode clicar com o botão direito e download aqui .

Eu estou usando esta maneira de definir o URL no 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"]];

Qualquer sugestão é muito bem-vinda.

Foi útil?

Solução

Sim, você precisa usar Áudio Stream File Serviços para jogar directamente a partir da Internet.

Eu encontrei o exemplo "AudioFileStreamExample" útil, que deve ser instalado em

/Developer/Examples/CoreAudio/Services/AudioFileStreamExample/

Além disso, Matt Gallagher tem um artigo chamado " streaming e jogar um fluxo " MP3 que inclui iPhone código de exemplo. Eu não olhei para ele com cuidado, mas parece que ele pode ser útil para você.

Outras dicas

Eu acho que o principal problema é que o código que você está usando acordos com AudioFile objetos (arquivos de áudio locais no disco), mas quando você carrega de áudio a partir da rede que deseja usar AudioFileStream , que tem seu próprio conjunto de chamadas de API para usar como AudioFileStreamOpen, AudioFileStreamParseBytes, etc.

Eu descobri uma solução alternativa. Isto é copiar o conteúdo de internet para um arquivo local, em seguida, reproduzir o som a partir desse ficheiro local. E parece resolver o problema.

Não é perfeito, mas simplesmente funciona. Se alguém tem solução real, por favor me avise.

Aqui está o código para copiar de internet para o arquivo 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top