2011-03-03 77 views
2

這個問題對於這個空間可能有點過大和模糊,但我會放棄它。AudioFileWriteBytes工作時間太長,無法完成工作

我有一個樣本數組,我試圖寫入我的iOS上的.wav文件,這需要花費一分半的時間。這裏是拖動發生的循環:

for (int i=0; i< 1430529; i++) // 1430529 is the length of the array of samples 
    { 

     SInt16 sample; 

     sample = sample_array[i]; 



     audioErr = AudioFileWriteBytes(audioFile, false, sampleCount*2, &bytesToWrite, &sample); 

     sampleCount++; 
    } 

任何想法?


編輯1

如果有幫助,這是它前面的代碼:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 




// THIS IS MY BIT TO CONVERT THE LOCATION TO NSSTRING 
NSString *filePath = [[NSString alloc]init]; 
filePath = [NSString stringWithUTF8String:location]; 

// HERE I WANT TO REMOVE THE FILE NAME FROM THE LOCATION. 
NSString *truncatedFilePath = filePath; 

truncatedFilePath = [truncatedFilePath stringByReplacingOccurrencesOfString:@"/recordedFile.wav" 
            // withString:@"/newFile.caf"]; 
            withString:@"/recordedFile.wav"]; 




NSLog(truncatedFilePath); 



NSURL *fileURL = [NSURL fileURLWithPath:truncatedFilePath]; 



AudioStreamBasicDescription asbd; 


memset(&asbd,0, sizeof(asbd)); 

asbd.mSampleRate = SAMPLE_RATE; 
asbd.mFormatID = kAudioFormatLinearPCM; 


asbd.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked; 


asbd.mBitsPerChannel = 16; 
asbd.mChannelsPerFrame = 1; 
asbd.mFramesPerPacket = 1; 
asbd.mBytesPerFrame = 2; 
asbd.mBytesPerPacket = 2; 






AudioFileID audioFile; 

OSStatus audioErr = noErr; 

audioErr = AudioFileCreateWithURL((CFURLRef)fileURL, kAudioFileWAVEType, &asbd, kAudioFileFlags_EraseFile, &audioFile); 

assert (audioErr == noErr); 


long sampleCount = 0; 
UInt32 bytesToWrite = 2; 

回答

2

爲什麼你需要循環?你不能一次寫完所有的樣本,例如

numSamples = 1430529; 
    bytesToWrite = numSamples * 2; 
    audioErr = AudioFileWriteBytes(audioFile, false, 0, &bytesToWrite, sample_array); 

+0

你是個天才!但是現在播放速度要慢得多(可能是速度的一半?)。無論如何,我相信我能弄清楚(除非你有任何想法:)。再次感謝! – 2011-03-03 10:45:22

1

也許你在每次調用AudioFileWriteBytes寫入的字節數太小。 bytesToWrite有多大?

+0

請參閱編輯1 :) – 2011-03-03 10:31:45

+0

如果你不能做@Paul R推薦的,你應該在寫音頻文件時使用更大的字節緩衝區(我不適用於iOS,但是我遇到了類似的問題Java,C#等問題)。你的塊太小,所以你有太多的I/O調用。 – 2011-03-03 10:47:07