Qt 5.6以上版本的MJPG-STREAMER視頻播放實現
時間:2017-10-25 來源:未知
主機:Windows 7
Qt:5.9.1
MJPG-streamer是一款免費基于IP地址的視頻流服務器,它的輸入插件從攝像頭讀取視頻數據,這個輸入插件產生視頻數據并將視頻數據復制到內存中,它有多個輸出插件將這些視頻數據經過處理,其中重要的輸出插件是網站服務器插件,它將視頻數據傳送到用戶瀏覽器中,MJPG-streamer的工作就是將其中的一個輸入插件和多個輸出插件綁定在一起,所有的工作都是通過它的各個插件完成的。如果攝像頭直接支持MJPEG格式的話,MJPG-streamer可以快速獲得圖片,并發送給Web客戶端進行顯示。整個過程中不涉及到圖片格式轉換,視頻壓縮處理方面工作,僅僅涉及到數據轉發的工作,所以在性能較低的嵌入式Linux平臺上也可以比較流暢的工作。
因為MJPG-streamer是基于HTTP協議的,所以只需要有一個Web瀏覽器,輸入正確的網址就能觀看到視頻。但如果要將視頻顯示在一個桌面應用的話,則需要進行一些編碼操作。在Qt5.4到Qt5.6的版本中繼承了Web Kit,可以很方便地請求網頁數據并進行顯示。如果要播放MJPG-streamer視頻的話,則可以通過連續不斷地請求單張JPEG圖片并進行顯示即可。對圖片的請求和顯示的典型代碼如下:
ui->webView->setUrl(QUrl("//192.168.1.1:8080/?action=snapshot"));
ui->webView->update();
但是在Qt 5.6之后,Web Kit被刪除了,取而代之的是更強大的WebEngine。要實現上面的功能,可以通過下面的代碼來實現。
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
protected slots:
void showPicture();
private:
Ui::Widget *ui;
// 用于發送請求并獲得響應
QNetworkAccessManager manager;
// 響應的內容
QNetworkReply *reply;
};
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
// 發起獲取單張圖片的請求
QUrl url("//127.0.0.1:8080/?action=snapshot");
reply = manager.get(QNetworkRequest(url));
// 完整接收到響應的數據后調用showPicture槽函數
connect(reply, SIGNAL(finished()), this, SLOT(showPicture()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::showPicture()
{
// 從響應中獲取圖片數據,并顯示在QLabel上
QByteArray jpegData = reply->readAll();
QPixmap pixmap;
pixmap.loadFromData(jpegData);
ui->labelPic->setPixmap(pixmap);
delete reply;
// 繼續發起請求,以便以快速度刷新圖片
QUrl url("//127.0.0.1:8080/?action=snapshot");
reply = manager.get(QNetworkRequest(url));
connect(reply, SIGNAL(finished()), this, SLOT(showPicture()));
}
注意,上面的代碼對圖片連續顯示形成視頻的核心在于:顯示完圖片后立即發起下一次請求。另外,因為reply每次都不一樣,所以要對新的對象建立信號和槽的連接。

