直觉上我会假设使用函数readFrame(videoObj)
来读取每个帧会改变属性videoObj.CurrentTime
,如下所示:
videoObj.CurrentTime = videoObj.CurrentTime + videoObj.FrameRate * videoObj.Duration
即。每当从videoObj
提取每个帧时,videoObj.CurrentTime
被设置为视频文件中下一帧所在的时间值。
但是,通过观察属性videoObj.CurrentTime
在整个视频文件读取过程中的变化情况,我发现上面的几乎正确。 (见本问题的底部)
那么,有没有人知道为什么连续帧之间的时差是波动的?
以下是用于绘制读取期间连续帧之间时差的代码。
video = VideoReader('filename');
time = zeros(video.FrameRate * video.Duration,2);
time(1,1) = video.CurrentTime;
i = 2;
while hasFrame(video)
frame = readFrame(video);
time(i,1) = video.CurrentTime;
time(i,2) = time(i,1)-time(i-1,1);
i = i + 1;
end
figure;plot(time(:,1),time(:,2),'*')
xlabel('elapsed time in the video')
ylabel('time difference between frames')
以下是变量time
,http://oi62.tinypic.com/2ykf7zm.jpg的图表。 (所以不允许我在这里上传这个数字,因为我没有足够的声望点)。
如果您在点击链接时感到不舒服,请参阅变量time
的一些相关摘要。左列是视频中的已用时间,即阅读期间的videoObj.CurrentTime
,右列是每次阅读中videoObj.CurrentTime
的增加。
0 0
0.0660 0.0660
0.1330 0.0670
0.2000 0.0670
0.2660 0.0660
0.3330 0.0670
0.4000 0.0670
0.4660 0.0660
0.5330 0.0670
0.6000 0.0670
...
1.4660 0.0660
1.5330 0.0670
1.6000 0.0670
1.7330 0.1330
1.8000 0.0670
1.8660 0.0660
1.9330 0.0670
2 0.0670
正如您所看到的,每次读数之间的时差在0.0660和0.0670之间波动。这可能可以通过近似浮点数的精度来解释(但是不管怎样,10 ^ -3的精度都非常糟糕?)。但是,在某些点上,差异是应有的两倍,值为0.1330。即似乎readFrame(videoObj)
跳过了一个框架。我怎样才能确保这不会发生?
答案 0 :(得分:0)
等式
videoObj.CurrentTime = videoObj.CurrentTime + videoObj.FrameRate * videoObj.Duration
仅当视频流具有固定帧速率时,才有效。有许多视频文件,其中视频的帧速率在视频流中变化。这样做的原因之一是改进压缩(对于缓慢变化的场景,您可以降低帧速率)。在这种情况下报告的FrameRate是平均帧速率。
您正在使用的文件可能是可变帧率文件。
希望这有帮助。
的Dinesh