سؤال

وأنا أبحث عن وسيلة لتغيير الملعب من تسجيل الصوت وحفظه إلى القرص، أو تشغيلها مرة أخرى (في الوقت الحقيقي). وأنا أفهم وحدات الصوت يمكن استخدامها لهذا الغرض. يقدم اي فون دعم محدود لوحدات الصوت (على سبيل المثال ليس من الممكن لإنشاء / استخدام مخصصة حدات صوتية، بقدر ما استطيع ان اقول)، ولكن العديد من خارج المربع، هي وحدات الصوت المتاحة، واحدة منها هي AUPitch.

وكيف بالضبط وأود أن استخدام وحدة الصوت (على وجه التحديد AUPitch)؟ هل وصل الأمر إلى قائمة انتظار الصوت بطريقة أو بأخرى؟ هل من الممكن أن وحدات الصوت سلسلة معا (على سبيل المثال، لإضافة في وقت واحد لها تأثير الصدى وتغيير في الملعب)؟

وتحرير: بعد تفتيش رؤوس فون SDK (على ما أظن AudioUnit.h، وأنا لست أمام ماك في الوقت الحاضر)، لاحظت أن AUPitch وعلق بها. حتى لا تبدو وكأنها AUPitch يتوفر على اي فون بعد كل شيء. يبكي يبكي

وأبل ويبدو أن أفضل تنظيم الوثائق فون SDK الخاصة بهم في developer.apple.com في الآونة الأخيرة - الآن أكثر صعوبة للعثور على ما يشير إلى AUPitch، الخ.

وقال ذلك، ما زلت مهتما أجوبة نوعية على استخدام وحدات الصوت (بشكل عام) على اي فون.

هل كانت مفيدة؟

المحلول

وهناك بعض موارد جيدة جدا هنا ( http://michael.tyson.id.au/2008/11/04/using-remoteio-audio-unit/ ) لاستخدام وحدة RemoteIO الصوت. في تجربتي في العمل مع وحدات الصوت على اي فون، لقد وجدت أن أستطيع تنفيذ التحول يدويا في وظيفة رد الاتصال. في القيام بذلك، قد تجد أن يحل لك المشكلة.

نصائح أخرى

وفيما يتعلق تغيير الملعب على اي فون، مكتبة الصوت المفتوحة هو الطريق للذهاب. تحقق من الطبقة SoundManager المتاحة من www.71squared.com لمثال عظيم على محرك الصوت مكتبة الصوت المفتوحة التي تدعم الملعب.

- (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);

}

وأنها سوف تغير الملعب على أساس عامل

ولقد استعملت وحدة الصوت NewTimePitch لهذا من قبل، والوصف مكون الصوت لأنه لا

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

وبعد ذلك يمكنك تغيير المعلمة الملعب مكالمة AudioUnitSetParamater. على سبيل المثال هذا يغير الملعب من قبل -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
};

ولكن عليك فقط لتغيير المعلمة الملعب لأغراضك. للحصول على دليل حول كيفية تنفيذ هذا الرجوع إلى الإجابة جستن

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top