Web'de kayıt akışını uygulamak için iOS'ta AudioQueue
kullanıyorum. o robotik sesler - AudioQueue kullanarak iOS'ta bozuk (robotik) ses kaydı
sorun
o genellikle eser oldukça iyi, ama bazen (~ benim girişimleri% 20) ses korkunç bozuk olmasıdır.Düzenleme: Ben iOS6 ve ios6.1 simülatörde bunu kolaylıkla çoğalabilen değilim - ama gerçek bir telefonda çoğaltmak mümkün değildi (ios6.1.3).
Hata ayıklamayı denemek PCM verilerini bir dosyaya kaydediyorum. Aynı bozulma PCM dosyasında görünür, bu yüzden kodlama veya yükleme kodunda bir sorun olmaz. Ayrıca tamponların sayısı ve tamponların boyutuyla oynamaya çalıştım - hiçbir şey yardımcı olmadı.
Sorun, daha fazla hata ayıklamanın nasıl yapılacağını bilmem - arabellek etkinleştirilmeden önce - arabellek geri çağrıya girdi olarak görünüyor - kodum etkin olmadan önce (ses kuyruğu yapılandırması hariç).
- Problemin ne olabileceğini biliyor musunuz?
- veya daha fazla hata ayıklama nasıl yapılır?
Kuyruk kurulum kodu:
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mSampleRate = SAMPLE_RATE; //16000.0;
audioFormat.mChannelsPerFrame = CHANNELS; //1;
audioFormat.mBitsPerChannel = 16;
audioFormat.mFramesPerPacket = 1;
audioFormat.mBytesPerFrame = audioFormat.mChannelsPerFrame * sizeof(SInt16);
audioFormat.mBytesPerPacket = audioFormat.mBytesPerFrame * audioFormat.mFramesPerPacket;
audioFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger
| kLinearPCMFormatFlagIsPacked;
AudioQueueNewInput(
&audioFormat,
recordCallback,
self, // userData
CFRunLoopGetMain(), // run loop
NULL, // run loop mode
0, // flags
&recordQueue);
UInt32 trueValue = true;
AudioQueueSetProperty(recordQueue,kAudioQueueProperty_EnableLevelMetering,&trueValue,sizeof (UInt32));
for (int t = 0; t < NUMBER_AUDIO_DATA_BUFFERS; ++t)
{
AudioQueueAllocateBuffer(
recordQueue,
bufferByteSize,
&recordQueueBuffers[t]);
}
for (int t = 0; t < NUMBER_AUDIO_DATA_BUFFERS; ++t)
{
AudioQueueEnqueueBuffer(
recordQueue,
recordQueueBuffers[t],
0,
NULL);
}
Başlangıç kayıt fonksiyonu:
pcmFile = [[NSOutputStream alloc] initToFileAtPath:pcmFilePath append:YES];
[pcmFile scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[pcmFile open];
setupQueue(); // see above
AudioQueueStart(recordQueue, NULL);
Geri arama kodu:
static void recordCallback(
void* inUserData,
AudioQueueRef inAudioQueue,
AudioQueueBufferRef inBuffer,
const AudioTimeStamp* inStartTime,
UInt32 inNumPackets,
const AudioStreamPacketDescription* inPacketDesc)
Recorder* recorder = (Recorder*) inUserData;
if (!recorder.recording)
return;
[recorder.pcmFile write:inBuffer->mAudioData maxLength:inBuffer->mAudioDataByteSize];
AudioQueueEnqueueBuffer(inAudioQueue, inBuffer, 0, NULL);
}
Aynı sorun burada ... – Idan