我的目标是创建一个使用编码(和可选加密)静止图像的视频播放器。我的主线程创建了以下三个类:
player_class:图像请求每隔40-50ms通过一个信号发出。
extract_frames_class:从包装器中提取编码和加密的内容。
handle_frames_class:该类创建另外30个解码线程并将它们存储在一个数组中。然后,该类接收帧请求并将其传递给extract_frames_class。在获得提取的数据之后,它检查哪个解码线程当前是空闲的,并将数据传递给解码器。解码器完成后,信号(包含图像)将通过handle_frames类发送回播放器。
这种方法效果很好。我得到~20 fps,没关系。目标是稳定的25.不幸的是,发送大型QByteArrays(包含编码数据)和QImages似乎会产生额外的延迟。我的新想法如下:
为什么不创建一个包含所有可以/将要在线程中传递的信息的类,为要在player_class中解码的每个帧存储一个实例,并向线程发送引用或指针而不是传递数据本身?
class request: public QObject {
Q_OBJECT
public:
int type; // 1 = request, 2 = response, 3 = kill processes
QImage img; // decoded image
QByteArray rawData; // extracted raw data of image to be decoded
qint64 frameNr; // frame number in image sequence
int decode_wait; // time to wait between decoding request.
int decode_total = 1; // nr of images to decode
int decode_time; // time took decoding images
int decode_layer; // layer n of image to decode
};
我的班级实例已创建并发出:
requests[i] = new request();
requests[i]->frameNr = decoding_frame;
requests[i]->decode_layer = decode_layer;
emit getFrames(requests[i]); // send out request
以下是我的连接声明:
connect(player_class, SIGNAL(getFrames(request*)), extract_frames_class, SLOT(slotFrameExtractRequests(request*)));
connect(extract_frames_class, SIGNAL(sendRawData(request*)), handle_frames_class, SLOT(slotRawData(request*)));
connect(handle_frames_class, SIGNAL(sendImage(request*)), player_class, SLOT(receiveDecodedImage(request*)), Qt::DirectConnection);
解码后的数据一返回,实例就会被删除。这种方法很有效,但解码速度降低到1fps左右。有人知道怎么来的吗?
在主线程中创建类实例之前,使用该语句根据qt文档qRegisterMetaType<request>("request");
传递自定义类会导致编译错误。
非常感谢有关如何解决此问题的提示!