ライブ ネットワーク ストリームから h264 ビデオをデコードする必要があるプロジェクトがあり、最終的に iOS デバイスの別のフレームワーク (Unity3D) で表示できるテクスチャになります。VTDecompressionSession を使用してビデオを正常にデコードし、CVMetalTextureCacheCreateTextureFromImage (または OpenGL バリアント) を使用してテクスチャを取得できます。低レイテンシのエンコーダーを使用し、画像バッファーが表示順に表示される場合はうまく機能しますが、通常のエンコーダーを使用すると、画像バッファーは表示順に表示されず、画像バッファーの並べ替えは明らかにはるかに困難です。私は期待した。
最初の試みは、kVTDecodeFrame_EnableAsynchronousDecompression と kVTDecodeFrame_EnableTemporalProcessing を使用して VTDecodeFrameFlags を設定することでした...ただし、VTDecompressionSession はフラグを無視して、必要なことを実行することを選択できることがわかりました...そして私の場合、フラグを無視することを選択しても出力しますエンコーダー順のバッファー (表示順ではありません)。本質的に役に立たない。
次の試みは、イメージ バッファをプレゼンテーション タイム スタンプに関連付けてから、テクスチャを作成するときに必要なイメージ バッファを取得できるようにするベクトルにスローすることでした。問題は、タイム スタンプに関連付けられている VTDecompressionSession に入るイメージ バッファーが、出力されるバッファーと同じではなくなり、本質的にタイム スタンプが役に立たなくなることです。
たとえば、デコーダーに入ると...
VTDecodeFrameFlags flags = kVTDecodeFrame_EnableAsynchronousDecompression;
VTDecodeInfoFlags flagOut;
// Presentation time stamp to be passed with the buffer
NSNumber *nsPts = [NSNumber numberWithDouble:pts];
VTDecompressionSessionDecodeFrame(_decompressionSession, sampleBuffer, flags,
(void*)CFBridgingRetain(nsPts), &flagOut);
コールバック側で...
void decompressionSessionDecodeFrameCallback(void *decompressionOutputRefCon, void *sourceFrameRefCon, OSStatus status, VTDecodeInfoFlags infoFlags, CVImageBufferRef imageBuffer, CMTime presentationTimeStamp, CMTime presentationDuration)
{
// The presentation time stamp...
// No longer seems to be associated with the buffer that it went in with!
NSNumber* pts = CFBridgingRelease(sourceFrameRefCon);
}
順序付けされると、コールバック側のタイム スタンプは予想される速度で単調に増加しますが、バッファは正しい順序ではありません。ここで私がどこでエラーを起こしているのか誰にもわかりますか? または、コールバック側でバッファの順序を決定する方法を知っていますか? この時点で、考えられることはすべて試しました。