【问题标题】:How to play a numpy array in Qt without saving it to a file?如何在 Qt 中播放 numpy 数组而不将其保存到文件中?
【发布时间】:2020-12-02 20:27:06
【问题描述】:

QMediaPlayer 可用于播放音乐文件,即*.wav、*.mp3 等。但我可以用它播放数组中记录的波形吗?

从官方文档中发现QMediaPlayer::setMedia有一个参数stream。我想这个 API 可以用来播放数组中的音乐,但是,文档没有提供有关流格式或如何从波形数组构造流的更多详细信息。

(我们可以假设这个数组包含从 -1 到 1 的浮点值,并且采样率是一个已知变量。)

【问题讨论】:

  • 请提供minimal reproducible example。你能举个例子来说明你如何构建 numpy 数组
  • 一个数组记录了每次的波幅。数组的值范围从 [-1,1] 和音频采样率已知。
  • 你可以展示一个生成该 numpy 数组的代码
  • librosa.load(filename),或者简单的 np.random.rand(1000) *2 -1
  • 很好,但您最好解释一下格式([- 1, 1]、fs 等)并在您的帖子中显示该代码作为编辑。

标签: python pyqt pyqt5 qmediaplayer


【解决方案1】:

逻辑是将数组转换为具有某种 QtMultimedia 支持的格式(如 wav、mp3 等)的字节集,然后使用 QBuffer 作为这些字节的容器。

import io
import os

import librosa
from scipy.io import wavfile
from PyQt5 import QtCore, QtMultimedia

CURRENT_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)))


def main():
    app = QtCore.QCoreApplication([])

    filename = os.path.join(CURRENT_DIR, "sound.mp3")
    data, fs = librosa.load(filename)

    # convert arrat to bytes
    f = io.BytesIO()
    wavfile.write(f, fs, data)

    # copy the bytes to a QBuffer
    buf = QtCore.QBuffer()
    buf.setData(f.getvalue())
    buf.open(QtCore.QIODevice.ReadOnly)

    player = QtMultimedia.QMediaPlayer()
    player.setMedia(QtMultimedia.QMediaContent(), buf)

    def handle_state_changed(state):
        if state == QtMultimedia.QMediaPlayer.StoppedState:
            QtCore.QCoreApplication.quit()

    player.stateChanged.connect(handle_state_changed)
    player.play()

    app.exec_()


if __name__ == "__main__":
    main()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 2012-06-21
    相关资源
    最近更新 更多