どのように私はAVAssetWriterの書き込みの進行状況を追跡することができますか?

StackOverflow https://stackoverflow.com/questions/4028636

質問

どのように私は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;
      }
    }
  }
}];
私はループの中に引いて(またはポーリング)ことができるか、私が完了したどのように多くのx、yの把握する?

感謝します。

役に立ちましたか?

解決

サンプルバッファーは、それらのいくつかのタイムスタンプを持っています。

:あなたが呼び出しでプレゼンテーションタイムスタンプを得ることができます
CMTime presTime = CMSampleBufferGetPresentationTimeStamp( sampleBuffer );

あなたは、あなたが入力バッファのためのあなたの源にしているどのくらいかを決定するためにそれを使用することができます。 presTime /期間は、あなたのおおよその進行状況を表す0.0から1.0の値を与える必要があります。あなたがより正確にするために必要な場合は、CMSampleBufferGetDurationを()を使用して、サンプルバッファ内のサンプルの期間で倍にしてみてください可能性があります。

プレゼンテーションの時間は、あなたがヘッダに近く、他のタイムスタンプを見てみます。

のために仕事をしない場合

他のヒント

あなたは以下のコードを使用して進行状況を追跡することができます。あなたは、ビデオの合計時間を必要とし、あなたは以下のコードを使用して取得します。

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)
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top