Как искать определенный кадр в видео h.264? - PullRequest
0 голосов
/ 27 августа 2018

Мне нужно декодировать видео из определенного кадра с помощью 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-кадром имеют одинаковый случай.Я использовал неправильный метод?Или есть ли какой-то другой способ поиска к конкретному кадру видео?Большое спасибо.

...