如何通过Python脚本控制VLC媒体播放器

4

我有一个想法,希望通过Python脚本控制媒体播放器,比如VLC,但由于我是新手,不知道如何实现。具体来说,我想从Python脚本中获取并设置VLC的音量值。我不需要整个代码,只需要一些提示和建议,先行谢过。

3个回答

7

安装 python-vlc

pip install python-vlc

只需更改路径,就可以继续进行了。

from vlc import Instance
import time
import os

class VLC:
    def __init__(self):
        self.Player = Instance('--loop')

    def addPlaylist(self):
        self.mediaList = self.Player.media_list_new()
        path = r"C:\Users\dell5567\Desktop\engsong"
        songs = os.listdir(path)
        for s in songs:
            self.mediaList.add_media(self.Player.media_new(os.path.join(path,s)))
        self.listPlayer = self.Player.media_list_player_new()
        self.listPlayer.set_media_list(self.mediaList)
    def play(self):
        self.listPlayer.play()
    def next(self):
        self.listPlayer.next()
    def pause(self):
        self.listPlayer.pause()
    def previous(self):
        self.listPlayer.previous()
    def stop(self):
        self.listPlayer.stop()

创建一个对象

player = VLC()

添加播放列表
player.addPlaylist()

播放这首歌曲。
player.play()
time.sleep(9)

播放下一首歌曲

player.next()
time.sleep(9)

暂停歌曲

player.pause()
time.sleep(9)

恢复播放歌曲

player.play()
time.sleep(9)

上一首歌
player.previous()
time.sleep(9)

停止歌曲

player.stop()

嗨!使用 sleep() 的意义是什么?谢谢! - beechovsky
没有什么特别的,只是让你了解每个命令的区别。 - Pramod

3

使用TCP套接字连接控制vlc比使用vlc-ctrl更好。我在树莓派上尝试了vlc-ctrl,但无法满足我的期望。因此,我决定从socket连接控制vlc播放器。

步骤:

1)你需要从命令提示符或shell中运行'vlc --intf rc --rc-host 127.0.0.1:44500'[启动vlc播放器],以启用tcp连接控制vlc播放器...你可以使用subprocess从python中这样启动vlc。

2)以下是我的示例脚本,用于从Python进行控制:


class player():
    def __init__(self):
        self.is_initiated = False
        self.SEEK_TIME = 20
        self.MAX_VOL = 512
        self.MIN_VOL = 0
        self.DEFAULT_VOL = 256
        self.VOL_STEP = 13
        self.current_vol = self.DEFAULT_VOL

    def toggle_play(self):
        if not self.is_initiated:
            self.is_initiated = True
            self.thrededreq("loop on")
            self.thrededreq("random on")
            self.thrededreq("add /home/pi/Desktop/Music")#adding the music folder
            print("Init Playing")
            return
        self.thrededreq("pause")
        print("Toggle play")


    def next(self):
        if not self.is_initiated:
            self.toggle_play()
            return
        self.thrededreq("next")
        print("Next")
        pass

    def prev(self):
        if not self.is_initiated:
            self.toggle_play()
            return
        self.thrededreq("prev")
        print("Previous")
        pass

    def volup(self):
        self.current_vol = self.current_vol + self.VOL_STEP
        self.thrededreq("volume " + str(self.current_vol))
        print("Volume up")
        pass

    def voldown(self):
        self.current_vol = self.current_vol - self.VOL_STEP
        self.thrededreq("volume " + str(self.current_vol))
        print("Volume Down")
        pass

    def seek(self, forward: bool):
        length = self._timeinfo("get_length")
        print(length)
        cur = self._timeinfo("get_time")
        print(cur)
        if (forward):
            seekable = cur + self.SEEK_TIME
        else:
            seekable = cur - self.SEEK_TIME
        if seekable > length:
            seekable = length - 5
        if seekable < 0:
            seekable = 0
        self.thrededreq("seek " + str(seekable))
        print("Seek: ",seekable," Cur: ",cur,"Len: ",length)
        pass

    def _timeinfo(self, msg):
        length = self.req(msg, True).split("\r\n")
        if (len(length) < 2):
            return None
        length = length[1].split(" ")
        if (len(length) < 2):
            return None
        try:
            num = int(length[1])
            return num
        except:
            return None

    def req(self, msg: str, full=False):
        try:
            with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
                # Connect to server and send data
                sock.settimeout(0.7)
                sock.connect(('127.0.0.1', 44500))
                response = ""
                received = ""
                sock.sendall(bytes(msg + '\n', "utf-8"))
                # if True:
                try:
                    while (True):
                        received = (sock.recv(1024)).decode()
                        response = response + received
                        if full:
                            b = response.count("\r\n")
                            if response.count("\r\n") > 1:
                                sock.close()
                                break
                        else:
                            if response.count("\r\n") > 0:
                                sock.close()
                                break
                except:
                    response = response + received
                    pass
                sock.close()
                return response
        except:
            return None
            pass

    def thrededreq(self, msg):
        Thread(target=self.req, args=(msg,)).start()

#'vlc --intf rc --rc-host 127.0.0.1:44500' you need to run the vlc player from command line to allo controlling it via TCP
Player=player()
player.toggle_play()
#player.next()
#player.prev()


如果你想要更多的命令和控制,使用"SocketTest"连接到VLC的端口并查看...
这个工具比"vlc-ctrl"有更多的控制选项。

好的,搞定了。1)添加了缺失的import socket。2)添加了import time并在代码结尾和操作之间使用了time.sleep(secs),因为该代码为每个发送的消息创建一个新的套接字。也许Windows无法处理太快创建套接字的情况?我本来想编辑代码的,但是SO说编辑队列已满。最后一件事,在Windows中,媒体/音乐的路径需要转义,即d:\\folder\\sub - Dude named Ben

1
你可以使用Python的vlc-ctrl模块来进行自动化。然后使用subprocess模块执行其命令。
1)通过pip安装vlc-ctrl
pip install vlc-ctrl

test.py:(增加音量)

import subprocess
subprocess.Popen(['vlc-ctrl',  'volume',  '+10%'])

使用以下命令运行代码:

python test.py

这里有关于 vlc-ctrl 模块的更多文档链接


非常感谢您,先生。我也会查看vlc-ctrl模块的文档。 - The Wolf
还有一个问题,其他视频播放器怎么样? - The Wolf
1
要控制其他视频播放器,您必须从https://pypi.org找到其Python包装器(如果有人编码),或在github上搜索相关的开源项目。但关键是查看任何媒体播放器提供的命令行选项。因为可以使用Python的subprocess模块处理任何媒体播放器的CLI以发出命令。 - Zaid Afzal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接