2010-09-03 11 views
10

Đoạn mã sau viết một sin đơn giản ở tần số 400Hz vào một tệp WAV đơn âm. Mã này nên được thay đổi như thế nào để tạo ra một tệp WAV stereo. Kênh thứ hai phải ở tần số khác.Cách ghi tệp wav stereo bằng Python?

import math 
import wave 
import struct 

freq = 440.0 
data_size = 40000 
fname = "WaveTest.wav" 
frate = 11025.0 # framerate as a float 
amp = 64000.0  # multiplier for amplitude 

sine_list_x = [] 
for x in range(data_size): 
    sine_list_x.append(math.sin(2*math.pi*freq*(x/frate))) 

wav_file = wave.open(fname, "w") 

nchannels = 1 
sampwidth = 2 
framerate = int(frate) 
nframes = data_size 
comptype = "NONE" 
compname = "not compressed" 

wav_file.setparams((nchannels, sampwidth, framerate, nframes, 
    comptype, compname)) 

for s in sine_list_x: 
    # write the audio frames to file 
    wav_file.writeframes(struct.pack('h', int(s*amp/2))) 

wav_file.close() 
+1

Đặt 'nchannels = 2' để bắt đầu;) – ChrisF

Trả lời

9

xây dựng một danh sách sine_list_y song song với tần số/kênh khác, thiết lập nchannels=2, và trong việc sử dụng vòng lặp đầu ra for s, t in zip(sine_list_x, sine_list_y): như mệnh đề tiêu đề, và một cơ thể với hai writeframes cuộc gọi - một cho s, một cho t . IOW, khung tương ứng cho hai kênh "thay thế" trong tệp.

Xem ví dụ: this trang cho một mô tả kỹ lưỡng tất cả các định dạng tập tin WAV có thể, và tôi trích dẫn:

đa kênh mẫu âm thanh kỹ thuật số được lưu trữ dưới dạng dữ liệu sóng chằng chịt mà chỉ đơn giản có nghĩa là âm thanh mẫu của một kênh đa (chẳng hạn như tệp sóng âm thanh nổi và vòm) được lưu trữ bằng cách đi xe đạp qua âm thanh mẫu cho mỗi kênh trước chuyển tiếp đến thời gian lấy mẫu tiếp theo. Điều này được thực hiện sao cho các tệp âm thanh có thể phát hoặc phát trực tiếp trước khi có thể đọc toàn bộ tệp tin . Đây là tiện ích khi phát tệp lớn từ đĩa (có thể không hoàn toàn khớp với bộ nhớ ) hoặc phát trực tuyến tệp qua Internet . Các giá trị trong biểu đồ bên dưới sẽ được lưu trữ trong tệp Wave theo thứ tự chúng được liệt kê trong cột Giá trị (từ trên xuống dưới).

và bảng sau rõ ràng cho thấy các mẫu của các kênh truyền hình sang trái, phải, trái, phải, ...

+5

Cá nhân tôi thấy chúng đi ↑ ↑ ↓ ↓ ← → ← → B A, nhưng đó có thể chỉ là tôi. –

3

Đối với một ví dụ tạo ra một tập tin âm thanh stereo .wav, xem test_wave.py module. Bài kiểm tra tạo ra một tập tin khác 0. Bạn có thể sửa đổi bằng cách chèn các giá trị mẫu xen kẽ.

nchannels = 2 
sampwidth = 2 
framerate = 8000 
nframes = 100 

# ... 

    def test_it(self): 
     self.f = wave.open(TESTFN, 'wb') 
     self.f.setnchannels(nchannels) 
     self.f.setsampwidth(sampwidth) 
     self.f.setframerate(framerate) 
     self.f.setnframes(nframes) 
     output = '\0' * nframes * nchannels * sampwidth 
     self.f.writeframes(output) 
     self.f.close()