AudioFileWriteBytes занимает слишком много времени, чтобы делать свою работу - PullRequest
2 голосов
/ 03 марта 2011

Эта проблема может быть слишком обширной и туманной для этого пространства, но я попробую.

У меня есть массив сэмплов, которые я пытаюсь записать в файл .wavна моей iOS, и это занимает до полутора минут, чтобы сделать.Вот цикл, где происходит перетаскивание:

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 ]

2 голосов
/ 03 марта 2011

Зачем вам петля? Разве вы не можете написать все образцы за один раз, например,

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

1 голос
/ 03 марта 2011

Возможно, число байтов, которое вы записываете при каждом вызове AudioFileWriteBytes, слишком мало. Насколько велика bytesToWrite?

...