0

そのため、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 は気にしません。

助けてくれてありがとう、これは非常にイライラさせられました!

  • ジェームズ
4

1 に答える 1

0

そうです、私は最終的にこの問題に対する答えを見つけたので、My Q.を解決策で更新すると思いました。

したがって、問題は AVAssetReaderMixAudioOutput が実際に何をするかについての私の理解にありました。

複数のオーディオ トラックのミックスを提供できると思っていましたが、実際には、ユーザーが指定した方法でトラックをミックスし、単一のオーディオ トラックを返すことを意味しています。(ここでの「トラック」は、ステレオ サウンドの 1 つのトラックである可能性があることに注意してください)

ファイルからマルチトラック サウンドを取得するには、抽出するすべてのトラックに対して AVAssetReader が必要です。

誰かがこれが役立つことを願っています

于 2015-07-02T06:45:16.643 に答える