Образец SpeakHere не может воспроизводить звук, загружаемый из Интернета

StackOverflow https://stackoverflow.com/questions/293929

Вопрос

Я хотел бы воспроизвести звуковой файл, загруженный из Интернета, поэтому я попытался начать с примера iPhone SDK SpeakHere. Я записал звук, затем сохранил и загрузил в Интернет, я мог скачать этот файл и без проблем играть с помощью звуковых инструментов. Но когда я попытался воспроизвести этот URL из SpeakHere, я получил сообщение об ошибке Программа получила сигнал: «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"]];

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

Это было полезно?

Решение

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

Я нашел " AudioFileStreamExample " полезный пример, который должен быть установлен в

/Developer/Examples/CoreAudio/Services/AudioFileStreamExample/

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

Другие советы

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

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

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

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

-(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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top