1

QTKit で QTMovie を開いています。

このビデオの各フレームを YV12 形式 ( kYUV420PixelFormat ) でリアルタイムで取得する必要があります (つまり、YV12 のみを受け入れ、ビデオをリアルタイムで再生する必要がある外部コードに渡します)。

それが行われるべき方法は、現在のフレームに対して[movie frameImageAtTime: [movie currentTime] withAttributes: error: ]を呼び出し、次に[movie stepForward]を呼び出して次のフレームに移動することです。すべてのフレームを取得するまで同様です。 . しかし、調べてみると、QTKit で YV12 形式やその他の YUV 形式のデータを取得する方法が見つかりません。frameImageAtTime:呼び出しで次のように変換できます:

  • NSImage (ただし、NSImage は平面 YUV を格納できません)、
  • CGImage(同じもの)、
  • CIImage(同じもの)、
  • CVPixelBuffer (これは YUV を格納できますが、そこから YUV を取得するように呼び出しを構成する方法がないようです。デフォルトでは ARGB32 データを返します)
  • OpenGL テクスチャ (これもおそらく構成できますが、OpenGL ではこのデータは必要ありません。メモリに必要です)

したがって、このおそらく新しく最適化された QTKit テクノロジを使用する唯一の方法は、そこから ARGB データを取得し、カスタム コードを使用して各フレームを YV12 に変換し、それでもリアルタイムで十分に高速であることを期待することです。または、何か不足していますか?

古い QuickTime では、 kYUV420PixelFormat を使用してGWorldを設定するのは比較的簡単で、それに Movie をレンダリングするだけでうまくいきました。しかし、古い QuickTime 呼び出しはレガシーで非推奨の呼び出しであり、もはや使用されません...

不要な変換なしで YUV420 平面フレームを取得するにはどうすればよいですか?

4

1 に答える 1

0

古いアップルのメーリングリストの1つにあるこのスレッドに基づくと、これは少なくとも以前は不可能だったと思います。私は今、それがより低いレベルのAPIで実行できるかどうかを調べようとしています。

http://lists.apple.com/archives/quicktime-api/2008/Nov/msg00049.html

2008年11月5日午後12時8分、ニール・クレイトンは次のように書いています。

映画からYUVフレームを取得したい(映画はYUVでエンコードされ、フレームは元々k2vuyPixelFormatであり、エンコーダー形式はそれに互換性があります-例:H264またはAICなど)。

私がこれをするとき:

NSError *error = nil;
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
    QTMovieFrameImageTypeCVPixelBufferRef, QTMovieFrameImageType,
    [NSNumber numberWithBool:YES], QTMovieFrameImageHighQuality,
    nil];
CVPixelBufferRef buffer = [qtMovie frameImageAtTime:QTMakeTime(lastFrame, movie.timeScale)
    withAttributes:dict error:&error];

フレームは有効に見えます。正しい幅と高さがあります。しかし、私が行うとき、それはタイプk32ARGBPixelFormatのようです:

OSType type = CVPixelBufferGetPixelFormatType(buffer);

私がこれを間違った方法で行っていると仮定すると、映画からタイプk2vuyPixelFormatのフレームを取得するための正しい方法は何ですか?または、これが不可能な場合、RGB-YUVをタイプk2vuyPixelFormatのCVPixelBufferに変換する最も簡単な方法は何ですか?ここでは速度は必要ありません(1回限りの1フレーム操作です)。

20008年11月7日、QuickTimeEngineeringのTimMonroeは次のように応答します。

現在、frameImageAtTimeを介して必要なことを行う方法はありません。拡張リクエストを提出することをお勧めします。

于 2011-09-04T07:39:35.413 に答える