2012-01-26 18 views
6

Sto usando ffmpeg per decodificare un file video in C. Sto facendo fatica a ottenere il conteggio del fotogramma corrente che sto decodificando o il timestamp del fotogramma. Ho letto numerosi post che mostrano come calcolare un frame stimato no basato sul timestamp di fps e frame, tuttavia non sono in grado di ottenere uno di questi.ffmpeg c/C++ ottenere conteggio fotogrammi o data/ora e fps

Che cosa ho bisogno: fps di file video, timestamp dei frame corrente o telaio no (non calcolato)

Quello che ho: sono in grado di ottenere il tempo del video utilizzando

pFormatCtx->duration/AV_TIME_BASE 

Sto contando i fotogrammi al momento mentre li elabro e ottenendo un numero di fotogrammi corrente, tuttavia non funzionerà a lungo termine. Posso ottenere il numero totale di cornice per il file utilizzando

pFormatCtx->streams[currentStream->videoStream]->nb_frames 

Ho letto questo potrebbe non funzionare per tutti i corsi d'acqua, anche se ha funzionato per ogni flusso che ho provato.

Ho provato a utilizzare i valori time_base.num e time_base.den e packet.pts, ma non riesco a dare alcun senso ai valori che ottengo da quelli, quindi potrei semplicemente capire meglio cosa questi i valori sono

Qualcuno sa di risorse che mostrano esempi su come ottenere questi valori?

risposta

4

questo url discute perché i valori p.ti potrebbero non avere senso e come ottenere quelli sensibili: An ffmpeg and SDL Tutorial by Dranger

Qui è un esperto di quel link, che fornisce indicazioni su esattamente quello che stai cercando in termini di telaio numeri e timestamp. Se questo sembra utile a voi, allora si consiglia di leggere di più del documento per una più piena comprensione:

Quindi cerchiamo di dire che abbiamo avuto un film, e le cornici sono state esposte come: IBB P. Ora, abbiamo bisogno per conoscere le informazioni in P prima di poter visualizzare in una cornice B. Per questo motivo, i frame potrebbero essere archiviati in questo modo: I P B B. Ecco perché abbiamo un timestamp di decodifica e una timestamp di presentazione su ciascun frame. Il timestamp di decodifica ci dice quando abbiamo bisogno di per decodificare qualcosa, e il timestamp della presentazione ci dice quando abbiamo bisogno di visualizzare qualcosa. Quindi, in questo caso, il nostro flusso potrebbe essere come questo:

PTS: 1 4 2 3 
DTS: 1 2 3 4 
Stream: I P B B 

Generalmente il PTS e DTS differiranno solo quando il flusso siamo gioco con frame B in esso.

Quando riceviamo un pacchetto da av_read_frame(), conterrà i valori PTS e DTS per le informazioni all'interno del pacchetto . Ma quello che vogliamo veramente è il PTS del nostro frame raw , appena decodificato, quindi sappiamo quando visualizzarlo.

Fortunatamente, FFMpeg ci fornisce un timestamp "best effort", che è possibile ottenere via, av_frame_get_best_effort_timestamp()

+0

Questa risposta è stato contrassegnato per la rimozione perché è una risposta link-solo.Potresti per favore espandere questa risposta in modo da fornire una risposta alla domanda senza richiedere al lettore di fare clic sulla pagina Web collegata? – josliber

+0

Cercherò di soddisfare questo requisito per fornire più di un link, ma devo sottolineare due cose: in primo luogo, la domanda ha chiesto "risorse che mostrano esempi su come ottenere questi valori", quindi sembra chiedere alink piuttosto che qualcosa di più lungo; (2) tre anni fa, la risposta era apparentemente ciò che l'interrogante aveva bisogno da quando è stata scelta come risposta (era l'UNICA risposta, quindi presumibilmente ha aiutato l'interrogante originale e probabilmente altri visitatori per tre anni. – Beel

+0

@Beel o non aiuta da molto tempo, la politica di risposta di Stack Overflow (https://stackoverflow.com/help/how-to-answer) dice che le risposte che forniscono solo un link non sono risposte complete; la formattazione e lasciato solo il testo, dovrebbero comunque rispondere alla domanda. –

Problemi correlati