amostra SpeakHere não pode reproduzir som que carrega de internet
-
08-07-2019 - |
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.
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;
}