2009-02-02 4 views
15

Sto tentando di cercare in un film utilizzando il metodo av_seek_frame di ffmpeg, tuttavia ho maggiori difficoltà a determinare come generare un timestamp da cercare. Supponendo di voler cercare x quantità di fotogrammi sia in avanti che all'indietro e so quale fotogramma è attualmente acceso sul film, come farei per farlo?ffmpeg av_seek_frame

+0

Non è possibile calcolare l'offset dell'ora utilizzando la frequenza fotogrammi? –

+0

Da quello che ho capito, l'offset di tempo deve essere nelle unità time_base ma non sono esattamente sicuro di come convertirlo in quelle unità (o anche se è quello che devo fare). Se è quello che devo fare, non sono sicuro di quali siano le unità di time_base (secondi, fotogrammi, fotogrammi al secondo). –

risposta

8

Risposta semplice: è necessario disporre di un oggetto AVFormatContext in giro. La sua proprietà duration ti dice per quanto tempo il tuo file è in termini di time-stamp moltiplicato per 1000 che può essere usato in av_seek_frame, quindi trattalo al 100%. Quindi puoi calcolare quanto lontano nel video si desidera cercare.

se si desidera andare avanti di un frame, è sufficiente chiamare av_read_frame e avcodec_decode_video fino a riempire il got_picture_ptr con un valore diverso da zero. Prima di chiamare avcodec_decode_video assicurati che il pacchetto da av_read_frame provenga dal flusso video. avcodec_decode_video riempirà quindi la struttura AVFrame che puoi usare per fare qualsiasi cosa.

13

Ecco come ho fatto:

// Duration of one frame in AV_TIME_BASE units 
int64_t timeBase; 

void open(const char* fpath){ 
    ... 
    timeBase = (int64_t(pCodecCtx->time_base.num) * AV_TIME_BASE)/int64_t(pCodecCtx->time_base.den); 
    ... 
} 

bool seek(int frameIndex){ 

    if(!pFormatCtx) 
     return false; 

    int64_t seekTarget = int64_t(frameIndex) * timeBase; 

    if(av_seek_frame(pFormatCtx, -1, seekTarget, AVSEEK_FLAG_ANY) < 0) 
     mexErrMsgTxt("av_seek_frame failed."); 

} 

L'AVSEEK_FLAG_ANY permette che cercano di ogni fotogramma e non solo i fotogrammi chiave.

+0

+1 per indicare cosa 'AVSEEK_FLAG_ANY' fa – puk