Некорректный pts при декодировании видеопотока

Пробовал запускать разные видосы для тестирования вывода. И вот наткнулся на такой avi-контейнер, который выдаёт невалидный pts. Он, через кадр, равен либо номеру кадра, либо просто мусорному числу.

При этом avformat_find_stream_info и последующий av_dump_format находит и выводит средний FPS. Понятно, что он, видимо, ориентируется просто по общей продолжительности потока и примерному количеству кадров. Но, скажем, тот же VLC Player видос то проигрывает на нормальой скорости.

Вопрос: Это нормальная ситуация? Я должен ориентироваться на средний FPS, если кадры имеют некорректный pts? И как тогда лучше определить, что у потока невалидные pts?

Вот логи:

Frame: B (144), pts 144, dts 144, keyframe 0, coded 144, display 0
PixFmt: from yuv420p to rgb24       FPS: cur 59.94, avg 64.81
Packet: buf 0x56425ca77200, pts 144, dts 144, data 0x56425cab9a80, size 7485, dur 1, pos 1112544
Original video frame
    uint8_t* data[]:    0x56425c70c740, 0x56425c7547c0, 0x56425c766840, (nil), (nil), (nil), (nil), (nil)
    int linesize[]:     768, 384, 384, 0, 0, 0, 0, 0
Converted video frame
    uint8_t* data[]:    0x7fe1ed9dd040, (nil), (nil), (nil), (nil), (nil), (nil), (nil)
    int linesize[]:     2112, 0, 0, 0, 0, 0, 0, 0

Frame: P (145), pts -9223372036854775808, dts 145, keyframe 0, coded 143, display 0
PixFmt: from yuv420p to rgb24       FPS: cur 59.94, avg 64.81
Packet: buf 0x56425caa61c0, pts -9223372036854775808, dts 145, data 0x56425cabc4c0, size 43497, dur 1, pos 1122382
Original video frame
    uint8_t* data[]:    0x56425c63fa40, 0x56425c687ac0, 0x56425c699b40, (nil), (nil), (nil), (nil), (nil)
    int linesize[]:     768, 384, 384, 0, 0, 0, 0, 0
Converted video frame
    uint8_t* data[]:    0x7fe1ed9dd040, (nil), (nil), (nil), (nil), (nil), (nil), (nil)
    int linesize[]:     2112, 0, 0, 0, 0, 0, 0, 0

PS: В логах FPS выдаёт просто на максимальной скорости, с которой его декодирует и выводит через SDL.

PPS: И ещё вопрос. А бывают видосы со значительно неравномерным выводом кадров. Скажем, если на одном интервале будет 25 FPS, а на другом 50 FPS.


Ответы (0 шт):