6

AVPlayer を介してビデオのフレーム レートを取得する方法を見つけようとしています。AVPlayerItem にはレート変数がありますが、0 から 2 の間の値しか返されません (再生中は通常 1)。ビデオのフレームレートを取得する方法を知っている人はいますか?

乾杯

4

6 に答える 6

16

を使用しAVAssetTrack's nominalFrameRate propertyます。

以下の取得方法:FrameRateこちらqueuePlayerAVPlayer

-(float)getFrameRateFromAVPlayer
{
  float fps=0.00;
  if (self.queuePlayer.currentItem.asset) {
    AVAssetTrack * videoATrack = [[videoAsset tracksWithMediaType:AVMediaTypeVideo] lastObject];
    if(videoATrack)
    {
        fps = videoATrack.nominalFrameRate;
    }
  }
  return fps;
}
于 2013-04-20T06:04:19.607 に答える
2

AVPlayer のレート値は、再生中のリアルタイムに対する速度です。たとえば、0.5 はスローモーション、2 は倍速です。

Paresh Navadiya が指摘しているように、トラックには公称フレームレート変数もありますが、これは時々奇妙な結果をもたらすようです。これまでに見つけた最善の解決策は、次を使用することです。

CMTime frameDuration = [myAsset tracksWithMediaType:AVMediaTypeVideo][0].minFrameDuration;
float fps = frameDuration.timescale/(float)frameDuration.value;

上記は、可変フレーム レートに対してわずかに予想外の結果をもたらしますが、可変フレーム レートはいずれにせよ、少し奇妙な動作をします。それ以外は、私のテストでは ffmpeg -i と一致します。

編集 - -

私は時々上記がkCMTimeZeroの時間を与えることを発見しました. これに使用した回避策は、トラック出力を使用して AVAssetReader を作成し、最初のフレームと 2 番目のフレームのポイントを取得してから、2 つの減算を行うことです。

于 2016-06-14T16:38:40.000 に答える
1

AVPlayerフレームレートの計算に役立つものは何も知りません。

AVPlayerItem rateプロパティは再生レートであり、フレーム レートとは関係ありません。

より簡単なオプションは、 を取得してそのプロパティAVAssetTrackを読み取ることです。nominalFrameRateを作成するだけAVAssetで、トラックの配列が得られます。

またはAVAssetReader、ビデオをフレームごとに読み取り、そのプレゼンテーション時間を取得し、同じ秒にいくつのフレームがあるかをカウントしてから、数秒間またはビデオ全体の平均を取るために使用します。

于 2012-05-22T10:16:41.237 に答える