Sto provando a utilizzare ffmpeg per acquisire fotogrammi da un file video, ma non riesco nemmeno a ottenere la durata di un video. ogni volta che provo ad accedervi con pFormatCtx->duration
sto diventando 0. So che il puntatore è inizializzato e contiene la durata corretta perché se uso av_dump_format(pFormatCtx, 0, videoName, 0);
allora effettivamente ottengo i dati di durata insieme ad altre informazioni sul video. Questo è ciò che ottengo quando uso av_dump_format(pFormatCtx, 0, videoName, 0);
:FFMPEG non può visualizzare la durata di un video
Input # 0, avi, da 'futurama.avi':
Durata: 00: 21: 36.28, avviare: 0.000000, bitrate: 1.135 kb/s
flusso # 0.0: video: MPEG4 (Advanced Simple Profile), YUV420P, 512x384
[PAR 1: 1 DAR 4: 3], 25 TBR, 25 tbn, 25 tbc
flusso # 0.1: Audio: ac3, 48000 Hz, stereo, s16, 192 kb/s
non capisco il motivo per cui av_dum_format
in grado di visualizzare la durata e non posso. Ho controllato la definizione della funzione, per visualizzare la durata, la funzione utilizza anche pFormatCtx-> duration. E 'non solo le altre variabili membro di durata anche non visualizzano i dati appropriati quando li chiamo in main.cpp
Ecco il mio main.cpp:
extern "C" {
#include<libavcodec/avcodec.h>
#include<libavformat/avformat.h>
#include<libswscale/swscale.h>
}
int main(int argc, char *argv[]) {
AVFormatContext *pFormatCtx = NULL;
const char videoName[] = "futurama.avi";
// Register all formats and codecs.
av_register_all();
cout << "Opening the video file";
// Open video file
int ret = avformat_open_input(&pFormatCtx, videoName, NULL, NULL) != 0;
if (ret != 0) {
cout << "Couldn't open the video file." << ret ;
return -1;
}
if(avformat_find_stream_info(pFormatCtx, 0) < 0) {
cout << "problem with stream info";
return -1;
}
av_dump_format(pFormatCtx, 0, videoName, 0);
cout << pFormatCtx->bit_rate << endl; // different value each time, not initialized properly.
cout << pFormatCtx->duration << endl; // 0
return 0;
}
Non so se aiuta, ma , Uso QtCreator su Ubuntu e linko le librerie staticamente.
Grazie per il vostro aiuto.
C'è qualcosa che 'av_dump_format' fa prima di leggere' pFormatCtv-> durata' che rende il campo valido. In altre parole, c'è un codice aggiuntivo che deve essere eseguito prima che la durata diventi valida. Traccia attraverso un codice che funziona e dovresti trovare il pezzo mancante. A proposito, sei ancora interessato a una risposta per questo? –
Stavo cercando di utilizzare le funzionalità di ffmpeg sul mio progetto personale, ma alla fine ho utilizzato nuovi processi con ffmpeg.exe. Vorrei trovare una risposta, ffmpeg è uno strumento molto potente, sono sicuro che lo userò in futuro, e sarebbe molto più efficiente se sapessi usare la libreria piuttosto che usare l'eseguibile in nuovi processi. – Malkavian
Probabilmente non sarò in grado di provare il tuo metodo in qualsiasi momento presto, sono abbastanza occupato in questi giorni, ti sto dando il voto, ti farò sapere se funziona. Grazie ancora! – Malkavian