Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法从QProcess将图像发送到ffmpeg标准输入_Python_Windows_Ffmpeg_Pyqt5 - Fatal编程技术网

Python 无法从QProcess将图像发送到ffmpeg标准输入

Python 无法从QProcess将图像发送到ffmpeg标准输入,python,windows,ffmpeg,pyqt5,Python,Windows,Ffmpeg,Pyqt5,它不是在写png文件。我想将中心小部件保存到png文件。我有两个文件,一个是主文件,第二个是ui文件。链接具有ui文件 获取错误代码: QWindowsPipeWriter::写入失败。(句柄无效。) main.py import sys from PyQt5.QtWidgets import QWidget from PyQt5 import QtCore, QtGui, QtWidgets from green import Ui_MainWindow class MyWindow(QtWi

它不是在写png文件。我想将中心小部件保存到png文件。我有两个文件,一个是主文件,第二个是ui文件。链接具有ui文件

获取错误代码:

QWindowsPipeWriter::写入失败。(句柄无效。)

main.py

import sys
from PyQt5.QtWidgets import QWidget
from PyQt5 import QtCore, QtGui, QtWidgets
from green import Ui_MainWindow
class MyWindow(QtWidgets.QMainWindow, Ui_MainWindow, QWidget):
   def __init__(self):
    QtWidgets.QMainWindow.__init__(self)
    Ui_MainWindow.__init__(self)

    self.setupUi(self)
    self.widger_screen()

def widger_screen(self):

    self.process = QtCore.QProcess(app)
    self.process.setProcessChannelMode(self.process.ForwardedChannels)
    self.process.setOpenMode(self.process.WriteOnly)
    self.process.start('ffmpeg',
                       ['-y',
                        '-analyzeduration', '1000',
                        '-vcodec', 'png', '-i', '-',
                        '-vcodec', 'mpeg4',
                        '-qscale', '5', '-r', '24', 'video.avi',
                        "-loglevel", "debug"])
    for i in range(100):
        QWidget.grab(self.centralwidget).save(self.process, "PNG")

if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
green.ui
您的代码存在不同的问题

首先,您必须指定图像的格式,因此正确的语法为:

QWidget.grab(self.centralwidget).save(process, "PNG")
事实上,在您的情况下,
save()
将返回
False
,而使用正确的格式现在将返回
True

此外,您还需要最少的帧数,以确保ffmpeg有足够的数据来实际开始处理。该量以分析持续时间值表示,默认为5000000微秒(5秒)。由于您仅捕获100帧(少于4秒),这是不够的,因此请增加录制的帧数,或在选项开头附近添加
analyzeduration
选项,使用较低的值(但仍高于0)

另一个问题(编辑后)是您错误输入了
loglevel
选项。当从提示符/shell运行程序时,从输出中可以清楚地看到这一点:

Unrecognized option 'loglevel2'.
Error splitting the argument list: Option not found
虽然不会出现错误/异常,但结果是ffmpeg进程退出,无法写入输出文件


最后,一些考虑:

  • 当小部件仍在init函数中时启动抓取操作可能会导致不一致的大小调整,因为一些小部件可能需要时间来“完善”自己(通常在init返回后至少有一个事件循环,如项目视图)
  • 抓取整个小部件的“屏幕截图”可能需要很多时间;我没有一台功能强大的计算机(它是~2012 Intel i5,4核@3.4GHz),在Linux上,在一个非常轻的窗口系统上,每次抓取都需要120毫秒以上(您的窗口大小甚至比标准的全高清视频还要大):整个过程大约需要12秒,直到抓取过程完成并最终显示窗口(这是因为抓取是在调用
    show()
    之前完成的);我非常确定,有一些很好的解决方案可以使用线程将抓取的pixmap排队到
    stdout
    ,但您必须小心,因为QPixmap对象不是线程安全的;如果您想这样做,最好创建一个新的单独问题
  • 抓取的小部件可能会改变其大小(可能是由于用户交互),一旦发生这种情况,输出视频将被调整大小;如果输出格式支持调整大小,这不会是一个大问题,但您可能会得到不一致的行为,特别是在尝试将代码转换为不支持视频调整大小的其他格式时

  • 我想我做错了什么,因为它仍然不起作用。OES
    save()
    返回True?除了开始消息之外,您是否还看到ffmpeg的一些输出?(请不要添加答案,如果它只是说您仍然存在问题,注释用于此)save()返回True是的。我想我看不见。程序一开始就崩溃了。你能编辑你的问题吗?是的,我能。因为我是新来的,所以我必须看看怎么做
    Unrecognized option 'loglevel2'.
    Error splitting the argument list: Option not found