Прочитать звуковой файл, добавить эхо и записать новый звуковой файл

Я пытаюсь выполнить следующее:

  1. Чтение звукового файла в память
  2. Разделите его на блоки и добавьте эхо с предопределенным смещением (2 возможных значения смещения).
  3. Сохранить как новый файл

У меня есть следующий код для чтения звукового файла в память:

NSURL   *urlToCAF = [NSURL URLWithString:@"simple-drum-beat.caf"];

ExtAudioFileRef caf;
OSStatus    status;

status = ExtAudioFileOpenURL((__bridge CFURLRef)urlToCAF, &caf);
if(noErr == status) {
    // request float format
    const UInt32 NumFrames = 1024;
    const int ChannelsPerFrame = 1;  // Mono, 2 for Stereo

    // request float format
    AudioStreamBasicDescription clientFormat;
    clientFormat.mChannelsPerFrame = ChannelsPerFrame;
    clientFormat.mSampleRate = 44100;

    clientFormat.mFormatID = kAudioFormatLinearPCM;
    clientFormat.mFormatFlags = kAudioFormatFlagIsFloat | kAudioFormatFlagIsNonInterleaved; // float
    int cmpSize = sizeof(float);
    int frameSize = cmpSize*ChannelsPerFrame;
    clientFormat.mBitsPerChannel = cmpSize*8;
    clientFormat.mBytesPerPacket = frameSize;
    clientFormat.mFramesPerPacket = 1;
    clientFormat.mBytesPerFrame = frameSize;

    status = ExtAudioFileSetProperty(caf, kExtAudioFileProperty_ClientDataFormat, sizeof(clientFormat), &clientFormat);
    if(noErr != status) { /* handle it */ }

    while(1) {
        float   buf[ChannelsPerFrame*NumFrames];
        AudioBuffer ab = { ChannelsPerFrame, sizeof(buf), buf };
        AudioBufferList abl;
        abl.mNumberBuffers = 1;
        abl.mBuffers[0] = ab;

        UInt32  ioNumFrames = NumFrames;
        status = ExtAudioFileRead(caf, &ioNumFrames, &abl);

        if(noErr == status) {
            // do something here
        }
    }

    // later
    status = ExtAudioFileDispose(caf);
    if(noErr != status) { /* hmm */ }
}

Не могли бы вы предоставить мне необходимый код для добавления эха в каждый блок, а затем для сохранения звука в виде нового файла?

Я признателен за это.


person codeman    schedule 07.03.2014    source источник


Ответы (1)


Это граничит с "пожалуйста, напишите мой код для меня"

Вставка эха тривиальна, если у вас есть звуковые волны в буфере:

out[k] = in[k] + in[k-30]

Сохранение в файл Я уверен, что вы можете найти с помощью Google. Постарайтесь, чтобы ваши вопросы касались одной конкретной вещи.

Я рекомендую заглянуть на http://theamazingaudioengine.com/ — это значительно упрощает жизнь!

person P i    schedule 23.03.2014