Qt显示视频流——(三)

 

 

之前的两次我们已经搭建好了nginx+rtmp服务和ffmpeg推流工具,本次进行最后一步结合Qt显示视频流。

 

1. 接入硬件摄像头

我使用的是UVC摄像头,也可以接入笔记本电脑自带的相机。在终端上使用ls /dev/vide* 查看一下相机是否被识别,如果识别,则会返回/dev/video0。

如果向查看更具体的其他关于相机的信息,可以使用dmesg命令查看。

 

2. 启动nginx

cd /usr/local/dev_workspace/nginx/sbin

sudo ./nginx

 

可通过网页访问localhost检查nginx是否启动成功

 

3. 使用ffmpeg从相机得到视频并推流

 

①安装ffmpeg所使用的配置参数

  configuration: --enable-shared --prefix=/usr/local/dev_workspace/ffmpeg --enable-libmp3lame --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-postproc --enable-ffplay --enable-libx264 --enable-libxvid --disable-x86asm

 

②安装ffmpeg所需依赖库

如果之前没安装过,一般都会缺这几个

sudo apt­get install libmp3lame­dev

sudo apt­get install libx264­dev

sudo apt­get install libxvidcore­dev

 

③推流命令参数

./ffmpeg -f video4linux2 -i /dev/video0 -f flv rtmp://localhost:1935/hls/video

注意这里是推流到本机,推到其他地方对应更换ip

 

结果如图:

640?wx_fmt=png

4. 使用Qt显示视频流

终于到这了,千呼万唤始出来!

 

①安装flash插件

sudo apt­get update

sudo apt­get install flashplugin­installer

 

② Qt程序

pro中添加webkitwidgets模块,ui中拖一个QWebView控件。

 

 

ui->webView->settings()->setAttribute(QWebSettings::PluginsEnabled,true);	
    ui->webView->settings()->setAttribute(QWebSettings::JavaEnabled,true);	
    ui->webView->settings()->setAttribute(QWebSettings::JavascriptEnabled,true);	
    ui->webView->settings()->setAttribute(QWebSettings::JavascriptCanOpenWindows,true);	
    ui->webView->settings()->setAttribute(QWebSettings::JavascriptCanAccessClipboard,true);	
    ui->webView->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled,true);	
    ui->webView->settings()->setAttribute(QWebSettings::SpatialNavigationEnabled,true);	
    ui->webView->settings()->setAttribute(QWebSettings::LinksIncludedInFocusChain,true);	
    ui->webView->settings()->setAttribute(QWebSettings::AcceleratedCompositingEnabled,true);	
    ui->webView->settings()->setAttribute(QWebSettings::AutoLoadImages,true);	

	
    ui->webView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);	

	
    ui->webView->setUrl(QUrl("http://192.168.1.22/rtmp/video.html"));

 

注意下,这里的ip是服务的ip,ffmpeg与nginx可能是分离开的。

 

过程是艰辛的,但是结果是美好的:

 

1>

640?wx_fmt=png

 

2>

640?wx_fmt=png

 

 

欢迎大家关注公众号:

640?wx_fmt=png

 

### 使用Python和Qt框架显示视频流 为了在Python中使用Qt框架显示视频流,可以借助`PyQt5`库以及多媒体处理模块。下面是一个完整的解决方案,展示了如何通过RTSP协议获取视频流并将其渲染到Qt窗口中的方法[^1]。 #### 安装依赖项 首先需要安装必要的软件包: ```bash pip install PyQt5 opencv-python-headless numpy rtsp-client ``` #### 创建基于Qt的应用程序结构 定义一个简单的GUI应用程序类继承自`QMainWindow`,用于承载视频播放组件。 #### 初始化摄像头或网络视频源连接 利用OpenCV读取来自本地摄像设备或是指定URL地址下的实时传输协议(RTSP)数据流。 #### 将图像帧转换成适合Qt使用的格式 每次接收到新的画面更新时,都需要把原始BGR色彩空间转为RGB模式,并调整尺寸适应界面控件大小;之后再创建对应的`QImage`对象供后续操作。 #### 更新UI上的图片标签内容 每当有新一帧到达就刷新一次Label部件内部所呈现的画面效果,从而达到流畅观看的目的。 具体实现如下所示: ```python import sys from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow, QVBoxLayout, QWidget from PyQt5.QtGui import QImage, QPixmap import cv2 class VideoStreamWindow(QMainWindow): def __init__(self, stream_url='rtsp://example.com/stream'): super().__init__() self.setWindowTitle('Video Stream Viewer') self.setGeometry(100, 100, 800, 600) central_widget = QWidget(self) layout = QVBoxLayout() label = QLabel(central_widget) layout.addWidget(label) central_widget.setLayout(layout) self.setCentralWidget(central_widget) # Initialize video capture from RTSP URL or webcam index (e.g., 0 for default camera). self.cap = cv2.VideoCapture(stream_url) timer_interval_ms = 30 # Adjust as needed. self.timer_id = self.startTimer(timer_interval_ms) self.label = label def timerEvent(self, event): ret, frame = self.cap.read() if not ret: print("Failed to grab frame.") return rgb_image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) h, w, ch = rgb_image.shape bytes_per_line = ch * w convert_to_Qt_format = QImage(rgb_image.data, w, h, bytes_per_line, QImage.Format_RGB888) p = convert_to_Qt_format.scaled(self.label.width(), self.label.height()) self.label.setPixmap(QPixmap.fromImage(p)) if __name__ == '__main__': app = QApplication(sys.argv) window = VideoStreamWindow() window.show() try: sys.exit(app.exec_()) except SystemExit: pass ``` 此段代码实现了基本的功能需求——即从给定的RTSP链接拉取消息并即时呈现在图形界面上。对于更复杂的应用场景比如在线教学平台,则可能还需要集成音频支持以及其他交互特性[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值