av_seek_frame quebra avcodec_decode_video2 quando o codec usa p-frames
-
09-09-2020 - |
Pergunta
Estou tentando entender como buscar vídeos codificados com p-frames (por exemplo,H.264)-- no momento só sei procurar em vídeos codificados com codecs em que cada quadro é um quadro-chave (por exemplo,MJPEG).
Dado um carimbo de data/hora, em última análise, ele deverá reproduzir o quadro desse carimbo de data/hora. Mas, por enquanto, estou apenas tentando reproduzir o quadro-chave próximo ao carimbo de data/hora. Então, primeiro--
ret = av_seek_frame(pFormatCtx, videoStream, avTime, 0);
avcodec_flush_buffers(pCodecCtx);
Então algum código intermediário, incluindo av_read_frame
.Então--
ret = avcodec_decode_video2(pCodecCtx, captureFrame, &gotPicture, &packet);
Observações:
Para alguns vídeos, isso funciona.Para os outros,
avcodec_decode_video2
retorna um erro (número negativo).Exemplo de um vídeo de trabalho: aqui.Exemplo de um vídeo que não funciona: aqui.Para vídeos MJPEG, isso funciona.
Se eu tirar o
av_seek_frame
, para que ele reproduza os quadros em sequência, funciona.
Solução
Substitua isso--
ret = av_seek_frame(pFormatCtx, videoStream, avTime, isPlayingBackward ? AVSEEK_FLAG_BACKWARD : 0);
avcodec_flush_buffers(pCodecCtx);
com isso--
ret = avformat_seek_file(pFormatCtx, videoStream, 0, avTime, avTime, 0);
(Embargo:Os documentos para avformat_seek_file
dizer:“Isso faz parte da nova API de busca que ainda está em construção.Portanto, não use isso ainda.Pode mudar a qualquer momento, não espere compatibilidade com ABI ainda!")