Образец SpeakHere не может воспроизводить звук, загружаемый из Интернета - PullRequest
3 голосов
/ 16 ноября 2008

Я хотел бы воспроизвести звуковой файл, загруженный из Интернета, поэтому я попытался начать с примера iPhone SDK SpeakHere. Я записал звук, затем сохранил и загрузил в Интернет, я мог скачать этот файл и без проблем играть с помощью звуковых инструментов. Но когда я пытался воспроизвести этот URL из SpeakHere, я получаю сообщение об ошибке Program received signal: “EXC_BAD_ACCESS”.

После трассировки я обнаружил, что в -[AudioPlayer calculateSizesFor:] он установил для bufferByteSize огромное число 806128768, что вызвало сбой выделения буфера.

И это потому, что в

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

Возвращается maxPacketSize 806128768.

Мне интересно, как заставить AudioFileGetProperty работать.

Мой звуковой файл здесь , Вы можете щелкнуть правой кнопкой мыши и загрузить с здесь .

Я использую этот способ для установки URL в методе -[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"]];

Любые предложения приветствуются.

Ответы [ 3 ]

4 голосов
/ 24 ноября 2008

Да, вам нужно использовать Службы потоков аудиофайлов для воспроизведения напрямую из Интернета.

Мне показался полезным пример «AudioFileStreamExample», который должен быть установлен в

/Developer/Examples/CoreAudio/Services/AudioFileStreamExample/

Кроме того, у Мэтта Галлахера есть статья под названием « Потоковая передача и воспроизведение потока MP3 », в которой содержится пример кода iPhone. Я не смотрел на это внимательно, но, похоже, это может быть полезно для вас.

3 голосов
/ 21 ноября 2008

Я думаю, что основная проблема в том, что используемый вами код имеет дело с AudioFile объектами (локальными аудиофайлами на диске), но когда вы загружаете аудио из сети, вы хотите использовать AudioFileStream , который имеет свой собственный набор вызовов API, таких как AudioFileStreamOpen, AudioFileStreamParseBytes и т. д.

1 голос
/ 17 ноября 2008

Я нашел обходной путь. То есть скопируйте содержимое из Интернета в локальный файл, а затем воспроизведите звук из этого локального файла. И, кажется, решить проблему.

Не идеально, но просто работает. Если у кого-то есть реальное решение, пожалуйста, дайте мне знать.

Вот код для копирования из Интернета в локальный файл.

-(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;
}
...