我需要儘快讀入波形文件。我目前正在做的是以下幾點: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);
此代碼目前效果很好。
問題:當我增加讓我們說10倍,然後嘗試讀取的字節數115212164波形文件做sf_readf_short
當我得到一個分段錯誤的readBlockSize的價值。
從help我「的sf_readf_XXXX函數返回的幀數閱讀。除非讀期間達到了文件的末尾,返回值應等於請求幀的數量。任何試圖讀取超出結尾的文件不會導致錯誤,但會導致sf_readf_XXXX函數返回小於請求的幀數,如果已經在文件末尾返回0。
所以我預計這也適用於10MB。
感謝您的任何提示。
何你得到編譯行'短tmpSignal [readBlockSize]被複制(至少在我的機器)?不可能在C++中分配一個非編譯時常量值大小的數組。 – Gonmator
你從哪裏得到分段錯誤?我假設在'sf_readf_short'中,我說得對嗎? – Gonmator
@Gonmator:確切地說。我更新了我的帖子。 – ezdazuzena