AVPlayer を介してビデオのフレーム レートを取得する方法を見つけようとしています。AVPlayerItem にはレート変数がありますが、0 から 2 の間の値しか返されません (再生中は通常 1)。ビデオのフレームレートを取得する方法を知っている人はいますか?
乾杯
AVPlayer を介してビデオのフレーム レートを取得する方法を見つけようとしています。AVPlayerItem にはレート変数がありますが、0 から 2 の間の値しか返されません (再生中は通常 1)。ビデオのフレームレートを取得する方法を知っている人はいますか?
乾杯
を使用しAVAssetTrack's
nominalFrameRate
property
ます。
以下の取得方法:FrameRate
こちらqueuePlayer
AVPlayer
-(float)getFrameRateFromAVPlayer
{
float fps=0.00;
if (self.queuePlayer.currentItem.asset) {
AVAssetTrack * videoATrack = [[videoAsset tracksWithMediaType:AVMediaTypeVideo] lastObject];
if(videoATrack)
{
fps = videoATrack.nominalFrameRate;
}
}
return fps;
}
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 つの減算を行うことです。
AVPlayer
フレームレートの計算に役立つものは何も知りません。
AVPlayerItem
rate
プロパティは再生レートであり、フレーム レートとは関係ありません。
より簡単なオプションは、 を取得してそのプロパティAVAssetTrack
を読み取ることです。nominalFrameRate
を作成するだけAVAsset
で、トラックの配列が得られます。
またはAVAssetReader
、ビデオをフレームごとに読み取り、そのプレゼンテーション時間を取得し、同じ秒にいくつのフレームがあるかをカウントしてから、数秒間またはビデオ全体の平均を取るために使用します。