FFmpeg在持续时间等于“时获取视频长度”;AV“无价值”;

FFmpeg在持续时间等于“时获取视频长度”;AV“无价值”;,ffmpeg,Ffmpeg,我有几个视频,其中AVStream中的持续时间值设置为AV_NOPTS_值。但是像VLC这样的玩家可以得到视频的长度。甚至Ubuntu中的文件属性也可以读取它 因此,当发生这种情况时,我应该如何获得文件长度?无论是帧数还是秒数,都无关紧要 谢谢 p.S.:仅使用API,对在命令行中调用FFmpeg不感兴趣。因此我继续研究并找到了解决方案: // Seek last key-frame. avcodec_flush_buffers(stream._codecContext);

我有几个视频,其中AVStream中的持续时间值设置为AV_NOPTS_值。但是像VLC这样的玩家可以得到视频的长度。甚至Ubuntu中的文件属性也可以读取它

因此,当发生这种情况时,我应该如何获得文件长度?无论是帧数还是秒数,都无关紧要

谢谢


p.S.:仅使用API,对在命令行中调用FFmpeg不感兴趣。

因此我继续研究并找到了解决方案:

    // Seek last key-frame.
    avcodec_flush_buffers(stream._codecContext);
    av_seek_frame(_context, stream._idx, stream.frameToPts(1<<29), AVSEEK_FLAG_BACKWARD);

    // Read up to last frame, extending max PTS for every valid PTS value found for the video stream.
    av_init_packet(&_avPacket);

    while (av_read_frame(_context, &_avPacket) >= 0) {
      if (_avPacket.stream_index == stream._idx && _avPacket.pts != int64_t(AV_NOPTS_VALUE) && _avPacket.pts > maxPts)
        maxPts = _avPacket.pts;
      av_free_packet(&_avPacket);
    }
//查找最后一个关键帧。
avcodec_刷新_缓冲区(流._编解码器上下文);
av\U seek\U帧(\U上下文,流.idx,流.frameToPts(1个最大值)
maxPts=_avPacket.pts;
av_免费_数据包(&_av数据包);
}
我对它做了一些修改,以适应我的需要,但这大致就是我使用的

Ref:,查找函数getStreamFrames