如何在 python 上同时播放两个不同的歌曲文件?

Posted

技术标签:

【中文标题】如何在 python 上同时播放两个不同的歌曲文件?【英文标题】:How do you play two different song files on python at the same time? 【发布时间】:2012-10-15 19:06:49 【问题描述】:

我正在尝试同时播放歌曲 1 和歌曲 2(被注释掉的歌曲),但我不知道如何使用 myro 或 winsound 或其他任何方式来做到这一点。有人建议使用线程,但我也不知道该怎么做,因为我只是一个非常初级的程序员。有人可以帮我解决这个问题和/或详细解释如何做到这一点吗?到目前为止,这是我所拥有的:

import winsound
from myro import *
def main():

    HftM1 = makeSong("Db4 3/8; C4 3/8; Bb3 1/4; Bb3 3/8; Ab3 3/8; Gb3 3/8; Ab3 1/16; C4 3/8; Bb3 3/8; Ab3 1/8; Eb3 1/16; F3 1/16; Ab3 3/8; G3 3/8; F3 3/8; C4 1/16; Db4 3/8; C4 3/8; Bb3 1/8; F3 1/16; Gb3 1/16; Bb3 3/8; Ab3 3/8; Gb3 3/8; C4 3/8; Bb3 3/8; Ab3 1/8; Eb3 1/16; F3 1/16; Ab3 3/8; G3 3/8; F3 3/8")

    saveSong(HftM1, "HymnfortheMissing1.txt", append=1)

    HftM2 = makeSong("Bb2 1/8; F3 1/8; Bb3 1/4; Bb2 1/8; F3 3/8; Gb2 1/8; Db3 1/8; Gb3 1/4; Gb2 1/8; Db3 3/8; Ab2 1/8; Eb3 1/8; Ab3 1/4; Ab2 1/8; Eb3 3/8; F2 1/8; C3 1/8; F3 1/4; F2 1/8; C3 3/8; Bb2 1/8; F3 1/8; Bb3 1/4; Bb2 1/8; F3 3/8; Gb2 1/8; Db3 1/8; Gb3 1/4; Gb2 1/8; Db3 3/8; Ab2 1/8; Eb3 1/8; Ab3 1/4; Ab2 1/8; Eb3 3/8; F2 1/8; C3 1/8; F3 1/4; F2 1/8; C3 3/8")

    saveSong(HftM2, "HymnfortheMissing2.txt", append=1)

    song1 = readSong("HymnfortheMissing1.txt")

    #song2 = readSong("HymnfortheMissing2.txt") #This part of the song is supposed to be played at the same time as the first part, but I don't know how to do that so...

    play = []

    for n in range(len(song1)):
        play = song1[n]
        note = play[0]
        duration = play[1]
        winsound.Beep(int(note), int(duration*2000))
main()

【问题讨论】:

你几天前问过这个问题。 @Blender 我知道(呃)。我得到的答案不是很有帮助(无论如何对我来说),所以我把它记下来并重新发布了更多细节,希望能得到一些更好的答案 【参考方案1】:

我建议您使用PyGame 进行此类工作,并查看此related question。您必须使用混音器模块。

通常,您必须对音频流使用一些数学运算来混合 PCM 数据(例如讨论 see this question)。


更新:Myro(我从未使用过)说 in the docs 有一种方法可以使用 beep 函数来做到这一点:

beep(self, duration, frequency, frequency2 = None):发出声音。如果 给出两个音调,机器人将它们组合起来。

举个简单的例子,如果您在第一首歌曲中有音符 A,持续时间为 1 秒,而在第二首歌曲中有音符 B,持续时间为 2 秒,您将必须调用 beep 两次:首先播放音符 A 和B 同时演奏 1 秒,然后只演奏音符 B 再演奏 1 秒。

不用说,这段代码将比使用 PyGame 之类的东西播放音频文件中的声音并混合它们要复杂得多。

【讨论】:

我已经查看了相关问题。至于其余的,我是一个非常了解如何做到这一点的婴儿程序员。我还没有看过 PyGame,所以我必须更简单和/或更详细一些。 我添加了一个指向 myro 的链接,声称可以使用他们的库来完成。 是的,但是这个程序正在读取一个歌曲文件。因此,代码的“saveSong(HftM1, "HymnfortheMissing1.txt", append=1)" 部分。这只有在我试图结合两种不同的音调时才有效。我试图基本上结合两个不同的乐谱或音调。 您可以在歌曲转换成音调后对歌曲使用beep功能。也就是说,在最后的循环中使用它而不是调用winsound.Beep。您必须编写一些逻辑来计算如何分割每个音调的长度,以防一首歌曲正在改变音调而另一首歌曲仍在播放旧音调。如果您没有必须使用该格式的歌曲文件,我建议您切换到 pygame。查看一些these pygame tutorials 以开始使用。 你是说改变 "for n in range(len(song1)): play = song1[n] note = play[0] duration = play[1] winsound.Beep(int(note ), int(duration*2000))" to: "对于范围内的 n(len(song2)): play = song1[n], song2[n] note = play[0] duration = play[1] beep(int (注), int(duration*2000))"?

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

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

如何在播放该歌曲的声音文件时逐字母读取python中的歌曲[关闭]

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

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

如何同时播放 iPod 库中的两个音频文件?

如何将歌曲/目录添加到 Python MPD 播放列表