2012-11-13 47 views
5

Tôi đang chơi xung quanh với việc xây dựng một kịch bản python mà chơi nhịp điệu giống như một máy trống. Tôi đã sử dụng PyGame để xử lý âm thanh. Tuy nhiên, tôi gặp phải sự chậm trễ đáng kể/không thể chấp nhận giữa việc gọi và nghe âm thanh thực tế.PyGame có độ trễ rất lớn với âm thanh phát

tôi dán đoạn mã sau vào trình biên dịch tương tác, và sau đó thực hiện dòng cuối cùng một lần nữa và một lần nữa:

import pygame 
pygame.mixer.init(frequency=22050, size=-16, channels=2, buffer=4096) 
s = pygame.mixer.Sound('snare.wav') 
s.play(loops=0, maxtime=0, fade_ms=0) 

Thời gian giữa nhập bách và nghe âm thanh bằng cách đoán tốt nhất của tôi xung quanh 400ms, và thực sự đáng chú ý và không thể chấp nhận. Độ trễ xấp xỉ giống như khi tôi nhấp vào nút phát trong VLC và chờ cho âm thanh phát.

Tôi đã thử trên cả Windows và Ubuntu với cùng một kết quả. Máy tính của tôi là một chút cũ, một Intel Core i3, 2.53GHz, nhưng tôi nghĩ rằng đây không phải là một vấn đề.

Tôi có thể làm gì về điều này?

Trong một vòng lặp:

Mã này cho thấy độ trễ tương tự.

for i in range(10): 
    print i 
    s.play(loops=0, maxtime=0, fade_ms=0) 
    sleep(2) 
+0

1) Có thể có sự chậm trễ trong thông dịch viên? Hãy thử 'raw_input(); s.play (vòng = 0, maxtime = 0, fade_ms = 0)', sau đó nhấn enter lần nữa. 2) Có bắt đầu bẫy ở đầu của tập tin âm thanh không? Nếu bạn mở tập tin trong Audacity, bao nhiêu thời gian là giữa bắt đầu và âm thanh thực tế? –

+0

1) Không có sự khác biệt. 2) Âm thanh thực tế bắt đầu ngay lập tức trong tệp sóng. Ngoài ra tôi đã thử với các tập tin sóng khác. –

+0

bạn có thể gửi một liên kết đến tập tin âm thanh, tôi muốn thử nghiệm điều này với máy của tôi –

Trả lời

8

Một giải pháp khả thi là để giảm kích thước bộ đệm (ví dụ 512):

import pygame 
pygame.mixer.init(frequency=22050, size=-16, channels=2, buffer=512) 
s = pygame.mixer.Sound('snare.wav') 
s.play(loops=0, maxtime=0, fade_ms=0) 
1

tôi đã cùng một vấn đề một vài phút trước, và có một giải pháp mà làm việc cho tôi trong This other thread

Dường như một vấn đề khởi tạo, pygame không nhận được bộ đệm tốt nếu bạn init pygame đầu tiên (hoặc người nào khác XD). Khởi tạo bộ trộn init() và pre_init() trước tiên, và thử nghiệm từ đó:

pygame.mixer.pre_init(44100, -16, 2, 512) 
pygame.mixer.init() 
pygame.init() 

Điều đó sẽ hoạt động :) Chúc bạn may mắn!

Các vấn đề liên quan