マイクのサンプルをキャプチャして ffmpeg で mp3 にエンコードする必要があるオーディオ アプリがあります。
最初にオーディオを構成します。
/** * 作業したい形式を指定する必要があります。 * 非圧縮の Linear PCM を使用し、生データで作業します。 * 詳細については、チェックしてください。 * * 8khz でパケット/フレームごとに 16 ビット、2 バイト (短いバイト) が必要です */ AudioStreamBasicDescription audioFormat; audioFormat.mSampleRate = SAMPLE_RATE; audioFormat.mFormatID = kAudioFormatLinearPCM; audioFormat.mFormatFlags = kAudioFormatFlagIsPacked | kAudioFormatFlagIsSignedInteger; audioFormat.mFramesPerPacket = 1; audioFormat.mChannelsPerFrame = 1; audioFormat.mBitsPerChannel = audioFormat.mChannelsPerFrame*sizeof(SInt16)*8; audioFormat.mBytesPerPacket = audioFormat.mChannelsPerFrame*sizeof(SInt16); audioFormat.mBytesPerFrame = audioFormat.mChannelsPerFrame*sizeof(SInt16);
録音コールバックは次のとおりです。
static OSStatus recordingCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber、 UInt32 inNumberFrames、 AudioBufferList *ioData) { NSLog(@"ログ レコード: %lu", inBusNumber); NSLog(@"ログ レコード: %lu", inNumberFrames); NSLog(@"ログ記録: %lu", (UInt32)inTimeStamp); // データはここにレンダリングされます AudioBuffer バッファ; // ステータスをチェックする変数 OSStatus ステータス。 /** これは、コールバックを所有するオブジェクトへの参照です。 */ AudioProcessor *audioProcessor = (__bridge AudioProcessor*) inRefCon; /** この時点で、モノラルであるチャンネル数を定義します アイフォン用。フレーム数は通常 512 または 1024 です。 */ buffer.mDataByteSize = inNumberFrames * sizeof(SInt16); // サンプルサイズ buffer.mNumberChannels = 1; // 1 チャンネル buffer.mData = malloc( inNumberFrames * sizeof(SInt16) ); // バッファサイズ // レンダリングのためにバッファを bufferlist 配列に入れます AudioBufferList bufferList; bufferList.mNumberBuffers = 1; bufferList.mBuffers[0] = バッファ; // 入力をレンダリングしてエラーをチェック status = AudioUnitRender([audioProcessor audioUnit], ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, &bufferList); [audioProcessor hasError:status:__FILE__:__LINE__]; // オーディオ プロセッサでバッファリストを処理します [audioProcessor processBuffer:&bufferList]; // バッファをクリーンアップ free(bufferList.mBuffers[0].mData); //NSLog(@"RECORD"); noErr を返します。 }
データあり:
インバス番号 = 1
inNumberFrames = 1024
inTimeStamp = 80444304 // ずっと同じ inTimeStamp、これはおかしい
ただし、mp3 をエンコードするために必要なフレームサイズは 1152 です。どうすれば設定できますか?
バッファリングを行うと遅延が発生しますが、リアルタイムアプリなので避けたいと思います。この構成を使用すると、各バッファーにゴミの末尾のサンプルが表示されます。1152 - 1024 = 128 個の不良サンプルです。すべてのサンプルは SInt16 です。