Как создать несколько проигрывателей с помощью Python VLC и установить на них разные тома?

#python #audio #vlc #audio-player #python-vlc

#python #Аудио #vlc #Аудиоплеер #python-vlc

Вопрос:

Я пытаюсь смешать две песни в формате .mp3, просто изменив громкость двух песен, подобно диджейству. Однако, когда я устанавливаю громкость проигрывателя, громкость обоих проигрывателей изменяется на значение, которое я установил последним. Я хотел бы создать два отдельных проигрывателя с разными свойствами громкости, например, чтобы один проигрыватель имел громкость (100), а другой — громкость (20). Вот как я это делаю:

 import vlc
import time

# Path for mp3 file
song = 'C:/Users/Admin/Desktop/Projects/Music Shit/Martin Garrix - Animals (Original Mix).mp3'

# Set up and play player with volume 100
player = vlc.MediaPlayer(song)
media = vlc.Media(song)
player.set_media(media)
player.audio_set_volume(100)
player.play()

# Path for second mp3 file
song2 = 'C:/Users/Admin/Desktop/Projects/Music Shit/Tremor (Sensation 2014 Anthem).mp3'

# Set up and play second player with volume 20
player2 = vlc.MediaPlayer(song2)
media2 = vlc.Media(song2)
player2.set_media(media2)
player2.audio_set_volume(20)
player2.play()
 

Когда я запускаю это, обе песни воспроизводятся на громкости 20, что нежелательно. Я считаю, что они связаны с одним проигрывателем, чего я не хочу. Я бы хотел иметь два отдельных проигрывателя с разными томами.

Кстати, когда я попробовал это на Mac, это сработало, и звук имел разную громкость, но в настоящее время я на Windows, и он не работает. Кажется странным!

Любая помощь будет высоко оценена. Я впервые задаю вопрос!

Ответ №1:

Я нашел эту проблему действительно интересной, поэтому я загрузил модуль vlc python и поработал с ним, и я думаю, что нашел решение для вас.

Я создал массив, содержащий экземпляры VLC, я создал функцию, которая создает экземпляры VLC, и цикл, который проверяет, что они запущены (и выдает подробный вывод).

Для этого необходимо убедиться, что ваш VLC-проигрыватель поддерживает несколько экземпляров window.

Мой код:

 import vlc
import time

VLCObjects = []

def VLCInstance(src, volume):
    
    # creating vlc media player object 
    try:
        vlc_instance = vlc.Instance() 
        player = vlc_instance.media_player_new() 
        media = vlc_instance.media_new(src)
        player.set_media(media)
    except:
        return("Error: Was unable to mount media")
    else:
        pass
    
    VLCObjects.append(player)

    VLCObjects[0].audio_set_volume(volume) 
    VLCObjects[0].play() 

    # give time to initialize, then get length of audio amp; wait until done playing
    time.sleep(1) 
    duration = VLCObjects[0].get_length() 
    #time.sleep(duration)
    return("Success: Song playing")
 

Затем вы должны выполнить все свои вызовы или что-то еще здесь, а затем цикл:

 song1 = ...
song2 = ...
VLCInstance(song1, 100)
VLCInstance(song2, 20)
 
 while(True):

    playing = False
    
    time.sleep(1) 
    
    print(VLCObjects)
    for x in range(0, len(VLCObjects) ):
        value = VLCObjects[x].is_playing()

        if value == True:
            print("... VLCObject #%d is playing" % x)
            playing = True
            
        else:
            print("... VLCObject #%d needed to be restarted" % x)
            VLCObjects[x].play()
            
    if playing == False:
        break
 

Результирующий результат будет выглядеть примерно так, и будет два неоконных проигрывателя VLC.

 Success: Song playing
Success: Song playing
[<vlc.MediaPlayer object at 0x7fa56d271520>, <vlc.MediaPlayer object at 0x7fa56d271cd0>]
... VLCObject #0 is playing
0
0
[<vlc.MediaPlayer object at 0x7fa56d271520>, <vlc.MediaPlayer object at 0x7fa56d271cd0>]
... VLCObject #0 is playing
... VLCObject #1 is playing
[<vlc.MediaPlayer object at 0x7fa56d271520>, <vlc.MediaPlayer object at 0x7fa56d271cd0>]
... VLCObject #0 is playing
... VLCObject #1 is playing
[<vlc.MediaPlayer object at 0x7fa56d271520>, <vlc.MediaPlayer object at 0x7fa56d271cd0>]
... VLCObject #0 is playing
... VLCObject #1 is playing
[<vlc.MediaPlayer object at 0x7fa56d271520>, <vlc.MediaPlayer object at 0x7fa56d271cd0>]
... VLCObject #0 is playing
... VLCObject #1 is playing
[<vlc.MediaPlayer object at 0x7fa56d271520>, <vlc.MediaPlayer object at 0x7fa56d271cd0>]
... VLCObject #0 is playing
... VLCObject #1 is playing
[<vlc.MediaPlayer object at 0x7fa56d271520>, <vlc.MediaPlayer object at 0x7fa56d271cd0>]
... VLCObject #0 is playing
... VLCObject #1 is playing
[<vlc.MediaPlayer object at 0x7fa56d271520>, <vlc.MediaPlayer object at 0x7fa56d271cd0>]
... VLCObject #0 is playing
... VLCObject #1 is playing
[<vlc.MediaPlayer object at 0x7fa56d271520>, <vlc.MediaPlayer object at 0x7fa56d271cd0>]
... VLCObject #0 is playing
... VLCObject #1 is playing
[<vlc.MediaPlayer object at 0x7fa56d271520>, <vlc.MediaPlayer object at 0x7fa56d271cd0>]
... VLCObject #0 is playing
... VLCObject #1 is playing
 

Комментарии:

1. К сожалению, это не помогло мне. Когда я вызываю song2 с громкостью (20), обе дорожки установили громкость на 20. Я на Windows 7 с Python 3.8.5. Странно, что у меня это нормально работало на Mac. Вы знаете, в чем проблема?

2. Я не уверен, в чем проблема, с которой вы столкнулись, но я бы попробовал добавить второй if, else блок в while цикл, чтобы проверить, соответствует ли громкость тому, что было изначально вызвано. Вам просто понадобится другой массив, возможно VLCVolumes , в начале, и для сохранения значения при вызове VLCInstance функции. Я надеюсь, что это решит проблему для вас!

3. Я использую Linux Mint 20 (Cinnamon 4.6.6) на ноутбуке Samsung, также работает 3.8.5

Ответ №2:

Вариант темы с использованием нескольких экземпляров vlc.Instance — это путь.

 import vlc
import time

files = ['./V2.mp4','./vp1.mp3','./V3.mp4'] 
instances = []
medias = []
players = []


for idx, fname in enumerate(files):
    print("Loading",fname)
    instances.append(vlc.Instance())
    medias.append(instances[idx].media_new(fname))
    time.sleep(1) # used solely to gauge the difference in volumes
    players.append(vlc.MediaPlayer())
    players[idx].set_media(medias[idx])
    players[idx].play() 

players[1].audio_set_volume(120)
players[2].audio_set_volume(80)
player_count = players # copy of the players list so we don't modify during iteration
still_playing = True
time.sleep(0.5) # Wait for players to start

while still_playing:
    time.sleep(1)
    for p in players:
        if p.is_playing():
            continue
        else:
            player_count.remove(p)
            players = player_count # no point iterating over players that have finished
            print("Finished - Still playing ", str(len(player_count)))

    if len(player_count) != 0:
        continue
    else:
        still_playing = False