2012-05-19 2 views
3

Im пытается выяснить, как получить частоту кадров видео через AVPlayer. AVPlayerItem имеет переменную скорости, но возвращает только значение от 0 до 2 (обычно 1 при воспроизведении). У кого-нибудь есть идея, как получить частоту кадров видео?IOS AVPlayer get fps

Приветствия

ответ

1

Я ничего AVPlayer, что может помочь вам рассчитать частоту кадров не знаю.

AVPlayerItemrate свойство - скорость воспроизведения, не связанная с частотой кадров.

Более простые варианты - получить AVAssetTrack и прочитать его имущество nominalFrameRate. Просто создайте AVAsset, и вы получите массив треков.

Или используйте AVAssetReader, чтобы просмотреть видео кадр за кадром, получить время его представления и подсчитать, сколько кадров в одну секунду, а затем среднее значение в течение нескольких секунд или всего видео.

+0

'nomFrameRate' - самый простой способ. Начиная с AVPlayer, вы можете получить его 'currentItem', затем' треки', а затем каждый трек 'assetTrack', а затем каждый номинальный символ ресурса' номиналFrameRate'. Обратите внимание, что фильмы могут иметь несколько видеодорожек, а некоторые (только для аудио) не имеют видеодорожек. –

8

AVAssetTrack'snominalFrameRateproperty.

Ниже метод, чтобы получить 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; 
} 
+1

Отличный ответ, очень помог мне. – AddisDev

+0

Это, похоже, больше не работает в iOS 7. NovemberFrameRate возвращает 0 для того же видео, что возвращает правильное значение в предыдущих версиях iOS. Кто-нибудь еще переживает это? Я поставил отчет об ошибке Apple. – AddisDev

+1

Это работает для меня в iOS 7.0 – lehn0058

2

Там, кажется, расхождение в этом nominalFrameRate вернулся за те же средства массовой информации играют на разных версиях IOS. У меня есть видео, которое я кодировал с помощью ffmpeg со скоростью 1 кадр в секунду (125 кадров) с ключевыми кадрами каждые 25 кадров и при загрузке в приложении на iOS 7.x (номинальная) частота кадров равна 1,0, а на iOS 8.x - номинальная) частота кадров 0,99. Это кажется очень маленькой разницей, однако в моем случае мне нужно ориентироваться именно на данный кадр в фильме, и эта разница закручивает такую ​​навигацию (фильм является кодировкой последовательности презентационных слайдов). Учитывая, что я уже знаю частоту кадров видео, которое нужно играть в моем приложении (например, 1 к/с), я могу просто полагаться на это значение вместо того, чтобы динамически определять частоту кадров (через номинальное значение FrameRate), однако мне интересно, ПОЧЕМУ есть такое несоответствие между iOS, поскольку этот номинальный FrameRate идет. Есть идеи?

+0

Я получаю то же поведение по Йосемити. У меня есть несколько видеороликов со скоростью 10 кадров в секунду и 20 кадров в секунду. Маверикс сообщает об этом правильно. Однако, по Yosemite, они получают как 9.9010 и 18.1818 соответственно. –

+0

Вы решили это? Если вы закодировали видео с частотой 125 кадров в секунду, то не должна быть правильной частоты кадров 125, а не 1,0 (на iOS 7)? – Crashalot

+0

@DineshIyer было бы недействительным, чтобы округлить частоту кадров до ближайшего целого числа? – Crashalot

1

Значение скорости на AVPlayer - это скорость относительно реального времени, к которой он играет, например, 0,5 - медленное движение, 2 - двойная скорость.

Как указывает Пареш Навадия, на дорожке также есть номинальная переменная FrameRate, однако это иногда дает странные результаты. самое лучшее решение, которое я нашел до сих пор использовать следующее:

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

выше дает несколько неожиданные результаты для переменной частотой кадров, но переменной частотой кадров имеет немного странное поведение в любом случае. Кроме того, он соответствует ffmpeg -i в моих тестах.

EDIT ----

Я нашел иногда выше, дает время kCMTimeZero. Обходной путь, который я использовал для этого, - создать AVAssetReader с выходом трека, получить очки первого кадра и второго кадра, а затем вычесть их.

Смежные вопросы