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
相关产品推荐
相关产品推荐

