【发布时间】:2016-05-25 19:02:04
【问题描述】:
我使用 ffmpeg 的 C API 创建了一个 C++ 应用程序,该应用程序从文件中读取帧并将它们写入新文件。一切正常,只要我立即将帧写入输出。换句话说,程序的以下结构输出正确的结果(我现在只放伪代码,如果需要我也可以发布一些真正的 sn-ps,但我为处理 ffmpeg 功能而创建的类非常大) :
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 帧(我认为)的重复。
我的猜测是可能会出错,因为在第一种情况下,我总是使用相同的内存位置来读取帧,而在第二种情况下,我分配了许多不同的帧。
关于可能是什么问题的任何建议?
【问题讨论】: