가능한 빨리 웨이브 파일을 읽어야합니다. 현재 내가하고있는 일은 다음과 같습니다.libsndfile sf_readf_short 최대 프레임 수
SFINFO sfinfo;
SNDFILE *wavFilefd = sf_open ("mySong.wav", SFM_READ, &sfinfo);
int readBlockSize = 1024*1024; // 1MB
if(sfinfo.frames * 2 < readBlockSize)
{
// actually I don't know where this factor two comes from, but it work's for me
readBlockSize = sfinfo.frames * 2;
}
short tmpSignal[readBlockSize];
int readcount = -1;
std::vector<short> wavVector;
while ((readcount = sf_readf_short (wavFilefd, tmpSignal, readBlockSize)) > 0)
{
++nRead;
wavVector.reserve((nRead-1) * readBlockSize + nRead);
wavVector.insert(wavVector.end(), tmpSignal, tmpSignal+readcount);
}
sf_close(wavFilefd);
이 코드는 지금까지 잘 작동합니다.
문제 : 나는 이제 sf_readf_short
을 할 때 나는 세그먼트 오류를 얻을 115,212,164 바이트의 웨이브 파일을 읽으려고 시도 후 10 배를 말하고하자에 의한 readBlockSize의 값을 증가합니다. 내가 을받은 help에서
는 "sf_readf_XXXX 기능은 프레임의 수를 읽어 보시기 바랍니다. 파일의 끝이 읽기 동안 도달하지 않는 한, 반환 값은 요청 프레임 수를 동일해야합니다. 끝을지나 읽을 시도 반환 파일의 오류가 발생하지 않지만 sf_readf_XXXX 함수가 요청한 프레임 수보다 적게 반환하거나 파일 끝에 이미있는 경우 0을 반환합니다. "
그래서 10MB에서도 작동 할 것으로 예상됩니다.
어떤 힌트를 주셔서 감사합니다. libsndfile 문서에서
호에 의해 (적어도 내 컴퓨터에서) 재현 할 수 있습니까? 컴파일 타임이 아닌 const 값을 가진 배열을 C++로 할당 할 수 없습니다. – Gonmator
세그멘테이션 결함은 어디서 얻습니까? 'sf_readf_short'에서 가정합니다. – Gonmator
@Gonmator : 정확히. 내 게시물을 업데이트했습니다. – ezdazuzena