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.

È stato utile?

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!")

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top