- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 RAM 中有一个 QBuffer
,其中包含一个临时 wav 文件,我想让用户从任意位置收听它,想听多少次就听多少次。但是,它只允许播放一次,不允许重播。如果我播放文件 (QUrl.fromLocalFile
) 中的音频,它可以重播它。有什么不同?如何解决?
1) 要从 RAM 播放 wav 文件,我使用以下代码:
data = b""
with open(fname, "rb") as file:
data = file.read()
buf = QBuffer()
buf.setData(data) #For debugging. Real buffer is filled differently.
buf.open(QIODevice.ReadOnly);
self.mediaPlayer=QMediaPlayer(self)
self.mediaPlayer.setMedia(QMediaContent(),buf)
然后,如果我调用 self.mediaplayer.play()
,它将播放文件到最后。但是,所有后续调用 self.mediaplayer.play()
都没有效果。这不是我想要的。
2)如果我从文件初始化媒体播放器,则:
self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile("/home/me/myTestApp/test.wav")))
它工作正常 - 如果我在上一次播放结束后调用play()
,QMediaPlayer只会重复播放。
最佳答案
一个QBuffer是一个 io 设备 - 一旦你读取了它,你需要重置它的位置才能再次读取它。因此,在您的代码中,您需要执行以下操作:
...
self._buffer = buf
self.mediaPlayer=QMediaPlayer(self)
self.mediaPlayer.setMedia(QMediaContent(), self._buffer)
def play(self):
self._buffer.seek(0)
self.mediaPlayer.play()
编辑:
经过一些实际测试,我发现只需要保留对缓冲区的引用即可重放音频。下面的脚本是一个完整的示例,对我来说效果很好(在 Linux 上,使用 GStreamer 后端):
import sys
from PyQt5 import QtCore, QtWidgets, QtMultimedia
class Window(QtWidgets.QWidget):
def __init__(self):
super(Window, self).__init__()
self.buttonOpen = QtWidgets.QPushButton('Open', self)
self.buttonOpen.clicked.connect(self.handleOpen)
self.buttonPlay = QtWidgets.QPushButton('Play', self)
self.buttonPlay.clicked.connect(self.handlePlay)
layout = QtWidgets.QHBoxLayout(self)
layout.addWidget(self.buttonOpen)
layout.addWidget(self.buttonPlay)
self.mediaPlayer = QtMultimedia.QMediaPlayer(self)
self._buffer = QtCore.QBuffer()
def handlePlay(self):
if self.buttonPlay.text() == 'Play':
self.buttonPlay.setText('Stop')
# self._buffer.seek(0)
self.mediaPlayer.play()
else:
self.buttonPlay.setText('Play')
self.mediaPlayer.stop()
def handleOpen(self):
path, ok = QtWidgets.QFileDialog.getOpenFileName(
self, filter='WAV Files (*.wav)')
if ok:
self._buffer.close()
with open(path, 'rb') as stream:
self._buffer.setData(stream.read())
if self._buffer.open(QtCore.QIODevice.ReadOnly):
self.mediaPlayer.setMedia(
QtMultimedia.QMediaContent(), self._buffer)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = Window()
window.setGeometry(600, 100, 200, 50)
window.show()
sys.exit(app.exec_())
关于python - PyQt5 : QMediaPlayer can't replay audio from QBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46837491/
我正在编写一个 PyQt5 应用程序,但我认为这个问题对于 PySide2 和 Qt 也有效。我正在尝试将声音数据(sinuosids)写入缓冲区,然后在无缝循环中播放。但是,当我到达缓冲区末尾并返回
嗨,我认为 QMovie 可以采用 QBuffer 吗?这是我的代码。 a = QByteArray(img) b = QBuffer(a) self.movie = QMovie(b, 'GIF')
我正在编写一个 Qt (4.6) 应用程序,负责从 usb acm 调制解调器设备读取数据。从设备中读取原始二进制和 (ascii) 字符数据的混合。我有一个线程负责在数据可用时不断地将数据从设备读取
我正在尝试通过QTextStream 重复写入/读取QBuffer 对象。首先我构造两个对象: QBuffer b; b.open(QIODevice::ReadWrite); QTextStream
我正在做这样的事情: QImage image(width, height, QImage::Format_RGB32); frame.fill(QColor(255, 255, 255).rgb()
我正在寻找在 C++ Qt5.6 中从 void * data 和 long data_size 创建 QBuffer 的最简单和优雅的方法。 我尝试将 void 转换为 char 指针并使用 QBy
我在 RAM 中有一个 QBuffer ,其中包含一个临时 wav 文件,我想让用户从任意位置收听它,想听多少次就听多少次。但是,它只允许播放一次,不允许重播。如果我播放文件 (QUrl.fromLo
我的目标是创建一个 numpy 数组并将其字节数据转换为 QBuffer。我想知道如何正确设置 DataSize、ByteStride 和 Count。请参阅下面的代码: self.mesh = Qt
使用我现在拥有的代码,我可以成功地播放文件中的 .mp3 数据。但是我需要使用 QtCore.QBuffer(不是来自文件)播放相同的数据。当我使用文档的示例时,它会出现意外类型的 QBuffer 错
我是一名优秀的程序员,十分优秀!