Образец SpeakHere не может воспроизводить звук, загружаемый из Интернета
-
08-07-2019 - |
Вопрос
Я хотел бы воспроизвести звуковой файл, загруженный из Интернета, поэтому я попытался начать с примера 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;
}