#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