Не удается загрузить GIF-файлы с помощью QMovie - PullRequest
0 голосов
/ 01 июля 2019

У меня есть около 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.Я не уверен, что это правильный путь.

Нужна помощь

  1. Почему перестает воспроизводиться gif-файл?
  2. Можно ли удалить объект QMovie после завершения воспроизведения?

Дополнительная информация. Когда я создаю объект QMovie один раз и загружаю несколько файлов GIF, происходит сбой.Если я создаю объект для каждого файла GIF и удаляю его после завершения воспроизведения, он работает нормально.

...