我正在使用Qt5.0.1与Visual Studio 2010集成,
我使用ffmpeg从视频文件渲染视频帧,Qt作为QImage,实际上我需要使用QThread在运行时显示渲染的视频帧。
我是Qt的新手,请提供一些信息。
任何片段都会有所帮助。
答案 0 :(得分:1)
我不熟悉VC ++与qt ..但是 使用mandle brot示例
和命运线程示例enter link description here
使用信号发出视频帧阵列或QImage。
此代码段
#include <QImage>
#include <QMutex>
#include <QQueue>
#include <QThread>
#include <QWaitCondition>
class Transaction
{
public:
virtual ~Transaction() { }
virtual QImage apply(const QImage &image) = 0;
virtual QString message() = 0;
};
class FlipTransaction : public Transaction
{
public:
FlipTransaction(Qt::Orientation orientation);
QImage apply(const QImage &image);
QString message();
private:
Qt::Orientation orientation;
};
class ResizeTransaction : public Transaction
{
public:
ResizeTransaction(const QSize &size);
QImage apply(const QImage &image);
QString message();
private:
QSize size;
};
class ConvertDepthTransaction : public Transaction
{
public:
ConvertDepthTransaction(int depth);
QImage apply(const QImage &image);
QString message();
private:
int depth;
};
class TransactionThread : public QThread
{
Q_OBJECT
public:
TransactionThread();
~TransactionThread();
void addTransaction(Transaction *transact);
void setImage(const QImage &image);
QImage image();
signals:
void transactionStarted(const QString &message);
void allTransactionsDone();
protected:
void run();
private:
QImage currentImage;
QQueue<Transaction *> transactions;
QWaitCondition transactionAdded;
QMutex mutex;
};
和
#include <QtGui>
#include "transactionthread.h"
Transaction * const EndTransaction = 0;
FlipTransaction::FlipTransaction(Qt::Orientation orientation)
{
this->orientation = orientation;
}
QImage FlipTransaction::apply(const QImage &image)
{
return image.mirrored(orientation == Qt::Horizontal,
orientation == Qt::Vertical);
}
QString FlipTransaction::message()
{
if (orientation == Qt::Horizontal) {
return QObject::tr("Flipping image horizontally...");
} else {
return QObject::tr("Flipping image vertically...");
}
}
ResizeTransaction::ResizeTransaction(const QSize &size)
{
this->size = size;
}
QString ResizeTransaction::message()
{
return QObject::tr("Resizing image...");
}
QImage ResizeTransaction::apply(const QImage &image)
{
return image.scaled(size, Qt::IgnoreAspectRatio,
Qt::SmoothTransformation);
}
ConvertDepthTransaction::ConvertDepthTransaction(int depth)
{
this->depth = depth;
}
QImage ConvertDepthTransaction::apply(const QImage &image)
{
QImage::Format format;
switch (depth) {
case 1:
format = QImage::Format_Mono;
break;
case 8:
format = QImage::Format_Indexed8;
break;
case 24:
default:
format = QImage::Format_RGB32;
}
return image.convertToFormat(format);
}
QString ConvertDepthTransaction::message()
{
return QObject::tr("Converting image depth...");
}
TransactionThread::TransactionThread()
{
start();
}
TransactionThread::~TransactionThread()
{
{
QMutexLocker locker(&mutex);
while (!transactions.isEmpty())
delete transactions.dequeue();
transactions.enqueue(EndTransaction);
transactionAdded.wakeOne();
}
wait();
}
void TransactionThread::addTransaction(Transaction *transact)
{
QMutexLocker locker(&mutex);
transactions.enqueue(transact);
transactionAdded.wakeOne();
}
void TransactionThread::run()
{
Transaction *transact = 0;
QImage oldImage;
forever {
{
QMutexLocker locker(&mutex);
if (transactions.isEmpty())
transactionAdded.wait(&mutex);
transact = transactions.dequeue();
if (transact == EndTransaction)
break;
oldImage = currentImage;
}
emit transactionStarted(transact->message());
QImage newImage = transact->apply(oldImage);
delete transact;
{
QMutexLocker locker(&mutex);
currentImage = newImage;
if (transactions.isEmpty())
emit allTransactionsDone();
}
}
}
void TransactionThread::setImage(const QImage &image)
{
QMutexLocker locker(&mutex);
currentImage = image;
}
QImage TransactionThread::image()
{
QMutexLocker locker(&mutex);
return currentImage;
}