#include <wx/filename.h>
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
}
#include "include/aegisub/aegisub.h"
class LAVCFile {
private:
unsigned refs;
LAVCFile(Aegisub::String filename);
~LAVCFile();
class Initializer {
public:
Initializer();
};
static Initializer init;
public:
AVFormatContext *fctx;
static LAVCFile *Create(Aegisub::String filename) { return new LAVCFile(filename); }
LAVCFile *AddRef() { refs++; return this; };
void Release() { if (!--refs) delete this; };
};
#include <wx/wxprec.h>
#include "lavc_file.h"
#include <vector>
struct LAVCFrameInfo {
int64_t DTS;
bool isKeyFrame;
LAVCFrameInfo(int64_t ADTS, bool isAKeyFrame) : DTS(ADTS), isKeyFrame(isAKeyFrame) {};
};
typedef std::vector<LAVCFrameInfo> LAVCFrameInfoVector;
class LAVCKeyFrames {
private:
LAVCFile* file; // Video file
AVStream* stream; // Used stream
int streamN; // Stream index
int numFrames; // number of frames in the video
protected:
LAVCFrameInfoVector framesData;
public:
LAVCKeyFrames(const Aegisub::String filename);
~LAVCKeyFrames();
wxArrayInt GetKeyFrames();
int GetNumFrames();
LAVCFrameInfoVector GetFrameData();
};
LAVCKeyFrames::LAVCKeyFrames(const Aegisub::String filename)
: file(0), stream(0), streamN(-1), numFrames(0) {
// Open LAVCFile
file = LAVCFile::Create(filename);
// Find video stream
for (unsigned int i = 0; i < file->fctx->nb_streams; ++i) {
if (file->fctx->streams[i]->codec->codec_type == CODEC_TYPE_VIDEO) {
stream = file->fctx->streams[i];
streamN = i;
break;
}
}
if (streamN == -1) throw _T("ffmpeg keyframes reader: Could not find a video stream");
}
Это нужные куски из исходников aegisub.
Мне нужно получить номера ключевых кадров.
Суть в том что я не понимаю как они к файлу прикрутили, то есть
file->fctx->streams[i]->codec->codec_type
Сначала это была строчка с именем файла, а затем уже у него появились и
AVFormatContext *fctx.
Не пойму как это можно переписать на QT, с wxWidgets не сталкивался.