Games Bond
Games Bond

Reputation: 1

VLC Python Binding only playing the first mp4 file in the folder

I was trying to Play multiple small mp4 files that is in a folder. And i was using this example as my reference: https://github.com/oaubert/python-vlc/blob/master/generated/3.0/examples/play_buffer.py

But when i ran the py file giving that particular folder it read all of the files but closes after playing the first file. Can Someone Help me with this.

And i know i can just use a for loop to play all the files in a folder but i don't want any stutter between transitioning those files(Or in simple words i want seamless transition between those files). So any help would be appreciated.

Upvotes: 0

Views: 532

Answers (2)

Rolf of Saxony
Rolf of Saxony

Reputation: 22438

You have picked a complicated and arguably inappropriate code example for your scenario.
Try something like this (without 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")    

Here, we use a MediaListPlayer() rather than a media.player_new_from_media() or a media_player_new() because we are playing a set of media, not a single instance.
You can improve on this by controlling it via events using the event_manager() and attaching appropriate events for the player to listen for.

Upvotes: 0

mfkl
mfkl

Reputation: 2184

i don't want any stutter between transitioning those files

What you are looking for is called "gapless playback". Sadly, this is not currently supported by LibVLC.

Regardless, to play multiple individual files, you need to either feed them one after the other to the mediaplayer (by subscribing to the EndReached event, for example) or use a MediaList object.

Upvotes: 0

Related Questions