我需要通过FFmpeg从特定帧解码视频,我知道h.264视频具有I帧/ P帧/ B帧,当我使用av_seek_frame()
搜索特定帧时,只能帮助我找到最近的I帧,因此我尝试使用AVPacket.dts
和while
循环导航到特定帧的位置,然后开始对视频帧进行解复用
auto DurationTime = static_cast<uint64_t>(m_pAVFormatContext->streams[m_VideoStreamIndex]->duration);
auto FrameNum = m_pAVFormatContext->streams[m_VideoStreamIndex]->nb_frames;
av_seek_frame(m_pAVFormatContext, m_VideoStreamIndex, DurationTime / FrameNum * (vSpecificFrame), AVSEEK_FLAG_FRAME | AVSEEK_FLAG_BACKWARD);
int TempValue = 0;
while ((TempValue = av_read_frame(m_pAVFormatContext, &m_AVPacket)) >= 0 && m_AVPacket.stream_index != m_VideoStreamIndex)
{
av_packet_unref(&m_AVPacket);
}
while(m_AVPacket.dts / (DurationTime / FrameNum) < vSpecificFrame)
{
if(m_AVPacket.data)
av_packet_unref(&m_AVPacket);
while ((TempValue = av_read_frame(m_pAVFormatContext, &m_AVPacket)) >= 0 && m_AVPacket.stream_index != m_VideoStreamIndex)
{
av_packet_unref(&m_AVPacket);
}
}
if(m_AVPacket.data)
av_packet_unref(&m_AVPacket);
但是问题是,当我对下一帧进行多路分解时,我可以获得pos
,data
,size
和所有其他信息,但是图像无法显示。在解复用下一个I帧之前,此特定帧与下一个I帧之间的所有帧都具有相同的大小写。
我使用了错误的方法吗?或者是否还有其他方法可以搜索视频的特定帧?非常感谢。