[PyQt] Access to QMediaStreamsControl

Phil Thompson phil at riverbankcomputing.com
Wed Apr 22 10:10:27 BST 2020


The current PyQt5 snapshot implements the missing multimedia control 
classes.

Phil

On 19/04/2020 21:13, Maurizio Berti wrote:
> The following code should work (taken from
> https://stackoverflow.com/a/61296171/2001654 ):
> 
> import os
> from PyQt5 import QtCore, QtWidgets, QtMultimedia, QtMultimediaWidgets
> import sip
> 
> class MainWindow(QtWidgets.QMainWindow):
>     def __init__(self, parent=None):
>         super(MainWindow, self).__init__(parent)
>         video_widget = QtMultimediaWidgets.QVideoWidget()
>         self.player = QtMultimedia.QMediaPlayer(
>             self, QtMultimedia.QMediaPlayer.VideoSurface
>         )
>         file = 
> os.path.join(os.path.dirname(os.path.realpath(__file__)),
> "test5.mkv")
>         self.player.setMedia(
>             QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile(file))
>         )
>         self.player.setVideoOutput(video_widget)
>         self.player.play()
>         self.setCentralWidget(video_widget)
> 
>         control = self.player.service().requestControl(
>             "org.qt-project.qt.mediastreamscontrol/5.0"
>         )
>         self.qcontrol = sip.cast(control, 
> QtMultimedia.QMediaStreamsControl)
>         self.resize(640, 480)
> 
>     def contextMenuEvent(self, event):
>         menu = QtWidgets.QMenu()
>         group = QtWidgets.QActionGroup(menu)
>         group.setExclusive(True)
>         index = 0
>         for i in range(self.qcontrol.streamCount()):
>             t = self.qcontrol.streamType(i)
>             if t == QtMultimedia.QMediaStreamsControl.AudioStream:
>                 action = menu.addAction("Audio-{}".format(index))
>                 action.setCheckable(True)
>                 if self.qcontrol.isActive(i):
>                     action.setChecked(True)
>                 action.setData(i)
>                 menu.addAction(action)
>                 index += 1
>         action = menu.exec_(self.mapToGlobal(event.pos()))
>         if action is not None:
>             i = action.data()
>             self.qcontrol.setActive(i, True)
> 
> 
> I tried the pyside alternative proposed in the link, but unfortunately 
> I'm
> unable to successfully load the file on PySide due to the following 
> error:
> ERROR: Caught a segmentation fault while loading plugin file:
> /usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgsttypefindfunctions.so
> 
> The same file correctly loads on PyQt5 (but obviously there's no
> QMediaStreamsControl), so I suppose there's some problem with my
> installation of PySide.
> 
> The sample (test5.mkv) is available in the Matroska test files:
> https://github.com/Matroska-Org/matroska-test-files
> 
> Thank you,
> Maurizio
> 
> Il giorno dom 19 apr 2020 alle ore 10:17 Phil Thompson <
> phil at riverbankcomputing.com> ha scritto:
> 
>> On 18/04/2020 19:06, Maurizio Berti wrote:
>> > Il giorno sab 18 apr 2020 alle ore 14:24 Phil Thompson <
>> > phil at riverbankcomputing.com> ha scritto:
>> >
>> >> When I don't understand an API properly then I tend to leave it until
>> >> somebody complains and then I've got someone more knowledgeable who I
>> >> can ask about it.
>> >>
>> >>  From what you say, all I need to do is to wrap the various
>> >> QMediaControl
>> >> sub-classes (all 39 of them). Is that right?
>> >>
>> >
>> > It seems like so, but honestly I'm not an expert, I don't know if that
>> > would be enough and, most importantly, I wouldn't be able to test it in
>> > the
>> > near future because I cannot update my current setups to newer PyQt
>> > releases at the moment.
>> >
>> > Right now at least I know that it doesn't work because it's not been
>> > implemented yet, but, of course, adding support for those classes could
>> > be
>> > a good thing, as I might be interested in using them in the future.
>> 
>> Any chance you can send me a short script that *should* work and a 
>> test
>> audio stream?
>> 
>> Phil
>> 



More information about the PyQt mailing list