Estoy tratando de usar ffmpeg para capturar fotogramas de un archivo de video, pero ni siquiera puedo obtener la duración de un video. cada vez que intento acceder a él con pFormatCtx->duration
obtengo 0. Sé que el puntero se inicializó y contiene la duración correcta porque si uso av_dump_format(pFormatCtx, 0, videoName, 0);
, entonces obtengo los datos de duración junto con otra información sobre el video. Esto es lo que me pasa cuando uso av_dump_format(pFormatCtx, 0, videoName, 0);
:FFMPEG No se puede mostrar la duración de un video
Entrada # 0, avi, de 'futurama.avi':
Duración: 00: 21: 36.28, inicio: 0,000000, tasa de bits: 1135 KB/s
corriente # 0.0: vídeo: MPEG4 (Advanced simple Profile), yuv420p, 512x384
[PAR 1: 1 DAR 4: 3], 25 TBR, 25 TBN, 25 por confirmar
corriente # 0.1: Audio: ac3, 48000 Hz, estéreo, s16, 192 kb/s
No entiendo por qué av_dum_format
puede mostrar la duración y no puedo. Comprobé la definición de la función, para mostrar la duración, la función también usa pFormatCtx-> duration. No es sólo las otras variables miembro de duración también no se muestran los datos adecuados cuando los llamo en main.cpp
Aquí está mi 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;
}
No sé si ayuda, pero , Uso QtCreator en Ubuntu y conecté las bibliotecas estáticamente.
Gracias por su ayuda.
Hay algo que 'av_dump_format' hace antes de que se lee' pFormatCtv-> duration' que hace que el campo válido. En otras palabras, hay un código adicional que se debe ejecutar antes de que la duración sea válida. Rastrea a través de algún código que funcione y deberías encontrar la pieza que falta. Por cierto, ¿sigues interesado en una respuesta para esto? –
Estaba tratando de usar las características de ffmpeg en mi proyecto personal, pero terminé usando nuevos procesos con ffmpeg.exe. Me gustaría encontrar una respuesta, ffmpeg es una herramienta muy poderosa, estoy seguro de que la usaré en el futuro, y sería mucho más eficiente si sé cómo usar la biblioteca en lugar de usar el ejecutable. en nuevos procesos. – Malkavian
Probablemente no pueda probar su método pronto, estoy muy ocupado estos días, le doy la votación, le informaré si funciona. ¡Gracias de nuevo! – Malkavian