Core Audio AudioFIleReadPackets ... ищет необработанный звук - PullRequest
1 голос
/ 18 сентября 2010

Я пытаюсь получить необработанные аудиоданные из файла (я привык видеть значения с плавающей запятой в диапазоне от -1 до 1).

Я пытаюсь извлекать эти данные из буферов в режиме реального времени, чтобы я мог обеспечить некоторый тип измерения для приложения.

Я в основном считываю весь файл в память, используя AudioFileReadPackets. Я создал аудиоустройство RemoteIO для воспроизведения и внутри Воспроизведения, я передаю mData в AudioBuffer, чтобы его можно было отправлять на оборудование.

Большая проблема, с которой я сталкиваюсь, заключается в том, что данные, отправляемые в буферы из моего массива данных (из AudioFileReadPackets), представляют собой UInt32 ... Я действительно запутался. Похоже, он 32-битный, и я установил пакеты / кадры по 4 байта каждый. Как, черт возьми, я могу получить мои необработанные аудиоданные (от -1 до 1) из этого?

Это моё описание формата

// Describe format
audioFormat.mSampleRate         = 44100.00;
audioFormat.mFormatID           = kAudioFormatLinearPCM;
audioFormat.mFormatFlags        = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
audioFormat.mFramesPerPacket    = 1;
audioFormat.mChannelsPerFrame   = 2;
audioFormat.mBitsPerChannel     = 16;
audioFormat.mBytesPerPacket     = 4;
audioFormat.mBytesPerFrame      = 4;

Я сейчас читаю волновой файл.

Спасибо!

Ответы [ 2 ]

1 голос
/ 20 сентября 2010

Я точно не знаю, почему вы получаете данные UInt32 от этого обратного вызова, хотя я подозреваю, что на самом деле это два чересстрочных пакета UInt16, по одному на каждый канал.В любом случае, если вам нужны данные с плавающей запятой из файла, их необходимо преобразовать, и я не уверен, что то, что рекомендует @Джон Баллинджер, является правильным.Мое предложение будет:

// Get buffer in render/read callback
SInt16 *frames = inBuffer->mAudioData;
for(int i = 0; i < inNumPackets; i++) {
  Float32 currentFrame = frames[i] / 32768.0f;
  // Do stuff with currentFrame (add it to your buffer, etc.)
}

Вы не можете просто привести кадры к нужному формату.Если вам нужны данные с плавающей запятой, вам нужно разделить их на 32768, что является максимально возможным значением для 16-битных выборок.Это даст правильные данные с плавающей запятой в диапазоне {-1.0 .. 1.0}.

0 голосов
/ 18 сентября 2010

Посмотрите на эту функцию ... Данные SInt16.

static void recordingCallback (
    void                                *inUserData,
    AudioQueueRef                       inAudioQueue,
    AudioQueueBufferRef                 inBuffer,
    const AudioTimeStamp                *inStartTime,
    UInt32                              inNumPackets,
    const AudioStreamPacketDescription  *inPacketDesc
) {


    // This callback, being outside the implementation block, needs a reference to the AudioRecorder object
    AudioRecorder *recorder = (AudioRecorder *) inUserData;

    // if there is audio data, write it to the file
    if (inNumPackets > 0) {

        SInt16 *frameBuffer = inBuffer->mAudioData;
        //NSLog(@"byte size %i, number of packets %i, starging packetnumber %i", inBuffer->mAudioDataByteSize, inNumPackets,recorder.startingPacketNumber);

        //int totalSlices = 1;
        //int framesPerSlice = inNumPackets/totalSlices;
        float total = 0;
        for (UInt32 frame=0; frame<inNumPackets; frame+=20) {
            total += (float)abs((SInt16)frameBuffer[frame]) ; 
        }
...