Moustafa Mahmoud
Moustafa Mahmoud

Reputation: 151

How to wait until a sound file ends in vlc in Python 3.6

I have a question in vlc in python

import vlc

sound = vlc.MediaPlayer('sound.mp3')

sound.play()

# i wanna wait until the sound ends then do some code without 
time.sleep()

Upvotes: 6

Views: 12940

Answers (5)

Angry 84
Angry 84

Reputation: 2995

A slight alternative / method that i just tested and had good results (without needing to worry about the State.xxxx types.

This also allowed me to lower the overall wait/delay as i'm using TTS and found i would average 0.2 seconds before is_playing returns true

p = vlc.MediaPlayer(audio_url)
p.play()
while not p.is_playing():
    time.sleep(0.0025)
while p.is_playing():
    time.sleep(0.0025)

The above simply waits for the media to start playing and then for it to stop playing.

Note: I'm testing this via a URL / not a local file but was having the same issue and believe this will work the same.

Also fully aware its a slightly older and answered, but hopefully its of use to some.

Upvotes: 1

Moustafa Mahmoud
Moustafa Mahmoud

Reputation: 151

import time, vlc

def Sound(sound):
    vlc_instance = vlc.Instance()
    player = vlc_instance.media_player_new()
    media = vlc_instance.media_new(sound)
    player.set_media(media)
    player.play()
    time.sleep(1.5)
    duration = player.get_length() / 1000
    time.sleep(duration)

After edit

That exactly what I wanted, thanks everyone for helping me ..

Upvotes: 9

crifan
crifan

Reputation: 14328

for wait util end of vlc play sound, except your:

    player.play()
    time.sleep(1.5)
    duration = player.get_length() / 1000
    time.sleep(duration)

other possible (maybe more precise, but CPU costing) method is:


# your code ...

Ended = 6
current_state = player.get_state()
while current_state != Ended:
  current_state = player.get_state()
  # do sth you want
print("vlc play ended")

refer :

Upvotes: 3

ZF007
ZF007

Reputation: 3731

I.m.o. Flipbarak had it almost right. My version:

import vlc, time

vlc_instance = vlc.Instance()
song         = 'D:\\mozart.mp3'
player = vlc_instance.media_player_new()
media  = vlc_instance.media_new(song)

media.get_mrl()
player.set_media(media)

player.play()
playing = set([1])
time.sleep(1.5) # startup time.
duration = player.get_length() / 1000
mm, ss   = divmod(duration, 60)

print "Current song is : ", song, "Length:", "%02d:%02d" % (mm,ss)

time_left = True

# the while loop checks every x seconds if the song is finished.
while time_left == True:

    song_time = player.get_state()

    print 'song time to go: %s' % song_time

    if song_time not in playing:

        time_left = False

    time.sleep(1) # if 1, then delay is 1 second.

print 'Finished playing your song'

Upvotes: 0

filipbarak
filipbarak

Reputation: 1905

You can use the get_state method (see here: https://www.olivieraubert.net/vlc/python-ctypes/doc/) to check the state of the vlc player.

Something like

    vlc_instance = vlc.Instance()
    media = vlc_instance.media_new('sound.mp3')
    player = vlc_instance.media_player_new()
    player.set_media(media)
    player.play()
    print player.get_state()# Print player's state

Upvotes: 2

Related Questions