下載ubuntu
https://releases.ubuntu.com/16.04/ubuntu-16.04.7-desktop-amd64.iso
下載ffmpeg
https://ffmpeg.org/download.html
ffmpeg-6.0.tar.xz
下載QtAV
https://github.com/wang-bin/QtAV/releases
QtAV-1.12.0.zip
更新
sudo apt update
安裝庫(kù)
sudo apt-get install libglu1-mesa-dev freeglut3-dev mesa-common-dev
sudo apt-get install libavutil-dev libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install libopenal-dev libpulse-dev libva-dev libxv-dev libass-dev libegl1-mesa-dev
編譯ffmpeg
./configure --enable-shared --disable-yasm --prefix=/usr/local/ffmpeg
make
sudo make install?
ffmepg可不編譯
安裝qt4
sudo apt install qt4-default
編譯QtAV
cd QtAV-1.12.0
mkdir build
cd build
qmake ..
make
用例
untitled1.pro
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = untitled1
TEMPLATE = app
SOURCES += main.cpp\
playerwindow.cpp
HEADERS += playerwindow.h
INCLUDEPATH += $$PWD/include
LIBS += -L$$PWD/lib_linux_x86_64/ -Wl,-rpath=$$PWD/lib_linux_x86_64/ -lQtAV -lQtAVWidgets
playerwindow.h?
#ifndef PLAYERWINDOW_H
#define PLAYERWINDOW_H
#include <QWidget>
#include <QtAV/VideoOutput.h>
#include <QtAV/AVPlayer.h>
QT_BEGIN_NAMESPACE
class QSlider;
class QPushButton;
QT_END_NAMESPACE
class PlayerWindow : public QWidget
{
Q_OBJECT
public:
explicit PlayerWindow(QWidget *parent = 0);
public Q_SLOTS:
void openMedia();
void seekBySlider(int value);
void seekBySlider();
void playPause();
private Q_SLOTS:
void updateSlider(qint64 value);
void updateSlider();
void updateSliderUnit();
private:
QtAV::VideoOutput *m_vo;
QtAV::AVPlayer *m_player;
QSlider *m_slider;
QPushButton *m_openBtn;
QPushButton *m_playBtn;
QPushButton *m_stopBtn;
int m_unit;
};
#endif // PLAYERWINDOW_H
playerwindow.cpp?
#include "playerwindow.h"
#include <QPushButton>
#include <QSlider>
#include <QLayout>
#include <QMessageBox>
#include <QFileDialog>
using namespace QtAV;
PlayerWindow::PlayerWindow(QWidget *parent) : QWidget(parent)
{
m_unit = 1000;
setWindowTitle(QString::fromLatin1("QtAV simple player example"));
m_player = new AVPlayer(this);
QVBoxLayout *vl = new QVBoxLayout();
setLayout(vl);
m_vo = new VideoOutput(this);
if (!m_vo->widget()) {
QMessageBox::warning(0, QString::fromLatin1("QtAV error"), tr("Can not create video renderer"));
return;
}
m_player->setRenderer(m_vo);
vl->addWidget(m_vo->widget());
m_slider = new QSlider();
m_slider->setOrientation(Qt::Horizontal);
connect(m_slider, SIGNAL(sliderMoved(int)), SLOT(seekBySlider(int)));
connect(m_slider, SIGNAL(sliderPressed()), SLOT(seekBySlider()));
connect(m_player, SIGNAL(positionChanged(qint64)), SLOT(updateSlider(qint64)));
connect(m_player, SIGNAL(started()), SLOT(updateSlider()));
connect(m_player, SIGNAL(notifyIntervalChanged()), SLOT(updateSliderUnit()));
vl->addWidget(m_slider);
QHBoxLayout *hb = new QHBoxLayout();
vl->addLayout(hb);
m_openBtn = new QPushButton(tr("Open"));
m_playBtn = new QPushButton(tr("Play/Pause"));
m_stopBtn = new QPushButton(tr("Stop"));
hb->addWidget(m_openBtn);
hb->addWidget(m_playBtn);
hb->addWidget(m_stopBtn);
connect(m_openBtn, SIGNAL(clicked()), SLOT(openMedia()));
connect(m_playBtn, SIGNAL(clicked()), SLOT(playPause()));
connect(m_stopBtn, SIGNAL(clicked()), m_player, SLOT(stop()));
}
void PlayerWindow::openMedia()
{
QString file = QFileDialog::getOpenFileName(0, tr("Open a video"));
if (file.isEmpty())
return;
m_player->play(file);
}
void PlayerWindow::seekBySlider(int value)
{
if (!m_player->isPlaying())
return;
m_player->seek(qint64(value*m_unit));
}
void PlayerWindow::seekBySlider()
{
seekBySlider(m_slider->value());
}
void PlayerWindow::playPause()
{
if (!m_player->isPlaying()) {
m_player->play();
return;
}
m_player->pause(!m_player->isPaused());
}
void PlayerWindow::updateSlider(qint64 value)
{
m_slider->setRange(0, int(m_player->duration()/m_unit));
m_slider->setValue(int(value/m_unit));
}
void PlayerWindow::updateSlider()
{
updateSlider(m_player->position());
}
void PlayerWindow::updateSliderUnit()
{
m_unit = m_player->notifyInterval();
updateSlider();
}
main.cpp?
#include <QApplication>
#include "playerwindow.h"
#include <QtAVWidgets/global.h>
int main(int argc, char *argv[])
{
QtAV::Widgets::registerRenderers();
QApplication a(argc, argv);
PlayerWindow player;
player.show();
player.resize(800, 600);
return a.exec();
}
關(guān)于demo也可以用example目錄里的,這里不用QtCreator,而是直接在終端里編譯;
mkdir build && cd build && qmake ../player.pro即可
首次編譯會(huì)失敗,生成lib_linux_文件夾,將QtAV的庫(kù)拷貝到lib_linux_文件夾內(nèi)
然后正常編譯即可
安裝顯卡
ubuntu16.04安裝nvidia驅(qū)動(dòng)_氺月洞天的博客-CSDN博客
硬解碼
按下圖,用QtAV自帶的Player打開(kāi)視頻,手動(dòng)選中解碼為CUDA是沒(méi)辦法啟用硬解碼的
可以通過(guò)命令啟動(dòng)
./Player -vd "cuda;vaapi;vda;dxva;cedarv;ffmpeg" -f rtsp://admin:xx@xx
命令行說(shuō)明
命令行 player [-ao null] [-vo qt|gl|d2d|gdi|xv] [-vd "dxva[;cuda[;vaapi[;vda[;ffmpeg]]]]"] [--ffmpeg-log] [-f url|path|pipe:] 關(guān)閉音頻 -ao null |
linux下項(xiàng)目打包
參考:使用linuxdeployqt在linux下進(jìn)行Qt打包發(fā)布(超詳細(xì))_百里楊的博客-CSDN博客
?下載地址
Releases · probonopd/linuxdeployqt · GitHub
?
修改名稱
mv linuxdeployqt-6-x86_64.AppImage linuxdeployqt
添加可執(zhí)行權(quán)限
sudo chmod 777 linuxdeployqt
移到/usr/local/bin目錄
sudo mv linuxdeployqt /usr/local/bin
測(cè)試是否安裝成功
linuxdeployqt --version?
cz@ubuntu:~/圖片/QtAV-1.12.0/examples/player/out/bin$ linuxdeployqt --version |
?QtAV項(xiàng)目Player的項(xiàng)目樹(shù)狀結(jié)構(gòu)如下:
. ├── lib │???├── libcommon.a │???├── libcommon.prl │???├── libQtAV.prl │???├── libQtAV.so │???├── libQtAV.so.1 │???├── libQtAV.so.1.12 │???├── libQtAV.so.1.12.0 │???├── libQtAVWidgets.prl │???├── libQtAVWidgets.so │???├── libQtAVWidgets.so.1 │???├── libQtAVWidgets.so.1.12 │???└── libQtAVWidgets.so.1.12.0 └── Player |
執(zhí)行命令
linuxdeployqt Player -appimage
linuxdeployqt ?(commit 8428c59), build 47 built on 2023-04-23 17:29:33 UTC Not using FHS-like mode app-binary: "/home/cz/視頻/build/Player" appDirPath: "/home/cz/視頻/build" relativeBinPath: "Player" ERROR: Desktop file missing, creating a default one (you will probably want to edit it) ERROR: Icon file missing, creating a default one (you will probably want to edit it) qmakePath 3= "" appimagetool, continuous build (commit 8bbf694), build <local dev build> built on 2020-12-31 11:48:33 UTC Desktop file: /home/cz/視頻/build/default.desktop Categories entry not found in desktop file .desktop file is missing a Categories= key |
得到新的目錄如下
將lib和Player打包拷貝到另一個(gè)機(jī)器上
報(bào)錯(cuò)如下
relocation error: /libgcrypt.so.20: symbol gpgrt get syscall clamp, version GPG ERROR 1. not defined in file libgpg-error.so.o with link time reference |
刪除lib/libgcrypt.so.20后正常運(yùn)行文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-632110.html
其他
?參考:Qt第三方庫(kù)QtAV--- ubuntu編譯與運(yùn)行_那時(shí)風(fēng)起的博客-CSDN博客文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-632110.html
到了這里,關(guān)于QtAV for ubuntu16.04的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!