2012-05-19 2 views
3

Im은 AVPlayer를 통해 비디오 프레임 속도를 검색하는 방법을 알아 내려고합니다. AVPlayerItem에는 속도 변수가 있지만 0과 2 사이의 값만 반환합니다 (일반적으로 재생할 때 1). 비디오 프레임 속도를 얻는 방법에 대해 누구나 알고 있습니까?IOS AVPlayer get fps

건배

답변

1

난 당신이 프레임 속도를 계산하는 데 도움이 될 수 있습니다 AVPlayer에 아무것도 몰라.

AVPlayerItemrate 속성은 재생 속도이며 프레임 속도와 관련이 없습니다.

더 쉬운 옵션은 AVAssetTrack을 얻고 nominalFrameRate 속성을 읽는 것입니다. AVAsset을 만들면 일련의 트랙이 생성됩니다.

또는 AVAssetReader을 사용하여 프레임 단위로 비디오를 읽고, 프레젠테이션 시간을 가져 와서 몇 초가 몇 초인지, 몇 초 동안 또는 전체 비디오가 평균인지 계산하십시오.

+0

'nominalFrameRate'가 가장 쉬운 방법입니다. AVPlayer를 시작으로, 'currentItem'을, 그 다음에 아이템의'tracks'을, 모든 트랙의'assetTrack'을 가져올 수 있고, 각각의 자산 트랙의'nominalFrameRate'를 얻을 수 있습니다. 동영상에는 여러 개의 비디오 트랙이 있고 일부에는 (오디오 전용) 비디오 트랙이 전혀 없습니다. –

8

사용 AVAssetTrack'snominalFrameRateproperty. 방법은 아래

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; 
} 
+1

우수 답변, 크게 도움이되었습니다. – AddisDev

+0

이것은 iOS 7에서 더 이상 작동하지 않는 것 같습니다. nominalFrameRate는 이전 동영상 버전에서 올바른 값을 반환하는 동일한 동영상에 대해 0을 반환합니다. 이 문제를 겪고있는 사람이 있습니까? 나는 버그 보고서를 애플에 넣었다. – AddisDev

+1

iOS 7.0에서 나를 위해 작동 – lehn0058

2

이 nominalFrameRate이 같은 미디어에 대해 반환 아이폰 OS의 다른 버전에서 연주에 차이가있는 것으로 보인다입니다. 나는 25 프레임마다 키 프레임이있는 초당 1 프레임 (125 프레임)의 ffmpeg로 인코딩 된 비디오를 가지고 있으며 iOS 7.x의 앱에서로드 할 때 명목상의 프레임 속도는 1.0이고 iOS 8.x에서는 (공칭) 프레임 속도는 0.99입니다. 이것은 매우 작은 차이 인 것 같습니다. 그러나 제 경우에는 영화의 주어진 프레임으로 정확하게 이동해야하며이 차이는 그러한 탐색을 망칠 것입니다 (영화는 프레젠테이션 슬라이드 시퀀스의 인코딩입니다). 내 앱이 (예 : 1fps와 같이) 재생해야하는 동영상의 프레임 속도를 이미 알고 있다고 가정하면 프레임 속도를 동적으로 (nominalFrameRate 값을 통해) 결정하는 대신이 값에 의존 할 수 있지만 왜 그런 차이가 있는지 궁금합니다. 이 nominalFrameRate까지 iOS 버전. 어떤 아이디어?

+0

나는 요세미티에서 같은 행동을하고있다. 나는 10 fps와 20 fps로 샘플 비디오를 가지고있다. Mavericks가 올바르게보고합니다. 그러나 요세미티에서는 각각 9.9010과 18.1818로 기록됩니다. –

+0

해결 했습니까? 초당 125 프레임으로 동영상을 인코딩 한 경우 올바른 프레임 속도가 1.0이 아닌 125가 아니어야합니까 (iOS 7)? – Crashalot

+0

@DineshIyer는 프레임 속도를 가장 가까운 정수로 반올림하는 것이 유효하지 않습니까? – Crashalot

1

AVPlayer의 속도 값은 재생되는 실시간과 관련된 속도입니다 (예 : 0.5는 슬로우 모션, 2는 2 배속).

Paresh Navadiya도 트랙에 nominalFrameRate 변수가 있음을 지적했으나 때로는 이상한 결과가 나타나는 것으로 보입니다. (가) 위의 약간주는 가변 프레임 레이트하지만, 가변 프레임 레이트에 대한 예기치 않은 결과가 어쨌든 약간 이상한 행동을 가지고

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

: 내가 지금까지 찾은 가장 좋은 방법은 다음과 같은 사용하는 것입니다. 그것 이외에 그것은 내 테스트에서 ffmpeg -i와 일치합니다.

편집 ---- 내가 위 때때로 발견했습니다 시간 kCMTimeZero가 제공

. 이에 대한 해결 방법은 트랙 출력을 사용하여 AVAssetReader를 만들고 첫 번째 프레임과 두 번째 프레임의 pts를 가져 와서 두 개의 빼기 작업을 수행하는 것입니다.