Я создал с помощью C API ffmpeg приложение C++, которое считывает фреймы из файла и записывает их в новый файл. Все работает нормально, пока я сразу пишу кадры на выходе. Другими словами, следующая структура программы выводит правильный результат (на данный момент я помещаю только псевдокод, при необходимости я также могу опубликовать некоторые реальные фрагменты, но классы, которые я создал для обработки функциональных возможностей ffmpeg, довольно велики):ffmpeg C API - создание очереди кадров
AVFrame* frame = av_frame_alloc();
int got_frame;
// readFrame returns 0 if file is ended, got frame = 1 if
// a complete frame has been extracted
while(readFrame(inputfile,frame, &got_frame)) {
if (got_frame) {
// I actually do some processing here
writeFrame(outputfile,frame);
}
}
av_frame_free(&frame);
Следующий шаг заключается в параллелизации приложения, и, как следствие, кадры не записываются сразу после их чтения (я не хочу вдаваться в подробности распараллеливания). В этом случае возникают проблемы: на выходе происходит некоторое мерцание, как если бы некоторые кадры повторялись случайным образом. Однако количество кадров и продолжительность выходного видео остаются правильными.
Теперь я пытаюсь полностью отделить чтение от записи в последовательной реализации, чтобы понять, что происходит. Я создаю очереди указателей кадров:
std::queue<AVFrame*> queue;
int ret = 1, got_frame;
while (ret) {
AVFrame* frame = av_frame_alloc();
ret = readFrame(inputfile,frame,&got_frame);
if (got_frame)
queue.push(frame);
}
Для записи кадров в выходной файл я делаю:
while (!queue.empty()) {
frame = queue.front();
queue.pop();
writeFrame(outputFile,frame);
av_frame_free(&frame);
}
В результате в этом случае является видеовыход с правильной продолжительности и числа фреймов, которые являются лишь повторением последних 3 (я думаю) кадров видео.
Я предполагаю, что что-то может пойти не так, потому что в первом случае я всегда использую одно и то же место памяти для чтения кадров, а во втором случае я выделяю много разных кадров.
Любые предложения о том, что может быть проблемой?
СПАСИБО! Это была моя проблема! – lupod