5

アプリの説明:スピードメーター。ビデオのオーバーレイとして、針のダイヤルとアニメーションの針があります。ポストプロセッシングを介して、針のアニメーションをビデオに出力します。私は AVAssetExportSession を使用し、アニメーション レイヤーとビデオのビデオおよびオーディオ トラックを含む AVComposition を作成します。これはうまくいきます。ビデオショー、針のアニメーション。

現在、後処理中にアニメーションを再生するために、ビデオの「記録」が開始されてからの速度の変化を保存しました。後処理中に、保存された時間/速度データに基づいてタイマーを起動し、針を次の速度にアニメートします。

問題: 結果のビデオ/アニメーションのペアは完全に正確ではなく、ビデオを撮影したときと、再生して合成したときに表示される速度が一致しないことがよくあります。(通常、針はビデオの前にあります) エクスポート中の合成/圧縮は必ずしもリアルタイムではないためです。

質問: 録画ビデオ ストリームに速度情報を埋め込み、エクスポート時にアクセスして、ビデオと速度計が一時的に一致するようにする方法はありますか?

速度データを含むエクスポート中の特定の時間にコールバックを取得できると便利です。

いつものように...ありがとう!

4

5 に答える 5

1

この質問が出されてからしばらく経ちましたが、どこを見ても、記録中にリアルタイムでデータをサンプリングすることで同様のことを思いつきました(30fpsで記録されたビデオのタイマーで1/30秒)および保存それを配列にします。次に、後処理で、配列内の各データ要素のループで複数の CALayer を作成し、各レイヤーにそのデータの視覚化を描画します。

各レイヤーには CAAnimation があり、 beginTime属性 (単純に 1/30 秒) を持つ正しいメディア タイムラインで不透明にフェードインします。配列インデックスを掛けます。これは非常に短い時間であるため、レイヤーが直前のレイヤーの上にすぐに表示されます。レイヤーの背景が不透明な場合、前のレイヤーでレンダリングされた針が見えにくくなるため、元のビデオ キャプチャとかなり同期して針がアニメートされているように見えます。タイミングを少し調整する必要があるかもしれませんが、1 フレームしかずれていません。

/******** this has not been compiled but you should get the idea ************

// Before starting the AVAssetExportSession session and after the AVMutableComposition routine

CALayer* speedoBackground = [[CALayer alloc] init]; // background layer for needle layers
[speedoBackground setFrame:CGRectMake(x,y,width,height)]; // size and location
[speedoBackground setBackgroundColor:[[UIColor grayColor] CGColor]];
[speedoBackground setOpacity:0.5] // partially see through on video

// loop through the data
for (int index = 0; index < [dataArray count]; index++) {

  CALayer* speedoNeedle = [[CALayer alloc] init]; // layer for needle drawing
  [speedoNeedle setFrame:CGRectMake(x,y,width,height)]; // size and location
  [speedoNeedle setBackgroundColor:[[UIColor redColor] CGColor]];
  [speedoNeedle setOpacity:1.0]; // probably not needed

  // your needle drawing routine for each data point ... e.g.
  [self drawNeedleOnLayer:speedoNeedle angle:[self calculateNeedleAngle[dataArray objectAtIndex:index]]];

  CABasicAnimation *needleAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
  needleAnimation.fromValue = [NSNumber numberWithFloat:(float)0.0];
  needleAnimation.toValue = [NSNumber numberWithFloat:(float)1.0]; // fade in
  needleAnimation.additive = NO;
  needleAnimation.removedOnCompletion = NO; // it obscures previous layers
  needleAnimation.beginTime = index*animationDuration;
  needleAnimation.duration = animationDuration -.03; // it will not animate at this speed but layer will appear immediately over the previous layer at the correct media time
  needleAnimation.fillMode = kCAFillModeBoth;
  [speedoNeedle addAnimation:needleAnimation forKey:nil];
  [speedoBackground addSublayer:needleOverlay];
}

[parentLayer addSublayer:speedoBackground];

.
.
.
// when the AVAssetExportSession has finished, make sure you clear all the layers
parentLayer.sublayers = nil;

プロセッサとメモリを大量に消費するため、長いビデオや複雑な描画には適していません。もっとエレガントな方法があると確信していますが、これは機能し、これが役立つことを願っています.

于 2014-03-19T21:09:14.050 に答える
1

CAAnimations と beginTime プロパティを使用して事前にアニメーションを設定してから、AVVideoComposition + AVVideoCompositionCoreAnimationToolを使用して、エクスポート時にそれらをビデオに追加する必要があります。ドキュメントの状態に注意してください。

アニメーションは、リアルタイムではなく、ビデオのタイムラインで解釈されます...

したがって、アニメーションは、結果のムービーで指定した場所に正確に整列します。

于 2011-07-10T01:15:07.590 に答える
1

タイマーを使用して針をアニメーション化する代わりに、記録した速度データに基づいてキーフレーム アニメーションを作成します。

タイマーと CA は一般的にうまく混ざりません。少なくとも、あなたの説明から推測する方法ではそうではありません。

于 2011-07-09T12:39:24.277 に答える
1

アプリが iPhone で実行されているときにメタデータを埋め込む必要がある場合、その方法がわかりません。以前に埋め込みができる場合は、HTTP ライブ ストリーミングと HTTP ライブ ストリーミング ツールを使用します

メタデータは、id3taggenerator によってファイルに生成され、mediafilesegmenter を使用してビデオに埋め込まれます。例:

id3taggenerator -o camera1.id3 -text "Dolly camera"
id3taggenerator -o camera2.id3 -text "Tracking camera"

バイナリ オブジェクトを含む、いくつかの種類のメタデータを埋め込むことができます。詳細については、man ページを参照してください。ここで、生成されたファイルを「メタ マクロ ファイル」から参照する必要があります。これは、次の形式のプレーン テキスト ファイルです。

60 id3 camera1.id3
120 id3 camera2.id3

最初の数字は、通知を挿入するビデオの開始からの経過秒数です。mediafilesegmenter コマンドを正確に覚えていません。申し訳ありませんが、少なくともマクロ ファイル、インデックス、およびビデオ ファイルを渡す必要があります。

MPMoviePlayerController結果のビデオには、通知として投稿されたメタデータが含まれます。詳細については、このページを参照してください: http://jmacmullin.wordpress.com/2010/11/03/adding-meta-data-to-video-in-ios/

于 2011-07-09T13:53:18.003 に答える
0

今年の WWDC には、あなたがしていることへの異なるアプローチを提供するセッションがあります。ビデオはhttp://developer.apple.com/videos/wwdc/2011/で見ることができます。「Working with Media in AVFoundation」というものを探してください。興味深い部分は 26 分前後です。問題を完全に理解しているかどうかはわかりませんが、それを読んだとき、そのセッションが頭に浮かびました。

よろしくお願いします。

于 2011-07-09T23:54:11.750 に答える