2013-08-20 3 views
0

Я пытаюсь принять часть записи примера Apple под названием «SpeakHere» в моих целях. Все кажется прекрасным, но мне нужно добавить опцию, которая на самом деле предлагает 8-битную запись. Это соответствует спецификации, не разрешенной никакими настройками звука, поэтому мне нужно какое-то преобразование с 16 бит. Думаю, мне нужно поместить его в функцию обратного вызова.Linear PCM 16 бит до 8 бит

// ____________________________________________________________________________________ 
// AudioQueue callback function, called when an input buffers has been filled. 
void AQRecorder::MyInputBufferHandler( void *        inUserData, 
             AudioQueueRef      inAQ, 
             AudioQueueBufferRef     inBuffer, 
             const AudioTimeStamp *    inStartTime, 
             UInt32        inNumPackets, 
             const AudioStreamPacketDescription* inPacketDesc) 
{ 
    AQRecorder *aqr = (AQRecorder *)inUserData; 
    try { 
     if (inNumPackets > 0) { 
      // write packets to file 
      XThrowIfError(AudioFileWritePackets(aqr->mRecordFile, FALSE, inBuffer->mAudioDataByteSize, 
              inPacketDesc, aqr->mRecordPacket, &inNumPackets, inBuffer->mAudioData), 
         "AudioFileWritePackets failed"); 
      aqr->mRecordPacket += inNumPackets; 
     } 

     // if we're not stopping, re-enqueue the buffe so that it gets filled again 
     if (aqr->IsRunning()) 
      XThrowIfError(AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL), "AudioQueueEnqueueBuffer failed"); 
    } catch (CAXException e) { 
     char buf[256]; 
     fprintf(stderr, "Error: %s (%s)\n", e.mOperation, e.FormatError(buf)); 
    } 
} 

, но, честно говоря, не знаю как. Любая идея будет оценена по достоинству.

+0

Я думаю, вам просто нужно разделить каждую выборку по 256. Я не знаком с абстракциями и структур данных, используемых в образце, но если вы можете получить исходные данные PCM, вы просто относиться к каждому два байты как 'подписанный короткий int' и делить каждый на 256 и записывать в буфер' signed char'. Конечно, вам все равно нужно создать правильные метаданные, чтобы указать, что ваши данные являются 8-битными для каждого образца аудиосигнала PCM. – yzt

ответ

0

После довольно расследования и пытается вещи, я обнаружил, что мне не нужно преобразование, но просто установить различные флаги формата.

 
mRecordFormat.mFormatFlags  = kLinearPCMFormatFlagIsBigEndian; 
mRecordFormat.mBitsPerChannel = 8; 
0

Почему вы не пытаетесь инициализировать свою аудио-очередку чем-то подобным?

aqData.mDataFormat.mFormatID = kAudioFormatLinearPCM;  // 2 
    aqData.mDataFormat.mSampleRate = 44100.0;     // 3 
    aqData.mDataFormat.mChannelsPerFrame = 1;     // 4 
    aqData.mDataFormat.mBitsPerChannel = 8;      // 5 
    aqData.mDataFormat.mBytesPerPacket =       // 6 
    aqData.mDataFormat.mBytesPerFrame = 
    aqData.mDataFormat.mChannelsPerFrame * sizeof (SInt8); 
    aqData.mDataFormat.mFramesPerPacket = 1;      // 7 

    AudioFileTypeID fileType = kAudioFileAIFFType;    // 8 
    aqData.mDataFormat.mFormatFlags =       // 9 
    kLinearPCMFormatFlagIsBigEndian 
    | kLinearPCMFormatFlagIsSignedInteger 
    | kLinearPCMFormatFlagIsPacked; 
+0

Следующие вариации линейного аудиосигнала PCM должны поддерживаться всеми анализаторами CAF: Любая частота дискретизации Образцы 16-, 24- и 32-разрядного знакового целого числа, как больших, так и малых чисел Образцы 32- и 64-битная с плавающей запятой, как большая, так и малозначная – Vanya