1
這需要我的頭。我從iPod庫中讀取音頻以分析音頻樣本,我可以做我想做的事,緩衝區總是泄漏,我得到低內存警告,應用程序是殺害。 我嘗試了所有建議,但沒有成功。下面的代碼被合併到一個靜態庫中,並且讀取音頻工作正常,只是緩衝區從未被釋放。我使用ARC
,也試過不打電話CFRelease
,但同樣的事情......感謝任何建議,我完全卡住了!CFRelease但仍然泄漏
- (NSInteger) getMP3Samples:(SInt16*)address{
AudioBufferList audioBufferList;
if (_assetReader == nil) {
return 0;
}
_mp3Control.currentSampleBufferCount = 0;
CMSampleBufferRef nextBuffer =[_assetReaderOutput copyNextSampleBuffer];
// Is the Song ended
if (nextBuffer == nil){
if ([_assetReader status] == AVAssetReaderStatusCompleted) {
[_assetReader cancelReading];
}
_assetReader = nil;
_assetReaderOutput = nil;
return _mp3Control.currentSampleBufferCount;
}
CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(
nextBuffer,
NULL,
&audioBufferList,
sizeof(audioBufferList),
NULL,
NULL,
kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment,
&_mp3Control.blockBuffer);
if (nextBuffer) {
CMSampleBufferInvalidate(nextBuffer);
CFRelease(nextBuffer);
nextBuffer=NULL;
}
for (int b=0; b < audioBufferList.mNumberBuffers; b++) {
memcpy((void *)(address+_mp3Control.currentSampleBufferCount),(void *)audioBufferList.mBuffers[b].mData,audioBufferList.mBuffers[b].mDataByteSize);
_mp3Control.currentSampleBufferCount+=audioBufferList.mBuffers[b].mDataByteSize;
}
///
/// Return samples and not bytes!!
///
return _mp3Control.currentSampleBufferCount/2;
}
非常感謝,這就是原因!而且我甚至可以在函數本身內部完成它,因爲我將樣本存入另一個緩衝區。再次感謝,我必須說蘋果文檔在這裏非常薄... – 2013-04-26 11:31:14
不客氣! 是的 - 文檔有時會有點薄。但是你總是可以嘗試標題(例如,通過cmd +點擊Xcode中的方法名稱)。在覈心媒體的情況下,標題目前包含比實際文檔更多的文本:) – 2013-04-26 12:17:25