Speakhere 샘플은 인터넷에서로드되는 소리를 재생할 수 없습니다
-
08-07-2019 - |
문제
인터넷에서로드 된 사운드 파일을 재생하고 싶기 때문에 iPhone SDK Speakhere 샘플에서 시작하려고했습니다. 사운드를 녹음 한 다음 인터넷에 저장하고 업로드 한 후 해당 파일을 다운로드하고 사운드 도구에서 문제없이 재생할 수있었습니다. 하지만 Speakhere에서 그 URL을 재생하려고 할 때 오류가 발생합니다. 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"]];
모든 제안은 매우 환영합니다.
해결책
예, 사용해야합니다 오디오 파일 스트림 서비스 인터넷에서 직접 플레이합니다.
"Audiofilestreamexample"예제가 유용하다는 것을 알았습니다.
/Developer/Examples/CoreAudio/Services/AudioFileStreamExample/
또한 Matt Gallagher는 ""라는 기사가 있습니다.스트리밍 및 MP3 스트림 재생"여기에는 iPhone 예제 코드가 포함되어 있습니다. 신중하게 보지 못했지만 도움이 될 것 같습니다.
다른 팁
주요 문제는 당신이 사용하는 코드가 거래한다는 것입니다. Audiofile 객체 (디스크의 로컬 오디오 파일) 그러나 네트워크에서 오디오를로드 할 때 사용하려는 오디오 필 스트림, 여기에는 자체 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;
}