AV_Seek_frame Breaks Avcodec_Decode_Video2 Quando Codec utilizza P-Frames
-
09-09-2020 - |
Domanda
Sto cercando di capire come cercare video codificati con i frame p (ad es. H.264) - in questo momento so solo come cercare video codificati con codec in cui ogni fotogramma è un fotogramma chiave (ad es. MJPEG ).
Dato un timestamp, alla fine dovrebbe giocare il telaio per quel timestamp. Ma per ora, sto solo cercando di giocare il fotogramma chiave vicino al timestamp. Quindi, prima--
ret = av_seek_frame(pFormatCtx, videoStream, avTime, 0);
avcodec_flush_buffers(pCodecCtx);
.
Allora qualche codice intermedio, incluso av_read_frame
. Quindi--
ret = avcodec_decode_video2(pCodecCtx, captureFrame, &gotPicture, &packet);
.
Osservazioni:
- .
-
Per alcuni video, questo funziona. Per gli altri,
avcodec_decode_video2
restituisce un errore (numero negativo). Esempio di un video di lavoro: qui . Esempio di un video non funzionante: qui . -
per i video MJPEG, funziona.
-
Se tiro fuori il
av_seek_frame
, in modo che gioca solo attraverso i fotogrammi in sequenza, funziona.
Soluzione
Sostituisci questo--
ret = av_seek_frame(pFormatCtx, videoStream, avTime, isPlayingBackward ? AVSEEK_FLAG_BACKWARD : 0);
avcodec_flush_buffers(pCodecCtx);
.
con questo--
ret = avformat_seek_file(pFormatCtx, videoStream, 0, avTime, avTime, 0);
.
(caveat: i documenti per avformat_seek_file
dicono: "Questo fa parte del nuovo API di Seek Seek che è ancora in costruzione. Quindi non usarlo ancora. Può cambiare in qualsiasi momento, non aspettarti ancora compatibilità ABI!")