Что делать при открытии видео и декодировании c AVFrame.pkt_dts не запускается с самого начала - PullRequest
0 голосов
/ 06 мая 2020

У меня есть несколько видеофайлов (.mpg), которые вырезаны из большого видеофайла и, вероятно, неправильно закодированы. Таким образом, при декодировании полученный AVFrame.pkt_dts устанавливается в файл примерно на полсекунды.

И поскольку я вычисляю текущий кадр на основе pkt_dts, мой текущий кадр начинается с 13. Я могу определить это и вычислить смещение кадра с помощью

frame_offset = (pFrame->pkt_dts/pFrame->pkt_duration)

Однако это не является большой проблемой, но при реализации поиска с помощью

// seek to frame 500 and seek back to first key frame
seekTarget = 500;  
av_seek_frame(videoState_->ptrFormatCtx_, -1, seekTarget, AVSEEK_FLAG_FRAME  | AVSEEK_FLAG_BACKWARD);

я обычно получаю первый ключевой кадр, а затем просто декодирую следующий кадр до указанного мной кадра. Но с этими файлами av_seek_frame () всегда будет помещать меня точно в кадр, который я ищу, но в нем отсутствуют данные, потому что родительский кадр I не декодируется. Я предполагаю, что это происходит из-за неправильного pkt_dts с самого начала.

Я могу исправить это, снова используя frame_offset, но действительно ли это правильный подход к этой проблеме? Это кажется немного взломанным.

...