Как изменить устройство вывода звука QMediaPlayer в PySide2/PyQt5Python

Программы на Python
Ответить
Anonymous
 Как изменить устройство вывода звука QMediaPlayer в PySide2/PyQt5

Сообщение Anonymous »

Как настроить вывод звука QMediaPlayer на определенный выход в Windows 7 и более поздних версиях?

Это было действительно легко в PySide (с использованием Phonon), но я не могу найти способ сделать это в PySide2.
Уже есть несколько связанных вопросов, например этот старый, но до сих пор не решенный вопрос, или этот, который спрашивает именно то, что я хочу.

Они оба есть в c++ и его сложно преобразовать в PySide2.

На второй вопрос отвечает этот код:
QMediaService *svc = player->service();
if (svc != nullptr)
{
QAudioOutputSelectorControl *out = qobject_cast
(svc->requestControl(QAudioOutputSelectorControl_iid));
if (out != nullptr)
{
out->setActiveOutput(this->ui->comboBox->currentText());
svc->releaseControl(out);
}
}

Еще один с попыткой преобразования Python тоже не сработал.
Я пытался преобразовать их в код Python, но результат не увенчался успехом.

Вот моя минимальная попытка:
import sys
from PySide2 import QtMultimedia
from PySide2.QtCore import QUrl, Qt
from PySide2.QtMultimedia import QMediaPlayer, QMediaContent
from PySide2.QtWidgets import (QPushButton, QSlider, QHBoxLayout, QVBoxLayout,
QFileDialog, QStyle, QApplication, QDialog, QComboBox)

class Window(QDialog):
def __init__(self):
super().__init__()

self.out_combo = QComboBox()
mode = QtMultimedia.QAudio.AudioOutput
devices = QtMultimedia.QAudioDeviceInfo.availableDevices(mode)
for item in [(dev.deviceName(), dev) for dev in devices]:
self.out_combo.addItem(item[0], item[1])
self.out_combo.currentIndexChanged.connect(self.out_device_changed)

openBtn = QPushButton('Open file')
openBtn.clicked.connect(self.open_file)

self.playBtn = QPushButton()
self.playBtn.setEnabled(False)
self.playBtn.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
self.playBtn.clicked.connect(self.play_file)

self.slider = QSlider(Qt.Horizontal)
self.slider.setRange(0, 0)
self.slider.sliderMoved.connect(self.set_position)

hor_layout = QHBoxLayout()
hor_layout.setContentsMargins(0, 0, 0, 0)
hor_layout.addWidget(openBtn)
hor_layout.addWidget(self.playBtn)
hor_layout.addWidget(self.slider)

ver_layout = QVBoxLayout()
ver_layout.addWidget(self.out_combo)
ver_layout.addLayout(hor_layout)

self.setLayout(ver_layout)

self.player = QMediaPlayer(None, QMediaPlayer.VideoSurface)

self.player.stateChanged.connect(self.mediastate_changed)
self.player.positionChanged.connect(self.position_changed)
self.player.durationChanged.connect(self.duration_changed)

self.show()

def open_file(self):
file_name, _ = QFileDialog.getOpenFileName(self, "Open file")
if file_name != '':
self.player.setMedia(QMediaContent(QUrl.fromLocalFile(file_name)))
# self.label.setText(basename(file_name))
self.playBtn.setEnabled(True)

def play_file(self):
if self.player.state() == QMediaPlayer.PlayingState:
self.player.pause()
else:
self.player.play()

def mediastate_changed(self, state):
if self.player.state() == QMediaPlayer.PlayingState:
self.playBtn.setIcon(self.style().standardIcon(QStyle.SP_MediaPause))
else:
self.playBtn.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))

def position_changed(self, position):
self.slider.setValue(position)

def duration_changed(self, duration):
self.slider.setRange(0, duration)

def set_position(self, position):
self.player.setPosition(position)

def out_device_changed(self, idx):
device = self.out_combo.itemData(idx)

service = self.player.service()
if service:
out = service.requestControl("org.qt-project.qt.mediastreamscontrol/5.0")
if out:
out.setActiveOutput(self.out_combo.currentText())
service.releaseControl(out)
else:
print("No output found!")

app = QApplication(sys.argv)
window = Window()
sys.exit(app.exec_())


Подробнее здесь: https://stackoverflow.com/questions/696 ... ide2-pyqt5
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»