का उपयोग कर iOS पर रिकॉर्डिंग।विकृत (रोबोट) ऑडियो मैं आईओएस में <code>AudioQueue</code> उपयोग कर रहा हूँ वेब के लिए रिकॉर्डिंग की स्ट्रीमिंग को लागू करने के AudioQueue
समस्या यह है कि आमतौर पर काफी अच्छी तरह से काम करता है, लेकिन कभी-कभी (~ मेरे प्रयासों में से 20%) ध्वनि बहुत विकृत हो जाती है - यह रोबोटिक लगता है।
संपादित करें: मैं iOS6 और ios6.1 सिम्युलेटर पर काफी आसानी से यह पुन: पेश करने में सक्षम हूँ - लेकिन मैं एक असली फोन पर यह पुन: पेश करने में सक्षम नहीं था (ios6.1.3)।
इसे डीबग करने का प्रयास मैं पीसीएम डेटा को एक फ़ाइल में सहेजता हूं। पीसीएम फ़ाइल में वही विकृति दिखाई देती है, इसलिए यह एन्कोडिंग या अपलोड कोड में कोई समस्या नहीं है। मैंने बफर की संख्या और बफर के आकार के साथ खेलने की भी कोशिश की है - कुछ भी मदद नहीं की।
समस्या मैं यह कैसे आगे डिबग करने के लिए पता नहीं है है - ऐसा लगता है बफर कॉलबैक करने के लिए इनपुट के रूप में विकृत है - इससे पहले कि मेरे कोड (ऑडियो कतार config को छोड़कर) सक्रिय है।
- क्या आपके पास विचार है कि समस्या क्या हो सकती है?
- या इसे आगे कैसे डिबग करें?
कतार सेटअप कोड:
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);
}
प्रारंभ रिकॉर्डिंग समारोह:
pcmFile = [[NSOutputStream alloc] initToFileAtPath:pcmFilePath append:YES];
[pcmFile scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[pcmFile open];
setupQueue(); // see above
AudioQueueStart(recordQueue, NULL);
कॉलबैक कोड:
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);
}
वही समस्या यहां ... – Idan