Python - как я могу воспроизводить один и тот же звук несколько раз, не мешая друг другу?

Мне нужно создать программу, в которой аудиофайл будет воспроизводиться, и на полпути к продолжительности аудиофайла файл будет воспроизведен снова, но он не отключит тот, который еще не закончен, поэтому один и тот же файл будет воспроизводить два раз сразу, только с разным временем начала

Я пробовал использовать несколько библиотек, таких как pygame, winsound и pyglet, но, насколько я могу судить, ни одна из них не позволяет этого.

Изменить: я снова попытался использовать pygame, но это звучит неправильно. Я думаю, это из-за задержки с pygame

import pygame
import time
import threading

pygame.mixer.pre_init(frequency=44100)
pygame.mixer.init()

sound1 = pygame.mixer.Sound("Assets\\Blip.wav")
sound2 = pygame.mixer.Sound("Assets\\Blip.wav")
print(sound1.get_length())
half = 0.141/2

def play(ch,sound):
    pygame.mixer.Channel(ch).play(sound,loops=-1)

time.sleep(5)
t1 = threading.Thread(target=play,args=(0,sound1,))
t1.start()
time.sleep(half)
play(1,sound2,)

person Twingemios    schedule 06.12.2019    source источник
comment
потому что звук pygame использует потоки, поэтому я могу слышать два звука даже без использования Thread. Может, будет лучше, если ты не будешь использовать Thread. ИЛИ, возможно, это никогда не будет звучать хорошо, потому что вы ожидаете чего-то, чего нельзя сделать таким образом. Кстати: протестировано на Linux Mint 19.2, Python 3.7.5, PyGame 1.9.6   -  person furas    schedule 07.12.2019


Ответы (1)


simpleaudio поддерживает одновременное воспроизведение аудио. Мы используем pydub для легкого доступа к длине аудиосегмента (хотя вы можете получить то же самое из простого аудио с некоторыми усилиями. ). И pydub также может воспроизводить простой звук (что дает нам одновременное воспроизведение), используя pydub.playback._play_with_simpleaudio (), что упрощает код.

Вот рабочий пример. Я взял два разных аудиофайла, чтобы проверить / проиллюстрировать, что второй аудио сегмент начинается после того, как первый сделан наполовину.

#!/usr/local/bin/python3

from pydub import AudioSegment
from pydub.playback import _play_with_simpleaudio

import threading
import time

def play(sound):
    play_obj = _play_with_simpleaudio(sound)

sound1 = AudioSegment.from_wav("Audio_1.wav")
sound2 = AudioSegment.from_wav("Audio_2.wav")

half = sound1.duration_seconds /2
t1 = threading.Thread(target=play,args=(sound1,))
t1.start()
time.sleep(half)
play(sound2)
time.sleep(1)
person Anil_M    schedule 08.12.2019
comment
Я пробовал это, но два звука не перекрываются, они, кажется, перекрывают друг друга. - person Twingemios; 09.12.2019
comment
В моем случае два звука накладываются друг на друга. Я слышу два разных звука, играющих после того, как первый на полпути. Даже с одним и тем же файлом wav я слышу, как второй работает, пока играет первый. time.sleep будет контролировать продолжительность воспроизведения второго файла. который можно изменить на sound2.duration_seconds, чтобы 2-й файл воспроизводился полностью. Если нет, не могли бы вы подробнее рассказать о своих требованиях? - person Anil_M; 09.12.2019