10

AVAssetWriterプロセスの進行状況を計算するにはどうすればよいですか?だから私が次のようなものを持っている場合:

[assetWriterInput requestMediaDataWhenReadyOnQueue:queue usingBlock:^{
  while (1){
    if ([assetWriterInput isReadyForMoreMediaData]) {
      CMSampleBufferRef sampleBuffer = [audioMixOutput copyNextSampleBuffer];
      if (sampleBuffer) {
        [assetWriterInput appendSampleBuffer:sampleBuffer];
        CFRelease(sampleBuffer);
      } else {
        [assetWriterInput markAsFinished];
        break;
      }
    }
  }
}];

ループ中に何をプル(またはポーリング)して、yのxをいくつ完了したかを把握できますか?

ありがとう。

4

2 に答える 2

22

サンプルバッファには、いくつかのタイムスタンプがあります。次の呼び出しでプレゼンテーションのタイムスタンプを取得できます。

CMTime presTime = CMSampleBufferGetPresentationTimeStamp( sampleBuffer );

次に、それを使用して、入力バッファーのソースまでの距離を判断できます。presTime / durationは、おおよその進行状況を表す0.0から1.0の値を提供するはずです。より正確にする必要がある場合は、CMSampleBufferGetDuration()を使用して、サンプルバッファー内のサンプルの期間を考慮に入れることができます。

プレゼンテーション時間がうまくいかない場合は、ヘッダーの近くにある他のタイムスタンプを確認してください。

于 2010-10-27T03:29:52.587 に答える
4

以下のコードを使用して進行状況を追跡できます。ビデオの合計再生時間が必要であり、以下のコードを使用できます。

let asset = AVAsset(url: urlToCompress);
let duration = asset.duration
let durationTime = CMTimeGetSeconds(duration)

次に、圧縮されたビデオの現在のタイムスタンプを計算する必要があります。

let timeStamp = CMSampleBufferGetPresentationTimeStamp(sample!)
let timeSecond = CMTimeGetSeconds(timeStamp)
let per = timeSecond / durationTime
print("Duration --- \(per)")
DispatchQueue.main.async {
    self.progress.progress = Float(per)
}
于 2018-07-31T12:47:32.057 に答える