0

我试图播放文件夹中的多个小 mp4 文件。我使用这个例子作为我的参考: https ://github.com/oaubert/python-vlc/blob/master/generated/3.0/examples/play_buffer.py

但是当我运行 py 文件时,它会读取所有文件,但在播放第一个文件后会关闭该特定文件夹。有人可以帮我弄这个吗。

而且我知道我可以使用 for 循环来播放文件夹中的所有文件,但我不希望在转换这些文件之间出现任何口吃(或者简单地说,我希望在这些文件之间进行无缝转换)。所以任何帮助将不胜感激。

4

2 回答 2

0

您为您的场景选择了一个复杂且可能不合适的代码示例。
尝试这样的事情(没有 ctypes):

import vlc
import glob
import time

base_folder = './'
# vlc State 0: Nowt, 1 Opening, 2 Buffering, 3 Playing, 4 Paused, 5 Stopped, 6 Ended, 7 Error
playing = set([1,2,3,4])

def add_media(inst, media_list, playlist):
    for song in playlist:
        print('Loading: - {0}'.format(song))
        media = inst.media_new(song)    
        media_list.add_media(media)
        
playlist = glob.glob(base_folder + "/" + "*.mp3")
playlist = sorted(playlist)
media_player = vlc.MediaListPlayer()
inst = vlc.Instance('--no-xlib --quiet ') 
media_list = vlc.MediaList()
add_media(inst, media_list, playlist)

media_player.set_media_list(media_list)
media_player.play()
time.sleep(0.1)
current = ""
idx = 1
player = media_player.get_media_player()
while True:
    state = player.get_state()
    if state.value == vlc.State.Ended or state == vlc.State.Error:
        if idx == len(playlist)+1:
            break
    title = player.get_media().get_mrl()
    if title != current:
        print("\nPlaying - {0}\t{1} of {2}".format(str(title), idx, len(playlist)))
        current = title
        idx += 1
    time.sleep(0.1)
print("\nPlaylist Finished")    

在这里,我们使用 aMediaListPlayer()而不是 amedia.player_new_from_media()或 amedia_player_new()因为我们正在播放一组媒体,而不是单个实例。
您可以通过events使用适合播放器收听的event_manager()和附加来控制它来改进这一点。events

于 2022-01-14T11:21:23.573 回答
0

我不想在转换这些文件之间出现任何口吃

您正在寻找的是所谓的“无缝播放”。遗憾的是,LibVLC 目前不支持此功能。

无论如何,要播放多个单独的文件,您需要将它们一个接一个地提供给媒体播放器(例如,通过订阅 EndReached 事件)或使用 MediaList 对象。

于 2022-01-12T08:13:52.043 回答