2009-06-25 18 views
5

पर ऑडियो यूनिट का उपयोग कैसे करें मैं रिकॉर्ड किए गए ऑडियो की पिच बदलने के लिए एक तरीका ढूंढ रहा हूं क्योंकि यह डिस्क पर सहेजा गया है, या वापस (वास्तविक समय में) खेला जाता है। मैं समझता हूं कि इसके लिए ऑडियो इकाइयों का उपयोग किया जा सकता है। आईफोन ऑडियो इकाइयों के लिए सीमित समर्थन प्रदान करता है (उदाहरण के लिए कस्टम ऑडियो इकाइयों को बनाना/उपयोग करना संभव नहीं है, जहां तक ​​मैं कह सकता हूं), लेकिन कई ऑफ-द-बॉक्स ऑडियो इकाइयां उपलब्ध हैं, जिनमें से एक एपच है।आईफोन

मैं ऑडियो इकाई (विशेष रूप से AUPitch) का उपयोग कैसे करूं? क्या आप इसे किसी ऑडियो कतार में हुक करते हैं? क्या ऑडियो इकाइयों को एक साथ श्रृंखला करना संभव है (उदाहरण के लिए, एक साथ गूंज प्रभाव और पिच में बदलाव जोड़ने के लिए)?

संपादित करें: आईफोन एसडीके हेडर का निरीक्षण करने के बाद (मुझे लगता है कि ऑडियोयूनीट.h, मैं इस समय मैक के सामने नहीं हूं), मैंने देखा कि एपिच ने टिप्पणी की है। तो ऐसा लगता है कि आईफोन पर एपिच उपलब्ध नहीं है। अब इसकी अधिक AUPitch के लिए संदर्भ खोजने के लिए मुश्किल है, आदि

जिसके अनुसार, मैं - रोरो

एप्पल बेहतर है करने के लिए देर से की developer.apple.com पर अपने iPhone SDK दस्तावेज़ का आयोजन लगता है मैं अभी भी आईफोन पर ऑडियो इकाइयों (सामान्य रूप से) का उपयोग करने पर गुणवत्ता के उत्तरों में रूचि रखता हूं।

उत्तर

4

कुछ बहुत अच्छा यहाँ (http://michael.tyson.id.au/2008/11/04/using-remoteio-audio-unit/) RemoteIO ऑडियो यूनिट प्रयोग करने के लिए संसाधन नहीं हैं। आईफोन पर ऑडियो इकाइयों के साथ काम करने के अपने अनुभव में, मैंने पाया है कि मैं कॉलबैक फ़ंक्शन में मैन्युअल रूप से एक रूपांतरण को कार्यान्वित कर सकता हूं। ऐसा करने में, आपको लगता है कि आपको समस्या हल हो सकती है।

1

आईफोन पर बदलते पिच के बारे में, ओपनल जाने का रास्ता है। पिच का समर्थन करने वाले ओपनल साउंड इंजन के एक महान उदाहरण के लिए www.71squared.com से उपलब्ध साउंडमैनेजर क्लास देखें।

+0

ध्यान रखें ओपन केवल वास्तविक समय ऑडियो पिच परिवर्तन का समर्थन करता है, इसका मतलब है कि आप परिवर्तित ऑडियो को सहेज नहीं सकते – hyd00

0
- (void)modifySpeedOf:(CFURLRef)inputURL byFactor:(float)factor andWriteTo:(CFURLRef)outputURL { 

    ExtAudioFileRef inputFile = NULL; 
    ExtAudioFileRef outputFile = NULL; 

    AudioStreamBasicDescription destFormat; 

    destFormat.mFormatID = kAudioFormatLinearPCM; 
    destFormat.mFormatFlags = kAudioFormatFlagsCanonical; 
    destFormat.mSampleRate = 44100 * factor; 
    destFormat.mBytesPerPacket = 2; 
    destFormat.mFramesPerPacket = 1; 
    destFormat.mBytesPerFrame = 2; 
    destFormat.mChannelsPerFrame = 1; 
    destFormat.mBitsPerChannel = 16; 
    destFormat.mReserved = 0; 

    ExtAudioFileCreateWithURL(outputURL, kAudioFileCAFType, 
           &destFormat, NULL, kAudioFileFlags_EraseFile, &outputFile); 

    ExtAudioFileOpenURL(inputURL, &inputFile); 

    //find out how many frames is this file long 
    SInt64 length = 0; 
    UInt32 dataSize2 = (UInt32)sizeof(length); 
    ExtAudioFileGetProperty(inputFile, 
          kExtAudioFileProperty_FileLengthFrames, &dataSize2, &length); 

    SInt16 *buffer = (SInt16*)malloc(kBufferSize * sizeof(SInt16)); 

    UInt32 totalFramecount = 0; 

    AudioBufferList bufferList; 
    bufferList.mNumberBuffers = 1; 
    bufferList.mBuffers[0].mNumberChannels = 1; 
    bufferList.mBuffers[0].mData = buffer; // pointer to buffer of audio data 
    bufferList.mBuffers[0].mDataByteSize = kBufferSize * 
    sizeof(SInt16); // number of bytes in the buffer 

    while(true) { 

     UInt32 frameCount = kBufferSize * sizeof(SInt16)/2; 
     // Read a chunk of input 
     ExtAudioFileRead(inputFile, &frameCount, &bufferList); 
     totalFramecount += frameCount; 

     if (!frameCount || totalFramecount >= length) { 
      //termination condition 
      break; 
     } 
     ExtAudioFileWrite(outputFile, frameCount, &bufferList); 
    } 

    free(buffer); 

    ExtAudioFileDispose(inputFile); 
    ExtAudioFileDispose(outputFile); 

} 

यह कारक

0

मैंने पहले इस बात के लिए NewTimePitch ऑडियो इकाई का उपयोग किया है के आधार पर पिच बदल जाएगा, उस के लिए ऑडियो घटक विवरण

var newTimePitchDesc = AudioComponentDescription(componentType: kAudioUnitType_FormatConverter, 
     componentSubType: kAudioUnitSubType_NewTimePitch, 
     componentManufacturer: kAudioUnitManufacturer_Apple, 
     componentFlags: 0, 
     componentFlagsMask: 0) 

तो आप पिच को बदल सकते है एक ऑडियोUnitSetParamater कॉल के साथ पैरामीटर। उदाहरण के लिए इस -1000 सेंट

err = AudioUnitSetParameter(newTimePitchAudioUnit, 
     kNewTimePitchParam_Pitch, 
     kAudioUnitScope_Global, 
     0, 
     -1000, 
     0) 

मापदंडों से पिच में परिवर्तन इस ऑडियो इकाई के लिए के रूप में

// Parameters for AUNewTimePitch 
enum { 
     // Global, rate, 1/32 -> 32.0, 1.0 
    kNewTimePitchParam_Rate       = 0, 
     // Global, Cents, -2400 -> 2400, 1.0 
    kNewTimePitchParam_Pitch      = 1, 
     // Global, generic, 3.0 -> 32.0, 8.0 
    kNewTimePitchParam_Overlap      = 4, 
     // Global, Boolean, 0->1, 1 
    kNewTimePitchParam_EnablePeakLocking   = 6 
}; 

इस प्रकार हैं, लेकिन आप केवल अपने उद्देश्यों के लिए पिच पैरामीटर को बदलना होगा। जस्टिन के उत्तर को संदर्भित करने के तरीके पर एक गाइड के लिए