मैंने विस्तारित ऑडियो फ़ाइल सेवाओं का उपयोग करके अपने ऐप द्वारा उत्पन्न पीसीएम ऑडियो डेटा को एन्कोड करने के लिए एक लूप लिखा था। एन्कोडिंग पृष्ठभूमि थ्रेड में समकालिक रूप से होती है, न कि वास्तविक समय में।विस्तारित ऑडियो फ़ाइल सेवाओं का उपयोग करके एमएए/एएसी को एम 4 ए/एएसी में विफल करने के लिए एक्स्टऑडियो फाइलवाइट (आईपैड 2, आईफोन 4 एस)
एन्कोडिंग आईओएस 4 और 5 दोनों के लिए आईपैड 1 और आईफोन 3gs/4 पर बेकार ढंग से काम करता है। हालांकि, दोहरी कोर डिवाइस (आईफोन 4 एस, आईपैड 2) के लिए ExtAudioFileWrite को तीसरा कॉल एन्कोडिंग थ्रेड को बिना स्टैक ट्रेस के क्रैश करता है और कोई त्रुटि कोड नहीं है।
यहाँ प्रश्न में कोड है:
डेटा स्वरूप
AudioStreamBasicDescription AUCanonicalASBD(Float64 sampleRate,
UInt32 channel){
AudioStreamBasicDescription audioFormat;
audioFormat.mSampleRate = sampleRate;
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kAudioFormatFlagsAudioUnitCanonical;
audioFormat.mChannelsPerFrame = channel;
audioFormat.mBytesPerPacket = sizeof(AudioUnitSampleType);
audioFormat.mBytesPerFrame = sizeof(AudioUnitSampleType);
audioFormat.mFramesPerPacket = 1;
audioFormat.mBitsPerChannel = 8 * sizeof(AudioUnitSampleType);
audioFormat.mReserved = 0;
return audioFormat;
}
AudioStreamBasicDescription MixdownAAC(void){
AudioStreamBasicDescription audioFormat;
audioFormat.mSampleRate = 44100.0;
audioFormat.mFormatID = kAudioFormatMPEG4AAC;
audioFormat.mFormatFlags = kMPEG4Object_AAC_Main;
audioFormat.mChannelsPerFrame = 2;
audioFormat.mBytesPerPacket = 0;
audioFormat.mBytesPerFrame = 0;
audioFormat.mFramesPerPacket = 1024;
audioFormat.mBitsPerChannel = 0;
audioFormat.mReserved = 0;
return audioFormat;
}
पाश प्रस्तुत करना
OSStatus err;
ExtAudioFileRef outFile;
NSURL *mixdownURL = [NSURL fileURLWithPath:filePath isDirectory:NO];
// internal data format
AudioStreamBasicDescription localFormat = AUCanonicalASBD(44100.0, 2);
// output file format
AudioStreamBasicDescription mixdownFormat = MixdownAAC();
err = ExtAudioFileCreateWithURL((CFURLRef)mixdownURL,
kAudioFileM4AType,
&mixdownFormat,
NULL,
kAudioFileFlags_EraseFile,
&outFile);
err = ExtAudioFileSetProperty(outFile, kExtAudioFileProperty_ClientDataFormat, sizeof(AudioStreamBasicDescription), &localFormat);
// prep
AllRenderData *allData = &allRenderData;
writeBuffer = malloc(sizeof(AudioBufferList) + (2*sizeof(AudioBuffer)));
writeBuffer->mNumberBuffers = 2;
writeBuffer->mBuffers[0].mNumberChannels = 1;
writeBuffer->mBuffers[0].mDataByteSize = bufferBytes;
writeBuffer->mBuffers[0].mData = malloc(bufferBytes);
writeBuffer->mBuffers[1].mNumberChannels = 1;
writeBuffer->mBuffers[1].mDataByteSize = bufferBytes;
writeBuffer->mBuffers[1].mData = malloc(bufferBytes);
memset(writeBuffer->mBuffers[0].mData, 0, bufferBytes);
memset(writeBuffer->mBuffers[1].mData, 0, bufferBytes);
UInt32 framesToGet;
UInt32 frameCount = allData->gLoopStartFrame;
UInt32 startFrame = allData->gLoopStartFrame;
UInt32 lastFrame = allData->gLoopEndFrame;
// write one silent buffer
ExtAudioFileWrite(outFile, bufferFrames, writeBuffer);
while (frameCount < lastFrame){
// how many frames do we need to get
if (lastFrame - frameCount > bufferFrames)
framesToGet = bufferFrames;
else
framesToGet = lastFrame - frameCount;
// get dem frames
err = theBigOlCallback((void*)&allRenderData,
NULL, NULL, 1,
framesToGet, writeBuffer);
// write to output file
ExtAudioFileWrite(outFile, framesToGet, writeBuffer);
frameCount += framesToGet;
}
// write one trailing silent buffer
memset(writeBuffer->mBuffers[0].mData, 0, bufferBytes);
memset(writeBuffer->mBuffers[1].mData, 0, bufferBytes);
processLimiterInPlace8p24(limiter, writeBuffer->mBuffers[0].mData, writeBuffer->mBuffers[1].mData, bufferFrames);
ExtAudioFileWrite(outFile, bufferFrames, writeBuffer);
err = ExtAudioFileDispose(outFile);
पीसीएम फ्रेम ठीक से बनाई गई हैं, लेकिन ExtAudioFileWrite 2/3rd समय में विफल रहता है यह कहा जाता है।
कोई भी विचार? धन्यवाद!
क्या आप पोस्ट कर सकते हैं बफर भरें और आप ExtAudioFileWrite को कैसे कॉल कर रहे हैं? – sbooth
ऐप्पल से बहुत निराशा और कोई मदद के बाद, मेरे सहकर्मी ने समस्या का पता लगाया। स्पष्ट रूप से नए आईओएस डिवाइस (आईपैड 2 और आईफोन 4 एस) पर, 44.1 केएचजेड एएसी एन्कोडिंग के लिए वैध नमूना दर नहीं है, कम से कम बाहरी ऑडियो फाइल सेवाओं का उपयोग करना। 48 kHz बस ठीक काम करता है। मैंने ऐप्पल को एक बग के रूप में दायर किया है, उम्मीद है कि वे इसका ख्याल रखेंगे। – roperklacks