- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想用 QtMultimedia
播放声音.
在 QMediaPlayer
的情况下,我可以播放 mp3 文件,它是由 gTTS 制作的。
(我认为没关系,但我不喜欢文件保留,除非我执行删除它的代码。)
我用 gTTS 模块制作了一个 mp3 文件,我想直接用缓冲区播放声音。
看来我可以制作一个有效的对象,但是 QAudioOutput
不做任何事情。
我将 mp3 文件序列化到数据库中,并在我喜欢的时候获取它。
我的代码有什么不足?
这是我原始代码的摘录。
在我的原始代码中,缓冲区数据位于 Qt.UserRole + x 中,我可以随时获取它们。
播放列表由 QTableWidget
构成和 QTableWidgetItem。
from PySide2 import QtCore
from PySide2 import QtWidgets
from PySide2 import QtMultimedia
import os
import PySide2
import sys
dirname = os.path.dirname(PySide2.__file__)
plugin_path = os.path.join(dirname, 'plugins', 'platforms')
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = plugin_path
import gtts
def main():
if QtWidgets.QApplication.instance() is not None:
app = QtWidgets.QApplication.instance()
else:
app = QtWidgets.QApplication([])
widget = QtWidgets.QTableWidget()
widget.setColumnCount(2)
text = "hello"
lang = "en"
onsei = gtts.gTTS(text=text, lang=lang)
buf = QtCore.QBuffer()
buf.setOpenMode( QtCore.QIODevice.WriteOnly)
onsei.write_to_fp(buf)
buf.close()
if not widget.rowCount():
widget.setRowCount(1)
else:
widget.insertRow(1)
nitem = QtWidgets.QTableWidgetItem()
nitem.setText(str(widget.rowCount()))
item = QtWidgets.QTableWidgetItem()
item.setText("{0}_tts_lang_{1}.mp3".format(text, lang))
item.setData(QtCore.Qt.UserRole+1, buf.data())
variant = item.data(QtCore.Qt.UserRole+1)
format = QtMultimedia.QAudioFormat()
format.setSampleRate(8000)
format.setChannelCount(1)
format.setSampleSize(16)
format.setCodec("audio/pcm")
format.setByteOrder(QtMultimedia.QAudioFormat.LittleEndian)
format.setSampleType(QtMultimedia.QAudioFormat.UnSignedInt)
buf = QtCore.QBuffer()
buf.setData(variant)
buf.open(QtCore.QIODevice.ReadOnly)
buf.seek(0)
audio = QtMultimedia.QAudioOutput(format, app)
audio.setVolume(0.5)
audio.setBufferSize(buf.size())
audio.start(buf)
buf.close()
print(67)
# sys.exit(QtWidgets.QApplication.exec_())
sys.exit()
if __name__ == "__main__":
main()
最佳答案
您可以使用 QMediaPlayer,而不是使用 QAudioOutput:
import sys
import threading
import uuid
from PySide2 import QtCore, QtGui, QtWidgets, QtMultimedia
import gtts
IdentifierRole = QtCore.Qt.UserRole
DataRole = QtCore.Qt.UserRole + 1
DownLoadRole = QtCore.Qt.UserRole + 2
ActiveRole = QtCore.Qt.UserRole + 3
class BackgroundColorDelegate(QtWidgets.QStyledItemDelegate):
def initStyleOption(self, option, index):
super().initStyleOption(option, index)
color = None
if index.data(DownLoadRole):
color = QtGui.QColor("green")
if index.data(ActiveRole):
color = QtGui.QColor("red")
if color:
option.backgroundBrush = color
class DownLoader(QtCore.QObject):
downloaded = QtCore.Signal(str, QtCore.QByteArray)
def start(self, identifier, text, lang):
threading.Thread(
target=self._execute, args=(identifier, text, lang), daemon=True
).start()
def _execute(self, identifier, text, lang):
tts = gtts.gTTS(text=text, lang=lang)
buf = QtCore.QBuffer()
buf.open(QtCore.QBuffer.ReadWrite)
tts.write_to_fp(buf)
self.downloaded.emit(identifier, buf.data())
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.player = QtMultimedia.QMediaPlayer()
self.current_buff = QtCore.QBuffer()
self.tablewidget = QtWidgets.QTableWidget(
0,
2,
selectionBehavior=QtWidgets.QAbstractItemView.SelectRows,
editTriggers=QtWidgets.QAbstractItemView.NoEditTriggers,
)
delegate = BackgroundColorDelegate(self.tablewidget)
self.tablewidget.setItemDelegateForColumn(0, delegate)
self.tablewidget.itemClicked.connect(self.on_item_clicked)
self.setCentralWidget(self.tablewidget)
self.add_row("hello", "en")
self.add_row("world", "en")
def add_row(self, text, lang):
it = QtWidgets.QTableWidgetItem("{0}_tts_lang_{1}.mp3".format(text, lang))
identifier = str(uuid.uuid4())
it.setData(IdentifierRole, identifier)
downloader = DownLoader(self)
downloader.start(identifier, text, lang)
downloader.downloaded.connect(self.on_downloaded)
downloader.downloaded.connect(downloader.deleteLater)
row = self.tablewidget.rowCount()
self.tablewidget.insertRow(row)
self.tablewidget.setItem(row, 0, it)
@QtCore.Slot(str, QtCore.QByteArray)
def on_downloaded(self, identifier, data):
model = self.tablewidget.model()
indexes = model.match(
model.index(0, 0), IdentifierRole, identifier, flags=QtCore.Qt.MatchExactly
)
if indexes:
item = self.tablewidget.itemFromIndex(indexes[0])
item.setData(DataRole, data)
item.setData(DownLoadRole, True)
@QtCore.Slot("QTableWidgetItem*")
def on_item_clicked(self, item):
self.player.stop()
self.current_buff.close()
data = item.data(DataRole)
if not data:
return
self.current_buff.setData(data)
self.current_buff.open(QtCore.QIODevice.ReadOnly)
self.player.setMedia(QtMultimedia.QMediaContent(), self.current_buff)
self.player.play()
for row in range(self.tablewidget.rowCount()):
it = self.tablewidget.item(row, 0)
it.setData(ActiveRole, it is item)
def main():
app = QtWidgets.QApplication.instance()
if app is None:
app = QtWidgets.QApplication([])
w = MainWindow()
w.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
关于python - 直接使用 QtMultimedia.QAudioOutput 播放 gtts 缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61774855/
我已经使用 Qt creator for symbiyan mobile 构建了一个应用程序;现在,我正在尝试使用 Qt 将其转换为桌面应用程序。但是当我更改平台时,它显示 QtMultimedia
有些人似乎可以通过 PyQt5 使用 QtMultimedia。根据旧的 stackoverflow 帖子,它不包含在 PyQt5 中,所以有什么方法可以组合起来? 我正在使用 linux (ubun
我已经使用普通的 apt-get install 方法在 Raspberry Pi 3 上安装了 Qt 和 Qtcreator。一切似乎都工作正常,除了当我尝试构建声明式相机示例或其他多媒体示例时,我
我正在编写的 PyQt5 程序的一部分是接收音频流并播放它。我四处搜索,这是我发现的据说可以工作的代码: url = QtCore.QUrl.fromLocalFile('office theme.m
import QtQuick 2.6 import QtQuick.Controls 1.5 import QtQuick.Dialogs 1.2 import QtMultimedia 5.6 im
我只需要从运行在 Raspberry Pi 上的 QT 5.1 应用程序播放简单的音频 wav 或 mp3 文件。 我的控制台应用程序正在成功构建并部署到 pi。 但是,当我尝试播放文件时收到一条消息
嘿stackies目前正在尝试创建一些基本代码来播放来自本地源的视频文件(试图让它工作然后尝试实现rtsp)。下面是我当前的代码。如果有人能告诉我哪里出了问题,那就太好了。 当前代码因错误而失败 C:
我正在尝试构建一个集成视频的 GUI,为此我需要导入 PyQt5.QtMultimedia。然而,当尝试导入模块(导入 PyQt5.QtMultimedia)时,我收到一个错误:ModuleNotFo
我正在尝试使用 Qt5 和 CMake 编写一个 GUI 应用程序(在 Ubuntu 18.04 下)。我未能将 Qt 多媒体模块集成到我的项目中。 我的CMakeLists.txt: cmake_m
我需要播放一个自定义 AVI 文件,其中包含一个经典视频流、一个音频流还有一个自定义数据流。 自定义流包含由一些自定义小部件可视化的数据;这些小部件只需要在适当的时间将每个自定义框架写入缓冲区。 我们
我在 Ubuntu 12.04 中的 QtMultimedia 模块有一些问题。我在 /usr/include 中找不到它的开发文件.我应该为此安装额外的软件包吗?如果是,它的名字是什么? 注意:我从
我想用 QtMultimedia 播放声音. 在 QMediaPlayer 的情况下,我可以播放 mp3 文件,它是由 gTTS 制作的。 (我认为没关系,但我不喜欢文件保留,除非我执行删除它的代码。
我正在使用 mingw47 开发 Qt 5.0 dekstop 应用程序。我在此应用程序中使用 QtMultimedia 来录制和播放音频。我已经对它进行了调试测试,它可以工作。当我尝试为发布构建它并
我在我的应用程序中使用 QtMultimedia 模块。但是,以下代码在 Windows 中通过,但在 ubuntu 上失败。 #include #include 根据this questio
好吧,像我在教程中看到的那样,但我想保存为音乐播放器的一种可读格式。可能吗? file = new QFile("smth.raw"); file->open(QIODevice::WriteOn
有没有办法使用 QtMultimedia 访问存储在诺基亚 N950 手机上的 MP3 文件的 PCM 原始音频样本? 如果不可能,什么是合理的替代方案。可以相当容易地与现有 Qt 项目集成的东西。我
我正在尝试学习 PyQt5 + qml,到目前为止我尝试的一切都工作正常,但是当我尝试将 QtMultimedia 导入我的 qml 文件时遇到了问题,导致以下错误: plugin cannot be
我正在运行 Ubuntu 10.10,我成功安装了 Qt 4.7.3 SDK(使用 qt 在线安装程序,而不是从包中)并编译了 QtMobility 多媒体模块,所以我的小测试代码编译: QMedia
我的问题可能归结为“模块叫什么”。 我想在 Qt 5.4 中使用 QSound 类,显然“Qt5Multimedia”模块没有与 QtGui 一起引入,QtCore调用时 find_package(Q
我正在 Qt(5) 中开发一个应用程序,基本上我正在尝试使用 QtMultimedia5 将相同的视频源渲染到我窗口中的 2 个位置。我在 QML 中执行此操作,但如果有 C++ 中的解决方案,我会很
我是一名优秀的程序员,十分优秀!