1

I can simply play a wav file from a file with the code below:

media = vlc.MediaPlayer('c.wav') media.audio_set_volume(50) media.play() 

How can I do the same with qrc resource file? I tried this code but doesn't seem to work:

mediafile = QFile(':/sounds/c.wav') media = vlc.Instance().media_player_new() media.set_media(mediafile) media.audio_set_volume(50) media.play() 

1 Answer 1

3

You need to use vlc.media_new_callbacks for this so that you can wrap the QFile and use its methods. Below is a demo script that shows how to implement that:

import sys, vlc from PyQt5.QtCore import QFile, QCoreApplication @vlc.CallbackDecorators.MediaOpenCb def open_cb(opaque, data, size): data.contents.value = opaque size.value = sys.maxsize return 0 @vlc.CallbackDecorators.MediaReadCb def read_cb(opaque, buffer, length): data = qfile.read(length) for index, char in enumerate(data): buffer[index] = char return len(data) @vlc.CallbackDecorators.MediaSeekCb def seek_cb(opaque, offset): qfile.seek(offset) return 0 @vlc.CallbackDecorators.MediaCloseCb def close_cb(opaque): qfile.close() if __name__ == '__main__': import time, signal signal.signal(signal.SIGINT, signal.SIG_DFL) print('Press Ctrl+C to Quit') player = vlc.Instance().media_player_new() qfile = QFile(sys.argv[1]) qfile.open(QFile.ReadOnly) player.set_media(vlc.Instance().media_new_callbacks( open_cb, read_cb, seek_cb, close_cb, None)) player.play() app = QCoreApplication(sys.argv) app.exec_() 

UPDATE:

It's somewhat tricky to get this working correctly in a more typical PyQt application, because the callbacks have to be static functions. Here is an extended example that shows how it can be done:

import sys, ctypes, vlc from PyQt5 import QtCore, QtWidgets class VLCPlayer(QtCore.QObject): def __init__(self, parent=None): super().__init__() self._player = vlc.Instance().media_player_new() @staticmethod @vlc.CallbackDecorators.MediaOpenCb def _open_cb(voidptr, data, size): data.contents.value = voidptr size.value = sys.maxsize return 0 @staticmethod @vlc.CallbackDecorators.MediaReadCb def _read_cb(voidptr, buffer, length): stream = ctypes.cast( voidptr, ctypes.POINTER(ctypes.py_object)).contents.value data = stream.read(length) for index, char in enumerate(data): buffer[index] = char return len(data) @staticmethod @vlc.CallbackDecorators.MediaSeekCb def _seek_cb(voidptr, offset): stream = ctypes.cast( voidptr, ctypes.POINTER(ctypes.py_object)).contents.value stream.seek(offset) return 0 @staticmethod @vlc.CallbackDecorators.MediaCloseCb def _close_cb(voidptr): stream = ctypes.cast( voidptr, ctypes.POINTER(ctypes.py_object)).contents.value stream.close() def play(self): self._player.play() def stop(self): self._player.stop() def load(self, path): file = QtCore.QFile(path) file.open(QtCore.QIODevice.ReadOnly) voidptr = ctypes.cast(ctypes.pointer( ctypes.py_object(file)), ctypes.c_void_p) self._player.set_media(vlc.Instance().media_new_callbacks( self._open_cb, self._read_cb, self._seek_cb, self._close_cb, voidptr)) class Window(QtWidgets.QWidget): def __init__(self): super().__init__() self.buttonPlay = QtWidgets.QPushButton('Play') self.buttonPlay.clicked.connect(self.handlePlay) self.buttonStop = QtWidgets.QPushButton('Stop') self.buttonStop.clicked.connect(self.handleStop) self.buttonOpen = QtWidgets.QPushButton('Open') self.buttonOpen.clicked.connect(self.handleOpen) layout = QtWidgets.QHBoxLayout(self) layout.addWidget(self.buttonOpen) layout.addWidget(self.buttonPlay) layout.addWidget(self.buttonStop) self.player = VLCPlayer(self) def handlePlay(self): self.player.play() def handleStop(self): self.player.stop() def handleOpen(self): path, ok = QtWidgets.QFileDialog.getOpenFileName( self, filter='Audio Files (*.wav)') if ok: self.player.load(path) if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) window = Window() window.setWindowTitle('VLC Player') window.setGeometry(600, 100, 200, 80) window.show() sys.exit(app.exec_()) 
Sign up to request clarification or add additional context in comments.

3 Comments

The Updated method worked, for me it's important to play under 1sec sounds (click sounds) in proper speed, but it seems too laggy compared with my first code
@MohammadFarahi Why on earth are you using vlc for that? If you just want to play short sounds, use QSound.
This application has to run on Raspberry Pi too, but it has issue with QSound

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.