鬆散的基礎上由Justin代碼,這裏是一些其他的代碼,可能你想要做什麼:
import wave, audioop
def merge_wav_at_offset(wav_in1, wav_in2, offset, wav_out):
"""Merge two wave files, with the second wave starting at offset seconds
The two input wave files should have the same frame rate, channels, depth
Also, offset should be non-negative and can be floating point."""
wf1= wave.open(wav_in1, 'rb')
wf2= wave.open(wav_in2, 'rb')
wfo= wave.open(wav_out, 'wb')
wfout.setparams(wf1.getparams())
frame_rate = wf1.getframerate()
sample_width= wf1.getsampwidth()
if offset < 0:
offset= 0
prologue_frames= int(frame_rate*offset)
merge_frames= wf2.getnframes()
# prologue
frames_to_read= prologue_frames
while frames_to_read > 0:
chunk_size= min(frame_rate, frames_to_read)
wfo.writeframes(wf1.readframes(chunk_size))
frames_to_read-= chunk_size
# merging
frames_to_read= merge_frames
while frames_to_read > 0:
chunk_size= min(frame_rate, frames_to_read)
frames2= wf2.readframes(chunk_size)
if frames2:
frames1= wf1.readframes(chunk_size)
if len(frames1) != len(frames2): # sanity check
# obviously you should cater for this case too
raise NotImplementedError, "offset+duration(wf2) > duration(wf1)"
merged_frames= audioop.add(frames1, frames2, sample_width)
wfo.writeframes(merged_frames)
else: # early end of wf2 data; improbable but possible
break
frames_to_read-= chunk_size
# epilogue
while True:
frames= wf1.readframes(frame_rate)
if not frames: break
wfo.writeframes(frames)
for wave_file in wf1, wf2, wfo:
wave_file.close()
我只寫了未經測試的代碼,所以它可能是我有一個bug(甚至語法錯誤);然而,我對Python的使用經驗是,代碼經常按原樣運行;-) 如果您需要更多信息,請告訴我。
非常感謝。不知道關於audioop。 – Onion 2010-04-14 17:44:07
嗯,只是一個問題,爲了使文件合併,儘管偏移+持續時間(wf2)>持續時間(wf1),必須完成什麼? – Onion 2010-04-22 17:31:27
@Onion:我會說,合併'min(len(frames1),len(frames2))',將剩餘的幀(可能來自'frames2')寫出來,打破循環。 – tzot 2010-04-22 19:06:33