ubuntu环境下,QT结合MediaMTX+FFmpeg实现本地视频rtsp或rtmp推流

发布时间:2026/7/15 6:30:20
ubuntu环境下,QT结合MediaMTX+FFmpeg实现本地视频rtsp或rtmp推流 一、下载MP4素材网址https://www.pexels.com/二、Ubuntu环境ubuntu版本lsb_release -a o LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.5 LTS Release: 22.04 Codename: jammy网络ifconfig ens33: flags4163UP,BROADCAST,RUNNING,MULTICAST mtu 1500 inet 192.168.182.130 netmask 255.255.255.0 broadcast 192.168.182.255 inet6 fe80::4164:75f4:5ed9:8f02 prefixlen 64 scopeid 0x20link ether 00:0c:29:28:3d:84 txqueuelen 1000 (以太网) RX packets 251485 bytes 358853221 (358.8 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 87582 bytes 5680763 (5.6 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags73UP,LOOPBACK,RUNNING mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10host loop txqueuelen 1000 (本地环回) RX packets 103436 bytes 295538858 (295.5 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 103436 bytes 295538858 (295.5 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0三、下载MediaMTX# 下载 Linux 版 wget https://github.com/bluenviron/mediamtx/releases/download/v1.10.0/mediamtx_v1.10.0_linux_amd64.tar.gz tar -zxvf mediamtx_v1.10.0_linux_amd64.tar.gz cd mediamtx_v1.10.0_linux_amd64 # 没有该文件夹则跳过该步骤 # 直接启动 RTSP 服务默认端口8554 ./mediamtxffmpeg推流视频前一定先启动这个。启动成功界面2026/05/21 11:15:29 INF MediaMTX v1.10.0 2026/05/21 11:15:29 INF configuration loaded from /home/hisi/stream_server/mediamtx.yml 2026/05/21 11:15:29 INF [RTSP] listener opened on :8554 (TCP), :8000 (UDP/RTP), :8001 (UDP/RTCP) 2026/05/21 11:15:29 INF [RTMP] listener opened on :1935 2026/05/21 11:15:29 INF [HLS] listener opened on :8888 2026/05/21 11:15:29 INF [WebRTC] listener opened on :8889 (HTTP), :8189 (ICE/UDP) 2026/05/21 11:15:29 INF [SRT] listener opened on :8890 (UDP)四、下载ffmpegsudo apt update sudo apt install ffmpeg -y五、在终端进行视频推流进行视频推流# 降低了视频分辨率否则播放时会有马赛克或卡顿 ffmpeg -re -stream_loop -1 -i talk_3840_2160_30fps.mp4 \ -c:v libx264 \ -preset:v veryfast \ -profile:v baseline \ -level 3.1 \ -b:v 2M \ -maxrate 2M \ -bufsize 4M \ -g 15 \ -rtsp_transport tcp \ -f rtsp rtsp://192.168.182.130:8554/stream播放ffplay rtsp://192.168.182.130:8554/streamvlc 如果能播放表示推流成功如果不能播放如下面错误您的输入无法被打开: VLC 无法打开 MRL「rtsp://192.168.182.130:8554/stream」。详情请检查日志。不意味着推流失败可能是vlc好像会在地址上拼接stream0, mediamtx不认识vlc会报错误只要ffplay rtsp://192.168.182.130:8554/stream正常播放就可以。如果报错后还想要用vlc打开视频流不用 RTSP改用 RTMPVLC 完美支持。ffmpeg -re -stream_loop -1 -i talk_3840_2160_30fps.mp4 -c:v libx264 -preset ultrafast -tune zerolatency -s 1280x720 -b:v 2000k -f flv rtmp://192.168.182.130:1935/stream正常打开进行推流在vlc输入 rtmp://192.168.182.130:1935/stream 即可播放视频小结ffmpeg也可以实现rtsp视频流推送ffmpeg -re -i 视频.mp4 -f rtsp rtsp://0.0.0.0:8554/live 但是ffmpeg 自带的 RTSP 有 3 个缺点只能 1 个人看不能多人同时看不支持自动重连VLC 兼容性很差经常打不开不支持 RTMP / HLS / WebRTC使用mediamtx, ffmpeg 把视频推送到 → rtsp://192.168.182.130:8554/stream 这个地址因为你先启动了 MediaMTX它占用了 8554 端口 等着收流。适合后续多台设备同时拉流、协议转换场景。六、QT 5.15 新建项目测试文件目录结构rtsp_test1 |-—- rtsp_test1.pro |--- main.cpp |--- widget.h |--- widget.cppWidget.h#ifndef WIDGET_H #define WIDGET_H #include QWidget #include QProcess #include QPushButton #include QVBoxLayout #include QDebug class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent nullptr); ~Widget(); private slots: void slotStartText(); // 文字OSD void slotStartTime(); // 时间OSD void slotStop(); // 停止 private: QProcess *m_media; // 启动 mediamtx QProcess *m_proc; // 启动推流 }; #endif // WIDGET_HWidget.cpp#include widget.h Widget::Widget(QWidget *parent) : QWidget(parent) { // 创建按钮 QPushButton *btnText new QPushButton(叠加文字, this); QPushButton *btnTime new QPushButton(叠加时间, this); QPushButton *btnStop new QPushButton(停止推流, this); // 布局 QVBoxLayout *layout new QVBoxLayout(this); layout-addWidget(btnText); layout-addWidget(btnTime); layout-addWidget(btnStop); setLayout(layout); m_proc new QProcess(this); // 【正确写法】必须设置工作路径 m_media new QProcess(this); m_media-setWorkingDirectory(/home/hisi/stream_server); // 关键,为了启动时mediamtx能够找到当前路径配置文件 m_media-start(./mediamtx); // 按钮绑定 connect(btnText, QPushButton::clicked, this, Widget::slotStartText); connect(btnTime, QPushButton::clicked, this, Widget::slotStartTime); connect(btnStop, QPushButton::clicked, this, Widget::slotStop); } Widget::~Widget() { slotStop(); qDebug()m_media-kill()执行; m_media-kill(); m_media-waitForFinished(); } // 叠加文字 OSD void Widget::slotStartText() { slotStop(); // 【必对路径】改成你自己的用户名 QString videoPath /home/hisi/Downloads/talk_3840_2160_30fps.mp4; QStringList args; args -re -stream_loop -1 -i videoPath -vf drawtexttextQt-FFmpeg-OSD:fontsize36:fontcolorred:x20:y20 -c:v libx264 -preset ultrafast -tune zerolatency -s 1280x720 -b:v 2000k -f flv rtmp://192.168.182.130:1935/stream -hide_banner -loglevel info; m_proc-start(ffmpeg, args); } // 叠加时间 OSD void Widget::slotStartTime() { slotStop(); QString videoPath /home/hisi/Downloads/talk_3840_2160_30fps.mp4; QStringList args; args -re -stream_loop -1 -i videoPath -vf drawtexttext%{localtime}:fontsize28:fontcoloryellow:x20:y20 -c:v libx264 -preset ultrafast -tune zerolatency -s 1280x720 -b:v 2000k -f flv rtmp://192.168.182.130:1935/stream -hide_banner -loglevel info; m_proc-start(ffmpeg, args); } // 停止 void Widget::slotStop() { if (m_proc-state() QProcess::Running) { qDebug()m_proc-kill()执行; m_proc-kill(); m_proc-waitForFinished(); } }main.cpp#include widget.h #include QApplication int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }运行效果如下图vlc 输入 rtmp://192.168.182.130:1935/stream 。视频能够正常播放。小结ps -ef | grep mediamtx # 查看mediamtx是否启动如果启动则输出hisi 14096 14076 0 13:42 pts/1 00:00:00 ./mediamtx hisi 14123 14115 0 13:43 pts/2 00:00:00 grep --colorauto mediamtx杀死 mediamtx pkill -f mediamtx再次查看mediamtx 输出 表示mediamtx 程序已经杀死了hisi 14226 14211 0 14:01 pts/1 00:00:00 grep --colorauto mediamtxQT关闭程序时需要点击程序右上角的X析构函数才能正常调用如果点击qtcreator软件的红色方块停止程序如下析构函数不会调用造成程序停止但流视频和mediamtx都不停止的现象。这种实现方式依赖QT 和 本机环境本质上和终端没有区别后续在修改吧。