Im은 AVPlayer를 통해 비디오 프레임 속도를 검색하는 방법을 알아 내려고합니다. AVPlayerItem에는 속도 변수가 있지만 0과 2 사이의 값만 반환합니다 (일반적으로 재생할 때 1). 비디오 프레임 속도를 얻는 방법에 대해 누구나 알고 있습니까?IOS AVPlayer get fps
건배
Im은 AVPlayer를 통해 비디오 프레임 속도를 검색하는 방법을 알아 내려고합니다. AVPlayerItem에는 속도 변수가 있지만 0과 2 사이의 값만 반환합니다 (일반적으로 재생할 때 1). 비디오 프레임 속도를 얻는 방법에 대해 누구나 알고 있습니까?IOS AVPlayer get fps
건배
난 당신이 프레임 속도를 계산하는 데 도움이 될 수 있습니다 AVPlayer
에 아무것도 몰라.
AVPlayerItem
rate
속성은 재생 속도이며 프레임 속도와 관련이 없습니다.
더 쉬운 옵션은 AVAssetTrack
을 얻고 nominalFrameRate
속성을 읽는 것입니다. AVAsset
을 만들면 일련의 트랙이 생성됩니다.
또는 AVAssetReader
을 사용하여 프레임 단위로 비디오를 읽고, 프레젠테이션 시간을 가져 와서 몇 초가 몇 초인지, 몇 초 동안 또는 전체 비디오가 평균인지 계산하십시오.
사용 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;
}
이 nominalFrameRate이 같은 미디어에 대해 반환 아이폰 OS의 다른 버전에서 연주에 차이가있는 것으로 보인다입니다. 나는 25 프레임마다 키 프레임이있는 초당 1 프레임 (125 프레임)의 ffmpeg로 인코딩 된 비디오를 가지고 있으며 iOS 7.x의 앱에서로드 할 때 명목상의 프레임 속도는 1.0이고 iOS 8.x에서는 (공칭) 프레임 속도는 0.99입니다. 이것은 매우 작은 차이 인 것 같습니다. 그러나 제 경우에는 영화의 주어진 프레임으로 정확하게 이동해야하며이 차이는 그러한 탐색을 망칠 것입니다 (영화는 프레젠테이션 슬라이드 시퀀스의 인코딩입니다). 내 앱이 (예 : 1fps와 같이) 재생해야하는 동영상의 프레임 속도를 이미 알고 있다고 가정하면 프레임 속도를 동적으로 (nominalFrameRate 값을 통해) 결정하는 대신이 값에 의존 할 수 있지만 왜 그런 차이가 있는지 궁금합니다. 이 nominalFrameRate까지 iOS 버전. 어떤 아이디어?
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를 가져 와서 두 개의 빼기 작업을 수행하는 것입니다.
'nominalFrameRate'가 가장 쉬운 방법입니다. AVPlayer를 시작으로, 'currentItem'을, 그 다음에 아이템의'tracks'을, 모든 트랙의'assetTrack'을 가져올 수 있고, 각각의 자산 트랙의'nominalFrameRate'를 얻을 수 있습니다. 동영상에는 여러 개의 비디오 트랙이 있고 일부에는 (오디오 전용) 비디오 트랙이 전혀 없습니다. –