You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySide6中IODevice::read无法读取输入设备实时音频数据问题

问题描述

这段代码用于响应输入设备传来的新音频数据,但从输出结果可见,IODevice::read方法无法获取任何有效数据。尝试过多种方案,比如使用audio_source.start()返回的IODevice;当前采用QBuffer搭配QByteArray的版本能看到有数据写入,但无法通过常规方式读取,无法查明read方法失效的原因。

代码实现
from PySide6.QtCore import (Qt, QDir, QUrl, QBuffer, QByteArray, QFile, 
                            QObject, Slot, Signal, QTimer, QIODevice, QUrl,
                            QMicrophonePermission, QPermission)
from PySide6.QtMultimedia import (
    QMediaCaptureSession,
    QAudioInput,
    QMediaRecorder,
    QMediaFormat,

    QAudioDecoder,
    QAudioSource,
    QAudioDevice,
    QAudioBuffer,
    QMediaDevices,
    QAudioFormat,
    QAudioSink,
    QSoundEffect,
    QAudio,

)
from PySide6.QtWidgets import QApplication, QPushButton
from pathlib import Path
import os
import sys
from typing import Optional



class AudioDecoder(QObject):
    stateChanged = Signal() # add arg
    newData = Signal(QByteArray, QAudioFormat)

    def __init__(self,
                format: Optional[QAudioFormat],
                source_device: Optional[QAudioDevice],
                parent: Optional[QObject] =None,
                ) -> None:
        super().__init__(parent=parent)
        if not format:
            self.format = source_device.preferredFormat()
        else:
            self.format = format

        if not source_device.isFormatSupported(self.format):
            raise Exception("format not supported")

        self.audio_source = QAudioSource(source_device, self.format, parent=self)

        self.data_arr = QByteArray(10000, 0)
        self.input_buf = QBuffer(self.data_arr)

    def check_permissions(self, app: QApplication):
        microphonePermission=QMicrophonePermission()
        micPermissionStatus = app.checkPermission(microphonePermission)
        if micPermissionStatus == Qt.PermissionStatus.Undetermined:
            app.requestPermission(microphonePermission, self, self.check_permissions)

    def start(self):
        self.input_buf.open(QIODevice.OpenModeFlag.ReadWrite)
        self.audio_source.start(self.input_buf)
        def _newDataArrived(io=self.input_buf):
            #data = self.input_buf.read(chunkLen)
            print(f" Pos  {io.pos()}",  )
            bytearray = QByteArray(4096, 0)
            io.read(bytearray, 4096)
            print(bytearray.size())
            print(bytearray.data()[:10])
            print(self.data_arr.data()[-10:])

        self.input_buf.readyRead.connect(_newDataArrived)

        
def main():
    app = QApplication([])


    microphonePermission=QMicrophonePermission()
    micPermissionStatus = app.checkPermission(microphonePermission)
    if micPermissionStatus == Qt.PermissionStatus.Undetermined:
        app.requestPermission(microphonePermission, app, None)

    audioInputDevice = QMediaDevices.defaultAudioInput()
    audioOutputDevice = QMediaDevices.defaultAudioOutput()

    ad = AudioDecoder(format=None, source_device=audioInputDevice, parent=app)
    ad.start()

    sys.exit(app.exec())


if __name__ == "__main__":
    main()
输出结果
4096
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
 Pos  12288
4096
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'Y7~\x84\xfc6\x8f^\x157'
 Pos  16384
4096
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x889\xd6$\xa39\xed\x05\xa59'
 Pos  20480
4096
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x9f\xb9\x84\xea\xa1\xb9\x97y\x85\xb9'
 Pos  24576
4096
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\xf2\xb9\x0cY\x00\xba\xa6\xa6\x0f\xba'

内容的提问来源于stack exchange,提问作者Michal Kurtys

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 14:35:19