Próbuję użyć narzędzia ffmpeg do przechwytywania klatek z pliku wideo, ale nie mogę uzyskać nawet czasu trwania filmu wideo. za każdym razem, gdy próbuję uzyskać do niego dostęp za pomocą pFormatCtx->duration
uzyskuję 0. Wiem, że wskaźnik został zainicjowany i zawiera poprawny czas trwania, ponieważ jeśli użyję av_dump_format(pFormatCtx, 0, videoName, 0);
, otrzymam dane o czasie trwania wraz z innymi informacjami o filmie. To co mam, kiedy używać av_dump_format(pFormatCtx, 0, videoName, 0);
:FFMPEG Nie można wyświetlić czasu trwania wideo
Wprowadź # 0, AVI, z 'futurama.avi':
Czas trwania: 00: 21: 36.28, start: 0.000000, bitrate: 1135 kb/s
strumień # 0.0: Film: MPEG4 (Advanced prosty profil) yuv420p, 512x384
[para 1: 1 DAR 4: 3] 25 TBR 25 TBN, 25 TBC
Strumień # 0,1: Audio: ac3, 48000 Hz, stereo, s16, 192 kb/s
Nie rozumiem, dlaczego av_dum_format
może wyświetlać czas trwania, a ja nie. Sprawdziłem definicję funkcji, aby wyświetlić czas trwania, funkcja również używa pFormatCtx-> duration. To nie tylko czas trwania inne zmienne składowe również nie wyświetla prawidłowe dane, kiedy nazywają ich w main.cpp
Oto mój 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;
}
Nie wiem, czy to pomaga, ale Używam QtCreatora na Ubuntu i statycznie łączę biblioteki.
Dziękuję za pomoc.
Jest coś, co robi przed 'av_dump_format' odczytuje' pFormatCtv-> duration' sprawia, że pole ważny. Innymi słowy, istnieje dodatkowy kod, który musi zostać wykonany przed upływem czasu trwania. Prześledź trochę kodu, który działa i powinieneś znaleźć brakujący element. BTW, czy nadal jesteś zainteresowany odpowiedzią na to pytanie? –
Próbowałem użyć funkcji ffmpeg w moim osobistym projekcie, ale w końcu użyłem nowych procesów z ffmpeg.exe. Chciałbym znaleźć odpowiedź, ffmpeg to bardzo potężne narzędzie, jestem pewien, że będę go używał w przyszłości, i byłoby znacznie wydajniejsze, gdybym wiedział, jak korzystać z biblioteki, zamiast używać pliku wykonywalnego w nowych procesach. – Malkavian
Prawdopodobnie nie będę mógł wypróbować twojej metody w najbliższym czasie, jestem teraz bardzo zajęty, oddaję ci głos, dam ci znać, jeśli to zadziała. Dzięki jeszcze raz! – Malkavian