我试图创建一个油门踏板和RPM排序的应用程序。UI由充当油门踏板的滑块和充当RPM值的滑块值组成。我有两个音频,分别是EXHAUST_ACCEL和EXHAUST_DECEL。目前,我已经编写了代码,当滑块增加时,它会检测到并播放EXHAUST_ACCEL。当滑块减少它时,它播放EXHAUST_DECEL。
音频被分解为9000个部分,因为滑块的范围为9000。
问题是当我移动滑块时,它应该播放指定滑块位置的音频部分。例如,当滑块位于4500时,它应该一遍又一遍地播放4500处的音频部分,直到我移动到下一部分。当我滑动滑块时,它应该顺利地开始播放以下音频部分。相反,每当我移动滑块时,它就会从头开始播放音轨。
我想让它发挥作用的两个主要因素是
1.当滑块处于停滞位置时,它应该一遍又一遍地播放该位置的音频部分,直到滑块移动为止
1.正在播放的音频部分应该由音频位置确定。
我的目标是尝试和模仿如何油门踏板,转速和排气声工程和链接在一起,在真实的生活中
音频文件在此Google Drive链接中:https://drive.google.com/drive/folders/1qTt808TNdIeNPXVOS2lBvhdlJvTVB3dC?usp=sharing
代码如下:
import tkinter as tk
from tkinter import ttk
import pygame
# Initialize pygame
pygame.init()
# Set up the window
window = tk.Tk()
window.title("Slider UI")
window.geometry("400x200")
# Load the audio files
accel_sound = pygame.mixer.Sound("EXHAUST_ACCEL.wav")
decel_sound = pygame.mixer.Sound("EXHAUST_DECEL.wav")
# Calculate the number of audio parts
total_parts = 9000
# Calculate the duration of each audio part
part_duration = accel_sound.get_length() / total_parts
# Initialize the slider value and audio time
slider_value = tk.StringVar()
audio_time = 0
# Create a label to display the slider value
value_label = ttk.Label(window, textvariable=slider_value)
value_label.pack()
# Create the slider
slider = ttk.Scale(window, from_=0, to=total_parts, orient="horizontal", length=300)
slider.pack()
# Function to handle slider movements
def slider_moved(event):
global audio_time
# Get the slider value
slider_value = int(slider.get())
# Calculate the new audio time based on the slider value
new_audio_time = (slider_value / total_parts) * accel_sound.get_length()
# Play the appropriate audio file and update the audio time
if new_audio_time > audio_time:
print("This is increasing")
if pygame.mixer.Channel(0).get_sound() != accel_sound:
pygame.mixer.Channel(0).play(accel_sound, fade_ms=200)
elif new_audio_time < audio_time:
print("This is decreasing")
if pygame.mixer.Channel(0).get_sound() != decel_sound:
pygame.mixer.Channel(0).play(decel_sound, fade_ms=200)
audio_time = new_audio_time
# Update the slider position
update_slider_position()
# Function to update the slider position based on the audio time
def update_slider_position():
slider.set((audio_time / accel_sound.get_length()) * total_parts)
slider_value.set(f"Slider Value: {slider.get()}")
# Bind the slider movement to the slider_moved function
slider.bind("<B1-Motion>", slider_moved)
# Start the main loop
window.mainloop()
1条答案
按热度按时间bksxznpy1#
代码的当前实现总是在更改滑块位置时从头开始播放声音。问题的根源在于pygame.mixer.Sound.play()方法没有从特定位置开始播放的选项。
然而,pygame.mixer.music模块用于流播放(非常适合长音频文件),它确实有pygame.mixer.music.play(start)方法,该方法接受一个start参数,该参数指示播放应从音乐开始的秒数。
您可以重构代码以使用pygame.mixer.music而不是pygame.mixer.Sound和pygame.mixer.Channel,然后在调用www.example.com()时将start参数设置为new_audio_timepygame.mixer.music.play。这将允许您从与滑块值对应的正确位置启动音频。
此外,若要在滑块不移动时重复播放同一段音频,您可能需要设置一个计时器,使其每隔part_duration秒从new_audio_time重新开始播放。确保在滑块再次开始移动时取消计时器。