擅长:python、mysql、java
<p><code>CAP_PROP_FRAME_COUNT</code>的get()永远不应该是准确的!如果你检查了opencv的源代码。你可以找到这个:</p>
<pre><code>int64_t CvCapture_FFMPEG::get_total_frames() const
{
int64_t nbf = ic->streams[video_stream]->nb_frames;
if (nbf == 0)
{
nbf = (int64_t)floor(get_duration_sec() * get_fps() + 0.5);
}
return nbf;
}
</code></pre>
<p>这意味着它将首先查看流头中的<code>nb_frames</code>,您可以使用ffprobe检查它。如果没有这样的字段,那么没有比直接解码视频更好的方法来获得帧号。opencv通过<code>get_duration_sec() * get_fps() + 0.5</code>做了一个粗略的估计,这肯定不意味着准确性。</p>
<p>因此,要获得正确的帧号,您必须解码并读取整个流,或者您必须要求视频生成器使用<code>nb_frames</code>字段生成正确的流头。</p>