8

ライブ ネットワーク ストリームから 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);
 }

順序付けされると、コールバック側のタイム スタンプは予想される速度で単調に増加しますが、バッファは正しい順序ではありません。ここで私がどこでエラーを起こしているのか誰にもわかりますか? または、コールバック側でバッファの順序を決定する方法を知っていますか? この時点で、考えられることはすべて試しました。

4

3 に答える 3