根据条件,我有大约 1600 多个 gif 文件可以运行。我正在使用 QMovie 播放 gif 文件。在少数情况下我得到低于错误(随机,不是每次)
#0 0x00007fb88d74c621 in _int_malloc () at /lib64/libc.so.6
#1 0x00007fb88d74e690 in malloc () at /lib64/libc.so.6
#2 0x00007fb88e53a630 in QByteArray::realloc(int) () at /usr/lib64/libQtCore.so.4
#3 0x00007fb88e53b99d in QByteArray::remove(int, int) () at /usr/lib64/libQtCore.so.4
#4 0x00007fb881527c0c in () at /usr/lib64/qt4/plugins/imageformats/libqgif.so
#5 0x00007fb881527d10 in () at /usr/lib64/qt4/plugins/imageformats/libqgif.so
#6 0x00007fb88ec572b6 in () at /usr/lib64/libQtGui.so.4
#7 0x00007fb88ec5765f in () at /usr/lib64/libQtGui.so.4
#8 0x00007fb88ec578b7 in () at /usr/lib64/libQtGui.so.4
#9 0x00007fb88e64e1fa in QMetaObject::activate(QObject*, QMetaObject const*, int, void**) () at /usr/lib64/libQtCore.so.4
因为我无法重现该错误。所以我写了一个小程序,它将进入每个文件夹并播放 gif 文件。我观察到的是,当我播放所有 1600+ 个文件时,在播放第 1008 个 gif 文件时,它会停止读取文件。我检查了frameCount(),它显示-1。然后我单独播放了第1008个gif文件,它播放没有任何错误。
我正在使用 VMware WorkStation 12 Pro 和 QT 5.4.2 (GCC 4.8.3)。
这是代码,它从文件夹和子文件夹中读取文件并播放 gif 文件。
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
isMovieFinsihed = true;
it = new QDirIterator("/home/trainsim/GIF_DATA", QDir::NoFilter, QDirIterator::Subdirectories);
NextFile();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::movieFinished()
{
if (video->currentFrameNumber() == (video->frameCount() - 1))
{
isMovieFinsihed = true;
video->stop();
//video->deleteLater();
std::cout << "Movie Finished" << std::endl;
NextFile();
}
}
void MainWindow::NextFile()
{
if(it->hasNext() && isMovieFinsihed)
{
isMovieFinsihed = false;
QFileInfo f(it->next());
if (f.isFile())
{
std::cout << "FileName: " << f.filePath().toStdString() << std::endl;
video = new QMovie();
video->setFileName(f.filePath());
video->start();
std::cout<< "Loop count: " << video->loopCount() << std::endl;
ui->label->setMovie(video);
ui->label->show();
QObject::connect(video, SIGNAL(frameChanged(int)), this, SLOT(movieFinished()));
std::cout << "ui->label->movie()->frameCount(): " << ui->label->movie()->frameCount() << std::endl;
}
else if (f.isDir())
{
isMovieFinsihed = true;
NextFile();
}
}
}
有人能告诉我问题出在哪里吗?为什么在第 1008 个 gif 之后,QMovie 无法播放。而且我还尝试在每次播放完成后删除 QMOvie 对象并创建新的 QMovie。我不确定这是否正确。
需要帮忙
- 为什么gif文件停止播放?
- 播放完QMovie对象可以删除吗
附加信息,当我创建一次 QMovie 对象并加载多个 gif 文件时,会发生崩溃。如果我为每个 gif 文件创建对象并在 gif 播放完毕后删除,那么它可以正常工作。