下载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
安装库
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();
}
关于demo也可以用example目录里的,这里不用QtCreator,而是直接在终端里编译;
mkdir build && cd build && qmake ../player.pro即可
首次编译会失败,生成lib_linux_文件夹,将QtAV的库拷贝到lib_linux_文件夹内
然后正常编译即可
安装显卡
ubuntu16.04安装nvidia驱动_氺月洞天的博客-CSDN博客
硬解码
按下图,用QtAV自带的Player打开视频,手动选中解码为CUDA是没办法启用硬解码的
可以通过命令启动
./Player -vd "cuda;vaapi;vda;dxva;cedarv;ffmpeg" -f rtsp://admin:xx@xx
命令行说明
命令行 player [-ao null] [-vo qt|gl|d2d|gdi|xv] [-vd "dxva[;cuda[;vaapi[;vda[;ffmpeg]]]]"] [--ffmpeg-log] [-f url|path|pipe:] 关闭音频 -ao null |
linux下项目打包
参考:使用linuxdeployqt在linux下进行Qt打包发布(超详细)_百里杨的博客-CSDN博客
下载地址
Releases · probonopd/linuxdeployqt · GitHub
修改名称
mv linuxdeployqt-6-x86_64.AppImage linuxdeployqt
添加可执行权限
sudo chmod 777 linuxdeployqt
移到/usr/local/bin目录
sudo mv linuxdeployqt /usr/local/bin
测试是否安装成功
linuxdeployqt --version
cz@ubuntu:~/图片/QtAV-1.12.0/examples/player/out/bin$ linuxdeployqt --version |
QtAV项目Player的项目树状结构如下:
. ├── 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 |
执行命令
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打包拷贝到另一个机器上
报错如下
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后正常运行文章来源:https://www.toymoban.com/news/detail-632110.html
其他
参考:Qt第三方库QtAV--- ubuntu编译与运行_那时风起的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-632110.html
到了这里,关于QtAV for ubuntu16.04的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!