ffpyplayer.pic.Image 转为 PyQt5.QtGui.QImage

该文章探讨了在开发视频播放器时如何处理音频和视频同步问题。通过ffpyplayer获取帧数据,将ffpyplayer的Image转换为PIL.Image,再进一步转化为PyQt5的QImage进行显示,以确保图像正确播放。这种方法有助于在Python环境中创建功能完备的媒体播放应用。
摘要由CSDN通过智能技术生成

最近在研究使用ffpyplayer和PyQt5实现视频播放器,期间为了实现音频和视频同步,考虑将ffpyplayer.pic.Image转为PyQt5.QtGui.QImage进行播放图片。
转换的思路是:先将ffpyplayer.pic.Image转为PIL.Image,然后再将PIL.Image转为QImage
具体实现方法如下:

def playerToImage(self):
    audio_frame, val = self.player.get_frame()
    if val != 'eof' and audio_frame is not None:
        image, pts = audio_frame
        bytes_1 = bytes(image.to_bytearray()[0])
        img2 = Image.frombytes("RGB", image.get_size(), bytes_1)
        image = QtGui.QImage(bytes_1, img2.size[0], img2.size[1], QtGui.QImage.Format_RGB888)
        return image
    else:
        return QImage()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
import sys import os import time from PyQt5 import QtGui #重新导入 from PyQt5 import QtCore #重新导入 from showPic import Ui_MainWindow from PyQt5.QtCore import * from PyQt5.QtGui import * #导入的外面 from PyQt5.QtWidgets import * import cv2 # 方法二 class picShow(QMainWindow, Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) # 方法一 # self.picMap = QtGui.QPixmap("img0.jpg") # self.label.setGeometry(QtCore.QRect(40, 40, 960, 560)) # 修改大小 # self.label.setPixmap(self.picMap) # 方法二(常用) self.n = 0 self.timer = QTimer(self) # 创建QT计时器 self.timer.timeout.connect(self.timer_pic) # 链接计时器触发函数 self.timer.start(1000) # 设置轮播间隔,里面单位是毫秒 self.dir_path = r"E:\pycharm\new_subject\image/" # r用来确保斜杠转义问题,最后的/一定要带上 self.file_list = os.listdir(self.dir_path) # print(file_list) def timer_pic(self): self.n += 1 # 调用函数实现自增 if self.n >= len(self.file_list): # 回退索引,轮播效果 self.n = 0 image_name = self.dir_path + self.file_list[self.n] url = image_name pic_image = cv2.imread(url) pic_image = cv2.cvtColor(pic_image, cv2.COLOR_BGR2RGB) # 将BGR格式图像转换成RGB height, width = pic_image.shape[:2] pixMap = QImage(pic_image.data, width, height, width*3, QImage.Format_RGB888) # 将RGB格式图像转换为八位图 pixMap = QPixmap.fromImage(pixMap) ratio = max(width/self.label.width(), height/self.label.height()) pixMap.setDevicePixelRatio(ratio) # 根据图片比例显示 self.label.setAlignment(Qt.AlignCenter) # 设置居中 self.label.setPixmap(pixMap) if __name__ == '__main__': app = QApplication(sys.argv) ui = picShow() ui.show() sys.exit(app.exec_())每一行是什么意思?
07-15
PyQt中的QtGui.QImage的参数包括以下几个: 1. data:表示图像的像素数据,可以是一个numpy数组或者是一个指向图像数据的指针。 2. width:表示图像的宽度,以像素为单位。 3. height:表示图像的高度,以像素为单位。 4. bytesPerLine:表示图像每行的字节数,通常为图像宽度乘以每个像素的字节数。 5. format:表示图像的像素格式,可以是QtGui.QImage.Format_RGB888、QtGui.QImage.Format_Grayscale16等。 举个例子,如果要将一个OpenCV图像转化为QtGui.QImage,可以使用以下方式: qimage = QtGui.QImage(cv2image.data, cols, rows, QtGui.QImage.Format_RGB888)。 请注意,QtGui.QImage的格式参数需要根据图像的实际格式进行选择。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [pyqt5——QImage与QPixmap](https://blog.csdn.net/wxsy024680/article/details/114894277)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [PyQt5中的QtGui.QImage图片显示问题分析](https://blog.csdn.net/TracelessLe/article/details/123339133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值