Python VLC player.next() 控件

问题描述

我正在编写一个 JukeBox 程序,它根据组合键(A1、B2、C3 等)播放媒体。除了“media_player.next()”命令外,一切都按我期望的方式工作。

假设您要排队 3 首歌曲。如果你按下“y”键,它会像我期望的那样跳过这首歌。我的问题是,一旦播放到第 3 首歌曲,如果您再次点击“y”,它会回到第一首歌曲。我不想要那个。我希望“y”键带您在媒体列表中前进...如果这是媒体列表中的最后一首歌曲,请不要转到下一首歌曲。我怎么知道这是否是媒体列表中的最后一首歌曲,或者如何阻止 VLC 回到开头?

~/.local/lib/python3.5/site_packages/__pycache__

解决方法

正如我在评论中提到的,MediaListEndReached 似乎对我没有任何作用,因此运行 list 是解决问题的最简单方法,以下代码测试正在播放的项目的 list 位置并退出,如果 nextprevious 命令试图越过列表的末尾。
您只需跟踪索引变量即可获得相同的结果。
您可能需要调整 mrl 的拆分以匹配列表中的条目。

import vlc
import time

## pinched from vlc for keyboard input
import termios
import tty
import sys

mymedia = ["vp.mp3","vp1.mp3","happy.mp3"]

def getch():  # getchar(),getc(stdin)  #PYCHOK flake
    fd = sys.stdin.fileno()
    old = termios.tcgetattr(fd)
    try:
        tty.setraw(fd)
        ch = sys.stdin.read(1)
    finally:
        termios.tcsetattr(fd,termios.TCSADRAIN,old)
    return ch
## end pinched code

def jukebox():
    player.play_item_at_index(0)    
    m = player.get_media_player()
    print("Playing - ",m.get_media().get_mrl()) 
    while True:
        k = getch()

        if k == "n": #Next
            media = m.get_media()
            if media.get_mrl().rsplit("/",1)[1] == mymedia[-1]: #Next requested but already at the end
                break 
            player.next()
        if k == "p": #Previous
            media = m.get_media()
            if media.get_mrl().rsplit("/",1)[1] == mymedia[0]: #Previous requested but already at the beginning
                break 
            player.previous()
        if k == " ": #Pause
            player.pause()
        if k == "q": #Quit
            player.stop()
            return True
        time.sleep(0.1)
        state = player.get_state()
        print(state,m.get_media().get_mrl()) 

    print("End of list")

vlc_instance = vlc.Instance('--no-xlib --quiet ') # no-xlib for linux and quiet don't complain
player = vlc_instance.media_list_player_new()
Media = vlc_instance.media_list_new(mymedia)
player.set_media_list(Media)
print("Welcome to Jukebox")
print("Options - space = Play/Pause,n = Next,p = Previous,q = Quit")
print("Media",mymedia)

jukebox()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...