そのため、AVAssetReaderMixAudioOutput を使用して、quicktime ファイルからオーディオ サンプルを抽出しています。この場合、複数のオーディオ トラックを含む ProRes ビデオです。
(4 トラック、16 ビット、インターリーブ サンプル littleEndian @ 48000)
ビデオ フレームを正常に取得できますが、[myAssetReaderAudioMixOutput copyNextSampleBuffer] を呼び出すと、奇妙な問題が発生します..返されるオーディオはすべて最初のチャネルにあるようです。
個々の trackOutputReader を使用して、最初のフレームの各トラックの最初のオーディオ サンプルを取得します。
620B 700E 0000 0000
しかし、AVAssetReaderMixAudioOutput を使用すると、
D219 0000 0000 0000
(620B + 700E = D219 であることに注意してください) AVAssetReaderMixAudioOutput が 4 つのチャネル全体のすべての値を合計し、結果をトラック 1 に表示しているように見えます??
誰でも理由を説明できますか?そしてそれを修正する方法は?チャンネルが QuickTime ファイルにあるように、チャンネルを 1:1 でマッピングするソリューションが必要です。1 チャンネルと 16 チャンネルの両方のオーディオを含むファイルで動作する必要があります。
各オーディオ チャネル/タックで copyNextSampleBuffer を単独で実行することにより、最初のサンプルの正しい値を取得しました。
これは、myAssetReaderAudioMixOutput を作成するために使用した辞書です....
NSDictionary *outputSettings =
[NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey,
[NSNumber numberWithFloat:48000], AVSampleRateKey,
[NSNumber numberWithInt:4], AVNumberOfChannelsKey,
[NSNumber numberWithInt:16], AVLinearPCMBitDepthKey,
[NSNumber numberWithBool:NO], AVLinearPCMIsNonInterleaved,
[NSNumber numberWithBool:NO], AVLinearPCMIsFloatKey,
[NSNumber numberWithBool:NO], AVLinearPCMIsBigEndianKey,
nil];
myAssetReaderAudioMixOutput = [AVAssetReaderAudioMixOutput assetReaderAudioMixOutputWithAudioTracks:audioTracks audioSettings: outputSettings];
次のコードを使用して、CMSampleBuffer から実際のオーディオ サンプル/データを読み取ります。
enteraudioBuffer = [assetReaderAudioMixOutput copyNextSampleBuffer]; if (audioBuffer) { CMBlockBufferRef audioBlockBuffer = CMSampleBufferGetDataBuffer(audioBuffer);
// lets get some more info about our SampleBuffer, or at least sample size for sample 0!
CMTime sampleDuration = CMSampleBufferGetDuration(audioBuffer);
size_t sampleSize = CMSampleBufferGetSampleSize(audioBuffer, 0);
CMItemCount numSamplesInBuffer = CMSampleBufferGetNumSamples(audioBuffer);
bfAudioBuffer* pbfBuffer = new bfAudioBuffer();
int samplesNeededForThisFrame = 1920; // sample for FrameNo(frameNo, vidMode);
int sizeOfDataToBeCopied = samplesNeededForThisFrame * sampleSize
// Audio Samples for 1 frames worth of audio should be copied into pbfBuffer->pPcmBuffer
CMBlockBufferCopyDataBytes(audioBlockBuffer, 0, sizeOfDataToBeCopied, pbfBuffer->pPcmBuffer);
}
(申し訳ありませんが、コードを貼り付けるとコードが壊れているようです。理由はわかりません。いくつかの異なることを試しました-申し訳ありません)
だから私の問題は、辞書を設定するか、サンプルを読むことにあると思います。私は同じシステムを使用して 1 つのトラックのサンプルを読み取りますが、それでよいのでしょうか? 4 トラックの正しい量のデータ/サンプルを提供しているのに、最初のトラックにしか情報を入れていない理由が理解できません。
最後に、私は OSX を使用しています。iOS は気にしません。
助けてくれてありがとう、これは非常にイライラさせられました!
- ジェームズ