PyQt QMediaPlayer setPosition 对位置值进行四舍五入

2024-01-04

我有一个应用程序,旨在帮助同步实验视频和数据信号。该应用程序有一个视频小部件和一个滑块,可以设置视频的时间位置。然而,QMediaPlayer 只会以 500 毫秒/1000 毫秒的间隔设置位置(在我的应用程序中为 500 毫秒/在设计的应用程序中为 1000 毫秒),而视频以 50 fps 拍摄,意味着 20 毫秒的间隔。这使得同步变得毫无用处。我添加了位置更改之前和之后位置的输出。

任何帮助,将不胜感激。

这是更改滑块时的输出:

New slider position 326
Media player updated position 0
New slider position 816
Media player updated position 0
New slider position 1306
Media player updated position 0
New slider position 1632
Media player updated position 1000
New slider position 1959
Media player updated position 1000
New slider position 2449
Media player updated position 2000
New slider position 2938
Media player updated position 2000
New slider position 3428
Media player updated position 2000
New slider position 3755
Media player updated position 3000
New slider position 4081
Media player updated position 3000
New slider position 4571
Media player updated position 4000
New slider position 4897
Media player updated position 4000
New slider position 5224
Media player updated position 4000
New slider position 5550
Media player updated position 5000
New slider position 5714
Media player updated position 5000
New slider position 6040
Media player updated position 5000
New slider position 6203
Media player updated position 6000
New slider position 6530

我还尝试设置从 mediaPlayer.position () 检索到的特定位置,但无济于事。

这是设计的应用程序:

import sys
from PyQt5 import QtWidgets
from PyQt5.QtCore import QSize, Qt, QUrl
from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer
from PyQt5.QtMultimediaWidgets import QVideoWidget
from PyQt5.QtWidgets import QMainWindow, QLabel, QWidget, QSlider
from PyQt5.QtWidgets import QVBoxLayout, QHBoxLayout

#
# Reference https://pythonprogramminglanguage.com/pyqt5-video-widget/
#
class MainWindow (QMainWindow):
    def __init__ (self, parent=None):
        super (QMainWindow, self).__init__ (parent)

        #
        # Set the filename here
        #
        filename = '/Users/yuval/src/lab/S4560001.MP4'

        self.setMinimumSize (QSize (640, 480))
        self.setWindowTitle ('Video & Data Viewer and Annotator')

        self.mediaPlayer = QMediaPlayer (None, QMediaPlayer.VideoSurface)
        videoWidget = QVideoWidget ()
        videoWidget.setMinimumSize (640,200)

        #
        # Position Slider
        #
        self.positionSlider = QSlider (Qt.Horizontal)
        self.positionSlider.setRange (0, 0)
        self.positionSlider.sliderMoved.connect (self.setPosition)

        #
        # Position Label
        #
        self.positionLabel = QLabel ('00:00:000')

        centralWidget = QWidget (self)
        self.setCentralWidget (centralWidget)

        #
        # Layout the Control Widgets
        #
        ctlLayout = QHBoxLayout ()
        ctlLayout.setContentsMargins (0, 0, 0, 0)
        ctlLayout.addWidget (self.positionSlider)
        ctlLayout.addWidget (self.positionLabel)

        #
        # Layout the Window
        #
        layout = QVBoxLayout ()
        layout.addWidget (videoWidget)
        layout.addLayout (ctlLayout)

        centralWidget.setLayout (layout)

        self.mediaPlayer.setVideoOutput (videoWidget)
        self.mediaPlayer.positionChanged.connect (self.positionChanged)
        self.mediaPlayer.durationChanged.connect (self.durationChanged)
        self.mediaPlayer.error.connect (self.handleError)
        self.mediaPlayer.setNotifyInterval (100)
        self.mediaPlayer.setMuted (True)

        print (filename)

        if filename != '':
            self.mediaPlayer.setMedia (
                QMediaContent (QUrl.fromLocalFile (filename)))

    def positionChanged (self, position):
        self.positionSlider.setValue (position)

    def durationChanged (self, duration):
        self.positionSlider.setRange (0, duration)

    def setPosition (self, position):
        print (f'New slider position {position}')
        self.mediaPlayer.setPosition (position)
        print (f'Media player updated position {self.mediaPlayer.position ()}')

    def handleError (self):
        print ('Error: ' + self.mediaPlayer.errorString ())

if __name__ == '__main__':
    app = QtWidgets.QApplication (sys.argv)
    mainWin = MainWindow ()
    mainWin.show ()
    sys.exit (app.exec_ ())

我在 MacOS 10.14.16 (Mojave) 上运行。

Python 3.7.4

Python 包: PyQt5==5.13.0 PyQt5-sip==4.19.18

端口包: py37-pyqt5 @5.12.2_0(活动) qt5 @5.12.4_0(活动)


找到了答案。这个问题出现在 Qt5 中,他们“声称”这不是一个错误,而且似乎也没有任何计划来修复它。它特定于 MacOS,并且在 Windows 上运行良好(我怀疑是 Linux)。问题在于 Qt5 使用具有时间容差的 MacOS API。默认情况下,它只会使用“关键帧”,同时可以限制其容差。 Qt5 没有指定容差,因此它会调整关键帧的时间。

如果 MacOS Qt5 开发团队中有人能解决这个问题,那就太好了。是的,如果我有一个开发环境,我会自己修复它(但无论如何我可能会被否决)。

参见(2015 年起)https://bugreports.qt.io/browse/QTBUG-49609?jql=project%20%3D%20QTBUG%20AND%20resolution%20%3D%20 未解析%20AND%20 text%20~%20%22 qmediaplayer% 22%20ORDER%20BY%20优先级%20DESC%2C%20更新%20DESC https://bugreports.qt.io/browse/QTBUG-49609?jql=project%20%3D%20QTBUG%20AND%20resolution%20%3D%20Unresolved%20AND%20text%20~%20%22qmediaplayer%22%20ORDER%20BY%20priority%20DESC%2C%20updated%20DESC

MacOS / AVFoundation API 是https://developer.apple.com/documentation/avfoundation/avplayeritem/1387418-seek https://developer.apple.com/documentation/avfoundation/avplayeritem/1387418-seek

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyQt QMediaPlayer setPosition 对位置值进行四舍五入 的相关文章

  • Erlang:到 Python 实例的端口没有响应

    我正在尝试通过 Erlang 端口与外部 python 进程进行通信 首先 打开一个端口 然后通过 stdin 将消息发送到外部进程 我期待在进程的标准输出上得到相应的答复 我的尝试如下所示 open a port Port open po
  • 如何同时运行多个功能[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有以下代码 my func1 my func2 my func3 my func4 my func5 是否可以同时计算函数的数据 而
  • 从内存地址创建python对象(使用gi.repository)

    有时我需要调用仅存在于 C 中的 gtk gobject 函数 但返回一个具有 python 包装器的对象 之前我使用过基于 ctypes 的解决方案 效果很好 现在我从 PyGtk import gtk 切换到 GObject intro
  • 如何通过 python 中的函数运行列表?

    我试图通过我创建的函数运行我的列表 但不断收到错误 我不知道出了什么问题 温度 F temp f 19 21 21 21 23 功能 def fahrToCelsius tempFahrenheit return tempFahrenhei
  • pyCUDA无法打印结果

    最近 我使用 pip 为我的 python3 4 3 安装 pyCUDA 但我在测试示例代码时发现 https documen tician de pycuda tutorial html getting started https doc
  • Python:json_normalize pandas 系列给出 TypeError

    我在 pandas 系列中有数万行像这样的 json 片段df json IDs lotId 1 Id 123456 date 2009 04 17 bidsCount 2 IDs lotId 2 Id 123456 date 2009 0
  • 使用 Pandas 从 csv 文件读取标题信息

    我有一个包含 14 行标题的数据文件 在标头中 有经纬度坐标和时间的元数据 我目前正在使用 pandas read csv filename delimiter header 14 读取文件 但这只是获取数据 我似乎无法获取元数据 有人知道
  • Python speedtest.net,或等效的[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 是否有一个 Python 库可以实现 SpeedTest net 测试或等效的互联网连接速度测试 GitHub上有一个项目叫速度检查 https gi
  • 在 Python 中从 Excel 复制 YEARFRAC() 函数

    因此 我使用 python 来自动执行一些必须在 Excel 中执行的重复任务 我需要做的计算之一需要使用yearfrac 这在Python中被复制了吗 I found this https lists oasis open org arc
  • 我可以用关闭的文件对象做什么?

    当您打开文件时 它存储在一个打开的文件对象中 该对象使您可以访问该文件的各种方法 例如读取或写入 gt gt gt f open file0 gt gt gt f
  • 在 django 中导入设置时出现奇怪的错误

    我有很多项目在 ubuntu 中使用 python2 7 和 virtualenv virtualenvwrapper 工作 在我的工作中 一些开发人员使用 macosx 和 windows 通常我像往常一样创建项目 django admi
  • 使用 ElementTree 在 python 中解析 xml

    我对 python 很陌生 我需要解析一些脏的 xml 文件 这些文件需要先清理 我有以下 python 代码 import arff import xml etree ElementTree import re totstring wit
  • 获取多个同名请求参数

    我的问题是给定的代码 from flask import Flask request app Flask name app route def hello return str request values get param None a
  • 数据损坏 C++ 和 Python 之间的管道

    我正在编写一些代码 从 Python 获取二进制数据 将其通过管道传输到 C 对数据进行一些处理 在本例中计算互信息度量 然后将结果通过管道传输回 Python 在测试时 我发现如果我发送的数据是一组尺寸小于 1500 X 1500 的 2
  • 将 Django 中的所有视图限制为经过身份验证的用户

    我是 Django 新手 我正在开发一个项目 该项目有一个登录页面作为其索引和一个注册页面 其余页面都必须仅限于登录用户 如果未经身份验证的用户尝试访问这些页面 则必须将他 她重定向到登录页面 我看到 login required装饰器会将
  • 如何将两列 pandas Dataframe 移动并堆叠为一列?

    我有一个下面提到的数据框 ETHNIC SEX USUBJID 0 HISPANIC OR LATINO F 16 1 HISPANIC OR LATINO M 8 2 HISPANIC OR LATINO Total 24 3 NOT H
  • AWS 将 MQTT 消息存储到 DynamoDB

    我构建了一个定期发送 MQTT 消息的 python 脚本 这是发送到后端的 JSON 字符串 Id 1234 Ut 1488395951 Temp 22 86 Rh 48 24 在后端 我想将 MQTT 消息存储到 DynamoDB 表中
  • PyQt5按钮lambda变量变成布尔值[重复]

    这个问题在这里已经有答案了 当我运行下面的代码时 它显示如下 为什么 x 不是 x 而是变成布尔值 这种情况仅发生在传递到用 lambda 调用的函数中的第一个参数上 错误的 y home me model some file from P
  • 如何有效地比较 pandas DataFrame 中的行?

    我有一个 pandas 数据框 其中包含雷击记录以及时间戳和全球位置 格式如下 Index Date Time Lat Lon Good fix 0 1 20160101 00 00 00 9962692 7 1961 60 7604 1
  • PyObjC + Python 3.0 问题

    默认情况下 Cocoa Python 应用程序使用默认的 Python 运行时版本 2 5 如何配置我的 Xcode 项目以便它使用较新的 Python 3 0 运行时 我尝试用新版本替换项目中包含的Python framework 但它不

随机推荐

  • iOS 10 应用程序终止时推送通知?

    升级到 iOS 10 后 我遇到了有关推送通知的问题 我使用的是 Swift3 在正常情况下 当应用程序打开或应用程序仍在后台时 一切正常 可以按照我的逻辑接收推送通知和更新数据 但是 当应用程序终止时 当应用程序变为活动状态时 我无法处理
  • 您将如何在多个类别之间共享随机值?

    我想创建一个随机 int 值以在多个类中使用 每次我创建这些类的一组新实例时 我都希望将这个新的随机 int 值用于所有这些实例 但随机值应该是相同的 简而言之 我希望创建一个随机索引 并在多个共同生成数据的类中使用该索引 这个随机值是否应
  • apache-spark 缓存()/持久()的内存消耗

    当我尝试缓存 或持久化 MEMORY ONLY SER 我的 RDD 时 我的 Spark 集群挂起 它运行良好 大约 7 分钟即可计算出结果 如果我不使用cache 我有 6 个 c3 xlarge EC2 实例 4 个核心 每个 7 5
  • 使用以下两个命令安装 docker 时有什么区别?

    当谈到在 centos 上安装 Docker 时 我发现了两种不同的方法 第一个是 yum install docker engine 第二个是 yum install docker io 如果我使用第一个安装了 docker 那么我继续使
  • 没有实体框架的 ASP.NET 身份

    是否可以在不使用实体框架的情况下使用新的 ASP NET Identity 而是使用您自己的方法 我有一个 MVC 项目 它使用普通的 ADO NET 进行数据访问 我想实现 ASP NET 身份 但我想继续使用 ADO NET 和存储过程
  • Grunt 多任务在构建时抛出 EISDIR 错误

    我正在尝试设置 grunt 来缩小 src 目录中的一些 js 文件并将它们复制到构建目录 继grunt 任务文档 https github com gruntjs grunt wiki Configuring tasks 我相信下面的配置
  • 如何将单元素列表转换为java 8可选

    如何很好地将包含一个或零个元素的列表转换为可选 丑陋的代码 List
  • 布尔读写在 Swift 中是否能保证原子性?

    假设我有一个应用程序正在从一个线程写入布尔值并从另一个线程读取相同的布尔值 我不在乎我的阅读线程是否读取过时的值 这在所有 ARM 内核和 x86 上安全吗 我不想遇到一个问题 即我的读取线程读取了部分写入的值 后续问题 哪些 swift
  • 阻止 geom_密度_ridges 显示不存在的尾部值

    当我使用geom density ridges 该图通常最终会显示数据中不存在的值的长尾 这是一个例子 library tidyverse library ggridges data lincoln weather Remove all n
  • 从 ASP.Net Core OData 项目中 Swashbuckle 生成的 Swagger 架构中排除某些模型

    我正在使用 Swashbuckle 为我的 ASP Net Core 3 1 OData 项目生成 Swagger 文档 控制器方法的生成是完美的 它基于模型正确生成模式 除了一件事 对于架构中的每个模型 它还会生成一个额外的 ModelN
  • 使用 Java 从二进制文件中读取整数值

    我正在尝试使用写入大于 256 的值DataOupPutStream write 方法 当我尝试使用读取相同的值时DataInputStream read 它将返回 0 所以 我用了DataOutputStream writeInt and
  • ASP.NET Core 的构建错误 - “...当前设置,将使用版本 2.1.0-preview3-26411-06”

    我使用创建了一个示例项目dotnet 但是在构建项目时出现以下错误 错误 项目已使用 Microsoft NETCore App 版本 2 1 0 rc1 恢复 但根据当前设置 将使用版本 2 1 0 preview3 26411 06 要
  • 本地化数据库字段中的邮政/实际地址显示

    谁能向我指出国际邮政 住宅 送货地址格式模板的列表 这些模板使用某种可解析的标准词汇作为地址部分 理想的列表包含一个国家 地区代码 然后是使用可替换标记的格式 以便我可以将数据库地址字段替换到模板中以生成可本地格式打印的内容 例如 NZ f
  • 如何将数据存储到android中的Secure Element中

    我想在 Android 中创建一个类似谷歌钱包的应用程序 据说 所有支付凭证都存储在一个名为安全元件包含在手机中 我如何访问它安全元件并将我的卡凭证存储到其中 我的目标是在收银台使用我的手机 Nexus 而不是我的卡 所以我想要的是将一些数
  • 更新和替换字符串的一部分

    我有一个有两列的表格 ID and Value 我想更改第二列中一些字符串的一部分 表格示例 ID Value 1 c temp 123 abc 111 2 c temp 123 abc 222 3 c temp 123 abc 333 4
  • 执行ContentResolver插入时出错

    执行插入新数据到内容提供程序时出错 请参见下面的代码 PS 我只是将下面的代码直接放入 Activity 的 onCreate 中 然后执行 ContentValues values new ContentValues values put
  • 谁定义了正则表达式?

    W3C 定义了 HTML 标准 CSS 标准和一些其他标准 我知道还有其他团体也定义了标准 谁定义了正则表达式的语法 正则表达式由多个标准机构涵盖 包括 IEEE 标准 1003 1 所谓的 Posix http pubs opengrou
  • 将 UTC 日期转换为日期时间字符串 Titanium

    我有一个日期字符串 2012 11 14T06 57 36 0000 我想转换为以下格式 2012 年 11 月 14 日 12 27 我尝试了很多解决方案 包括将 UTC 日期转换为日期时间字符串 Javascript https sta
  • 将随机排列代码从 MATLAB 移植到 Python

    如何将这段 MATLAB 代码转换为 Python 例如 对于随机文件 FileA rand 10 2 FileB randperm 10 for i 1 10 fileC FileB i 1 FileA i 1 for the x fil
  • PyQt QMediaPlayer setPosition 对位置值进行四舍五入

    我有一个应用程序 旨在帮助同步实验视频和数据信号 该应用程序有一个视频小部件和一个滑块 可以设置视频的时间位置 然而 QMediaPlayer 只会以 500 毫秒 1000 毫秒的间隔设置位置 在我的应用程序中为 500 毫秒 在设计的应