![](/img/trans.png)
[英]VoIP: How to capture the live audio/video streaming bytes from Camera in Qt multimedia?
[英]How to show images from an ip camera as a live video while also doing some audio processing in Qt?
在這個應用程序中,我使用兩個音頻設備,每個設備都可以用作輸入和輸出設備。 一個音頻設備用作輸入,而另一個音頻設備使用饋送的輸入聲音作為輸出,反之亦然。 當這個音頻處理繼續進行時,我也嘗試從ip攝像頭顯示圖像並更新它以產生實時視頻。
該應用程序的屏幕截圖:
如您所見,我可以顯示圖像,但不能在進行任何類型的音頻處理時顯示。 問題是,每當我嘗試進行音頻處理並同時顯示視頻時,我會遇到問題,因為程序完全停止工作。
我有的插槽是:
private slots:
void on_startVideo_clicked();
void on_stopVideo_clicked();
void on_startInput1_clicked();
void on_stopInput1_clicked();
void on_startInput2_clicked();
void on_stopInput2_clicked();
void readMoreInput1();
void readMoreInput2();
這里除了on_startVideo_clicked()
和on_stopVideo_clicked()
之外的所有插槽都與音頻處理相關,它們工作正常,直到我調用與視頻相關的插槽。
用於顯示視頻的插槽:
void MainWindow::on_startVideo_clicked()
{
const std::string streamUrl = "http://operator:operator@axis-p5515/axis-cgi/mjpg/video.cgi?resolution=1920x1080&compression=0&dummy=param.mjpg";
if (!capture.open(streamUrl))
{
QMessageBox::warning(this, "Error", "No input device availabe!");
}
else
{
videoState = true;
ui->stopVideo->setEnabled(true);
ui->startVideo->setEnabled(false);
while(videoState){
cv::Mat frame;
capture >> frame;
cv::cvtColor(frame, frame, CV_BGR2RGBA);
cv::resize(frame, frame, cv::Size(ui->liveVideo->width(), ui->liveVideo->height()), 0, 0);
QImage image(frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGBA8888);
ui->liveVideo->setPixmap(QPixmap::fromImage(image));
QPixmap coloredImage(QPixmap::fromImage(image));
QPainter painter(&coloredImage);
painter.setOpacity(0.5);
painter.setBrush(Qt::red);
painter.drawRect(coloredImage.rect());
ui->overlayVideo->setPixmap(coloredImage);
qApp->processEvents(QEventLoop::AllEvents);
}
}
}
如您所見,我正在使用OpenCV
捕獲圖像並顯示它。 顯然,我做錯了什么。 你能指出我做錯了嗎?
謝謝!
這聽起來像是一個可以用C ++標准線程庫輕松解決的問題。 嘗試在不同的並發執行線程中運行音頻處理和OpenCV。
雖然我同意Mason Watmough的觀點,但你正在使用Qt和QThread抽象出許多令人討厭的東西,並允許你繼續在線程中使用信號和插槽。
QThread類頁面上有一個很好的例子,我在這篇帖子的底部添加了(為了保持頂級清潔)
您的程序布局將如下所示:
- ControllerClass
- VideoController
- VideoWorker
- AudioController
- AudioWorker
然后,您可以使用ControllerClass
生成線程,連接信號和插槽,然后使用兩個並發運行的線程的輸出來執行您想要的任何行為。
您可以采用與此類似的方式執行此操作:
myThread = new VideoController();
connect(myThread, SIGNAL(depthValues(float, float, float)), this, SLOT(on_depth_values(float, float, float)));
QThread示例:
class Worker : public QObject
{
Q_OBJECT
QThread workerThread;
public slots:
void doWork(const QString ¶meter) {
// ...
emit resultReady(result);
}
signals:
void resultReady(const QString &result);
};
class Controller : public QObject
{
Q_OBJECT
QThread workerThread;
public:
Controller() {
Worker *worker = new Worker;
worker->moveToThread(&workerThread);
connect(&workerThread, SIGNAL(finished()), worker, SLOT(deleteLater()));
connect(this, SIGNAL(operate(QString)), worker, SLOT(doWork(QString)));
connect(worker, SIGNAL(resultReady(QString)), this, SLOT(handleResults(QString)));
workerThread.start();
}
~Controller() {
workerThread.quit();
workerThread.wait();
}
public slots:
void handleResults(const QString &);
signals:
void operate(const QString &);
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.