13

私は、オーディオを(C ++)分析アルゴリズムに渡すことができる形式でiPhoneに取り込む作業を行っています。もちろん、多くのオプションがあります。TrailsinthesandのAudioQueueチュートリアルは、物事を開始します。

オーディオコールバックは、しかし、を与えますAudioQueueRef、そして私は物事のこちら側でAppleのドキュメントが薄いと感じています。ファイルに書き込むための組み込みメソッドですが、データを確認するために実際にパケット内をピアリングする場所はありません。

データが必要です。私はファイルに何も書きたくありません。それはすべてのチュートリアル、そしてAppleの便利なI/Oオブジェクトでさえも狙っているようです。AppleはAVAudioRecorder(腹立たしいことに)あなたにレベルを与えてデータを書きますが、実際にはあなたにそれにアクセスすることはできません。私が何かを逃していない限り...

これを行う方法?以下のコードにinBuffer->mAudioDataは、興味をそそるほど近いものがありますが、この「データ」の形式やアクセス方法に関する情報は見つかりません。

AudioQueueコールバック:

void AudioInputCallback(void *inUserData,
    AudioQueueRef inAQ,
    AudioQueueBufferRef inBuffer,
    const AudioTimeStamp *inStartTime,
    UInt32 inNumberPacketDescriptions,
    const AudioStreamPacketDescription *inPacketDescs)
{
    static int count = 0;
    RecordState* recordState = (RecordState*)inUserData;    
    AudioQueueEnqueueBuffer(recordState->queue, inBuffer, 0, NULL);

    ++count;
    printf("Got buffer %d\n", count);
}

そして、オーディオをファイルに書き込むためのコード:

OSStatus status = AudioFileWritePackets(recordState->audioFile,
                false,
                inBuffer->mAudioDataByteSize,
                inPacketDescs,
                recordState->currentPacket,
                &inNumberPacketDescriptions,
                inBuffer->mAudioData); // THIS! This is what I want to look inside of.
if(status == 0)
{
     recordState->currentPacket += inNumberPacketDescriptions;
}
4

2 に答える 2

10
  // so you don't have to hunt them all down when you decide to switch to float: 
  #define AUDIO_DATA_TYPE_FORMAT SInt16

  // the actual sample-grabbing code:
  int sampleCount = inBuffer->mAudioDataBytesCapacity / sizeof(AUDIO_DATA_TYPE_FORMAT);
  AUDIO_DATA_TYPE_FORMAT *samples = (AUDIO_DATA_TYPE_FORMAT*)inBuffer->mAudioData;

次に、からアクセスできる(この場合はSInt16)配列があります。samplessamples[0]samples[sampleCount-1]

于 2011-11-01T14:10:34.830 に答える
0

上記の解決策は私にとってはうまくいきませんでした。間違ったサンプル データ自体を取得していました。

-(void)feedSamplesToEngine:(UInt32)audioDataBytesCapacity audioData:(void *)audioData { int sampleCount = audioDataBytesCapacity / sizeof(SAMPLE_TYPE);

SAMPLE_TYPE *samples = (SAMPLE_TYPE*)audioData;
//SAMPLE_TYPE *sample_le = (SAMPLE_TYPE *)malloc(sizeof(SAMPLE_TYPE)*sampleCount );//for swapping endians

std::string shorts;
double power = pow(2,10);
for(int i = 0; i < sampleCount; i++)
{
    SAMPLE_TYPE sample_le =  (0xff00 & (samples[i] << 8)) | (0x00ff & (samples[i] >> 8)) ; //Endianess issue
    char dataInterim[30];
    sprintf(dataInterim,"%f ", sample_le/power); // normalize it.
    shorts.append(dataInterim);
}
于 2017-06-22T13:45:44.283 に答える