如何保存同时播放两个曲目的wav文件?在不同的体积

Posted

技术标签:

【中文标题】如何保存同时播放两个曲目的wav文件?在不同的体积【英文标题】:how to save a wav file that plays two tracks at the same time? at different volumes 【发布时间】:2017-04-01 18:27:45 【问题描述】:

我正在用 python 编码并使用“wave”库。 我已经设法用这个库保存了新的波形文件,但没有两个声音文件重叠——保存时它们会一个接一个地播放。 如果有人可以帮助如何保存两个曲目同时播放 不同音量的文件,那就太好了。 谢谢。

【问题讨论】:

Mixing two audio files together with python的可能重复 【参考方案1】:

您可以使用 pydub 库(我在 std 库中围绕 python wave 模块编写的一个轻量级包装器)非常简单地做到这一点:

from pydub import Audiosegment

sound1 = AudioSegment.from_file("/path/to/my_sound.wav")
sound2 = AudioSegment.from_file("/path/to/another_sound.wav")

combined = sound1.overlay(sound2)

combined.export("/path/to/combined.wav", format='wav')

但如果你真的想用 wave 来做:

这非常依赖于这些格式。下面是一个假设 2 字节宽的小端示例如何做到这一点的示例:

import wave

w1 = wave.open("/path/to/wav/1")
w2 = wave.open("/path/to/wav/2")

#get samples formatted as a string.
samples1 = w1.readframes(w1.getnframes())
samples2 = w2.readframes(w2.getnframes())

#takes every 2 bytes and groups them together as 1 sample. ("123456" -> ["12", "34", "56"])
samples1 = [samples1[i:i+2] for i in xrange(0, len(samples1), 2)]
samples2 = [samples2[i:i+2] for i in xrange(0, len(samples2), 2)]

#convert samples from strings to ints
def bin_to_int(bin):
    as_int = 0
    for char in bin[::-1]: #iterate over each char in reverse (because little-endian)
        #get the integer value of char and assign to the lowest byte of as_int, shifting the rest up
        as_int <<= 8
        as_int += ord(char) 
    return as_int

samples1 = [bin_to_int(s) for s in samples1] #['\x04\x08'] -> [0x0804]
samples2 = [bin_to_int(s) for s in samples2]

#average the samples:
samples_avg = [(s1+s2)/2 for (s1, s2) in zip(samples1, samples2)]

现在剩下要做的就是将samples_avg 转换回二进制字符串并使用wave.writeframes 将其写入文件。这与我们刚才所做的正好相反,所以应该不难弄清楚。对于您的 int_to_bin 函数,您可能会使用函数 chr(code),它返回字符代码为 code 的字符(与 ord 相反)

【讨论】:

感谢所有帮助 - pydub 正是我所需要的。但是当我尝试在 python 中导入 AudioSegment 时,它无法识别它。 (我 pip 安装了 pydub 并尝试为 AudioSegment 做同样的事情)。我该如何解决这个问题? 想补充一下,我试过网上搜索,也没有找到

以上是关于如何保存同时播放两个曲目的wav文件?在不同的体积的主要内容,如果未能解决你的问题,请参考以下文章

如何同时播放多个声音文件?

如何同时录制使用 AVPlayer 和 wav 文件播放的歌曲?

如何使用 MediaPlayer 同时播放多个曲目?

使用 ActionScript 3 将保存声音录制到文件中。不是来自麦克风

在 iPhone 上同时播放多首 MP3 歌曲

是否可以创建同时播放多个曲目的javascript音频播放器?