簡體   English   中英

如何將圖像從ip攝像頭顯示為實時視頻,同時在Qt中進行一些音頻處理?

[英]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 &parameter) {
        // ...
        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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM