在 python 上播放 mp3 歌曲

Posted

技术标签:

【中文标题】在 python 上播放 mp3 歌曲【英文标题】:Playing mp3 song on python 【发布时间】:2013-11-16 17:28:56 【问题描述】:

我想从 python 播放我的歌曲 (mp3),你能给我一个最简单的命令吗?

这是不正确的:

import wave
w = wave.open("e:/LOCAL/Betrayer/Metalik Klinik1-Anak Sekolah.mp3","r")

【问题讨论】:

查看 pygame,并阅读 raspberrypi.stackexchange 上的 this 问题。 Playing MP3 files with Python的可能重复 试试just_playback 【参考方案1】:

获取VLC Python module,vlc.py,它提供对 libVLC 的完全支持并将其弹出到站点包中。那么:

>>> import vlc
>>> p = vlc.MediaPlayer("file:///path/to/track.mp3")
>>> p.play()

您可以通过以下方式阻止它:

>>> p.stop()

该模块提供了很多其他功能(就像 VLC 媒体播放器可以做的任何事情一样),但这是播放 MP3 的最简单和最有效的方法。

你可以稍微玩一下 os.path 让它为你找到 MP3 的路径,给定文件名并可能限制搜索目录。

完整的文档和预先准备好的模块可在here 获得。当前版本与 Python 3 兼容。

【讨论】:

这可能是最好的答案,因为 VLC 已经完成了 99% 的工作。 PyPi 版本已过时,但 VLC wiki 是一个不错的替代 src - wiki.videolan.org/Python_bindings 我认为 PyPI 版本是从旧版本的 VLC 编译的,2.1.x 和 2.2 之间肯定存在差异,这会破坏事情。使用 vlc.py 生成从源代码编译 VLC 应始终生成工作副本,因为 vlc.py 将始终为 libvlc 的编译版本设置正确的 ctypes。 请注意,PyPI 上的版本是完全不相关的东西。某人编写自己的包装器而不检查与原始项目的命名冲突的结果,类似于 python-gnupg 与 gnupg 冲突(除了在这种情况下,第二个项目故意破坏第一个项目)。毫无疑问还有其他人。我想这是 java 为了保证不同且唯一的名称而做对的一件事。 工作,但有一个警告。它使用了一会儿就结束了(因为这是我程序的最后一行)。我不得不再写一行time.sleep(10),然后这才完全播放了音频。 在 2020 年的 Ubuntu 上:当通过 snap 安装 VLC(这是 VLC 当前推荐的方式)时,这将不起作用。只需通过sudo apt-get install vlc 安装【参考方案2】:

试试这个。这很简单,但可能不是最好的方法。

from pygame import mixer  # Load the popular external library

mixer.init()
mixer.music.load('e:/LOCAL/Betrayer/Metalik Klinik1-Anak Sekolah.mp3')
mixer.music.play()

请注意 pygame 的 support for MP3 is limited。另外,正如Samy Bencherif 所指出的,当您运行上述代码时,不会弹出任何愚蠢的 pygame 窗口。

Installation is simple-

$pip install pygame

更新

上面的代码只会在交互运行时播放音乐,因为play() 调用将立即执行并且脚本将退出。为避免这种情况,您可以改为使用以下方式等待音乐播放完毕,然后在将代码作为脚本运行时退出程序。

import time
from pygame import mixer


mixer.init()
mixer.music.load("/file/path/mymusic.ogg")
mixer.music.play()
while mixer.music.get_busy():  # wait for music to finish playing
    time.sleep(1)

【讨论】:

测试 pygame 的混音器,它似乎比 pyglet 的媒体播放器少很多干扰。可能是因为pyglet的播放器也是一个视频播放器,所以如果你不需要视频就有点矫枉过正了!很遗憾 pybass 没有 python 3 支持。那曾经是炸弹。 我会在 python3 中尝试,但对我没有任何建议! @HarshitTrivedi 你得到什么错误?还是根本无法播放音乐?如果是这样,请确保 mp3 可以播放。 @AshishNitinPatil 当我运行此代码并在 python3 中提供正确的 mp3 但不播放任何内容时 如果您担心使用它,因为您不希望弹出 pygame 窗口,请注意没有 pygame.init 所以这将是无窗口的?(在 mbp 上测试)【参考方案3】:

另见playsound

pip install playsound

import playsound
playsound.playsound('/path/to/filename.mp3', True)

【讨论】:

这个库在 Linux 上有问题的历史,不幸的是:github.com/TaylorSMarks/playsound/issues/1 问题已修复:D 错误-在树莓派上试过 gist.github.com/gartha1/e287100003f93b01bdaa9f565590dc47 @barlop - 我在 github 上的评论中写了我认为支持 Rasperry Pi 所需的内容。我认为这需要一三个小时才能完成。随意去做并做一个 PR - 假设你让 Travis 运行并通过测试,我很乐意接受它。 github.com/TaylorSMarks/playsound/issues/… 看起来不错,但好像没有任何事件,所以我无法控制声音何时结束。【参考方案4】:

我已经尝试了这里列出的大部分选项,并发现了以下内容:

对于 Windows 10: 类似于@Shuge Lee 的回答;

from playsound import playsound
playsound('/path/file.mp3')

你需要运行:

$ pip install playsound

对于 Mac: 只需尝试以下运行 os 命令,

import os
os.system("afplay file.mp3") 

【讨论】:

playsound 需要pygame @leopd 怎么样?我没有 pygame,我可以使用 playsound【参考方案5】:

因为这里没有建议,但可能是最简单的解决方案之一:

import subprocess

def play_mp3(path):
    subprocess.Popen(['mpg123', '-q', path]).wait()

这取决于任何兼容 mpg123 的播放器,例如对于 Debian 使用:

apt-get install mpg123

apt-get install mpg321

【讨论】:

【参考方案6】:

您正在尝试将.mp3 当作.wav 来播放。

您可以尝试使用pydub 将其转换为.wav 格式,然后将其输入pyAudio。

例子:

from pydub import Audiosegment

song = AudioSegment.from_mp3("original.mp3")
song.export("final.wav", format="wav")

或者,使用pygame,如另一个答案中所述。

【讨论】:

【参考方案7】:

如果您在 Jupyter(以前的 IPython)笔记本中工作,则可以

import IPython.display as ipd
ipd.Audio(filename='path/to/file.mp3')

【讨论】:

【参考方案8】:

一个简单的解决方案:

import webbrowser
webbrowser.open("C:\Users\Public\Music\Sample Music\Kalimba.mp3")

干杯...

【讨论】:

可爱,但是如果唯一的浏览器是 lynx 或者即使系统上其他浏览器可用,用户只有命令行访问权限怎么办?不过,这是一个不错的快速而肮脏的工作站解决方案。 谢谢迈克尔,但我如何才能添加“播放列表”而不是一个文件?【参考方案9】:

另一个快速简单的选择...

import os

os.system('start path/to/player/executable path/to/file.mp3')

现在您可能需要进行一些细微的更改才能使其正常工作。例如,如果播放器需要额外的参数或者您不需要指定完整路径。但这是一种简单的方法。

【讨论】:

那只是windows【参考方案10】:

我遇到了这个问题,没有找到任何我喜欢的解决方案,所以我为 mpg321 创建了一个 python 包装器:mpyg321。

您需要在您的计算机上安装 mpg123 或 mpg321,然后执行pip install mpyg321

用法很简单:

from mpyg321.mpyg321 import MPyg321Player
from time import sleep

player = MPyg321Player()       # instanciate the player
player.play_song("sample.mp3") # play a song
sleep(5)
player.pause()                 # pause playing
sleep(3)
player.resume()                # resume playing
sleep(5)
player.stop()                  # stop playing
player.quit()                  # quit the player

您还可以为多个事件(用户暂停音乐、歌曲结束...)定义回调。

【讨论】:

【参考方案11】:

此时,何不提python-audio-tools

GitHub:https://github.com/tuffy/python-audio-tools 文档: http://audiotools.sourceforge.net/programming/audiotools.html?highlight=seek#module-audiotools

这是我找到的最佳解决方案。

(我需要在 Raspbian 上安装 libasound2-dev

代码摘录大致基于:https://github.com/tuffy/python-audio-tools/blob/master/trackplay

#!/usr/bin/python

import os
import re
import audiotools.player


START = 0
INDEX = 0

PATH = '/path/to/your/mp3/folder'

class TracklistPlayer:
    def __init__(self,
                 tr_list,
                 audio_output=audiotools.player.open_output('ALSA'),  
                 replay_gain=audiotools.player.RG_NO_REPLAYGAIN,
                 skip=False):

        if skip:
            return

        self.track_index = INDEX + START - 1
        if self.track_index < -1:
            print('--> [track index was negative]')
            self.track_index = self.track_index + len(tr_list)

        self.track_list = tr_list

        self.player = audiotools.player.Player(
                audio_output,
                replay_gain,
                self.play_track)

        self.play_track(True, False)

    def play_track(self, forward=True, not_1st_track=True):
        try:
            if forward:
                self.track_index += 1
            else:
                self.track_index -= 1

            current_track = self.track_list[self.track_index]
            audio_file = audiotools.open(current_track)
            self.player.open(audio_file)
            self.player.play()

            print('--> index:   ' + str(self.track_index))
            print('--> PLAYING: ' + audio_file.filename)

            if not_1st_track:
                pass  # here I needed to do something :)

            if forward:
                pass  # ... and also here

        except IndexError:
            print('\n--> playing finished\n')

    def toggle_play_pause(self):
        self.player.toggle_play_pause()

    def stop(self):
        self.player.stop()

    def close(self):
        self.player.stop()
        self.player.close()


def natural_key(el):
    """See http://www.codinghorror.com/blog/archives/001018.html"""
    return [int(s) if s.isdigit() else s for s in re.split(r'(\d+)', el)]


def natural_cmp(a, b):
    return cmp(natural_key(a), natural_key(b))


if __name__ == "__main__":

    print('--> path:    ' + PATH)

    # remove hidden files (i.e. ".thumb")
    raw_list = filter(lambda element: not element.startswith('.'), os.listdir(PATH))

    # mp3 and wav files only list
    file_list = filter(lambda element: element.endswith('.mp3') | element.endswith('.wav'), raw_list)

    # natural order sorting
    file_list.sort(key=natural_key, reverse=False)

    track_list = []
    for f in file_list:
        track_list.append(os.path.join(PATH, f))


    TracklistPlayer(track_list)

【讨论】:

我体验到python-audio-tools 只运行 Python 2,而不是 Python 3。【参考方案12】:
from win32com.client import Dispatch

wmp = Dispatch('WMPlayer.OCX')

liste = [r"F:\Mp3\rep\6.Evinden Uzakta.mp3",
         r"F:\Mp3\rep\07___SAGOPA_KAJMER___BIR__I.MP3",
         r"F:\Mp3\rep\7.Terzi.mp3",
         r"F:\Mp3\rep\08. Rüya.mp3",
         r"F:\Mp3\rep\8.Battle Edebiyatı.mp3",
         r"F:\Mp3\rep\09_AUDIOTRACK_09.MP3",
         r"F:\Mp3\rep\02. Sagopa Kajmer - Uzun Yollara Devam.mp3",
         r"F:\Mp3\rep\2Pac_-_CHANGE.mp3",
         r"F:\Mp3\rep\03. Herkes.mp3",
         r"F:\Mp3\rep\06. Sagopa Kajmer - Istakoz.mp3"]


for x in liste:
    mp3 = wmp.newMedia(x)
    wmp.currentPlaylist.appendItem(mp3)

wmp.controls.play()

【讨论】:

【参考方案13】:

到目前为止,pydub 最适合我。 playsound 之类的模块也可以完成这项工作,但它只有一个功能。 pydub 有很多功能,比如切片歌曲(文件),调整音量等......

就像在 python 中对列表进行切片一样简单。

所以,在玩的时候,如下图。

from pydub import AudioSegment
from pydub.playback import play

path_to_file = r"Music/Harry Potter Theme Song.mp3"
song = AudioSegment.from_mp3(path_to_file)
play(song)

【讨论】:

【参考方案14】:

对于 2020 年仍然发现此问题的任何人:经过比我预期更长的搜索,我刚刚找到了 simpleaudio library,它看起来维护良好,获得 MIT 许可,可在 Linux、macOS 和 Windows 上运行,并且只有非常很少的依赖项(在 Linux 上只有 python3-devlibasound2-dev)。

它支持直接从内存中的缓冲区(例如Numpy数组)播放数据,具有方便的音频测试功能:

import simpleaudio.functionchecks as fc
fc.LeftRightCheck.run()

您可以按如下方式从磁盘播放文件:

import simpleaudio as sa

wave_obj = sa.WaveObject.from_wave_file("path/to/file.wav")
play_obj = wave_obj.play()
play_obj.wait_done()

Installation instructions 基本上是pip install simpleaudio

【讨论】:

虽然不支持 mp3【参考方案15】:

你应该像这样使用 pygame:

from pygame import mixer

mixer.init()
mixer.music.load("path/to/music/file.mp3") # Music file can only be MP3
mixer.music.play()
# Then start a infinite loop
while True:
    print("")

【讨论】:

【参考方案16】:

按照 Ben 的建议,您可以使用 pyvlc 模块。但即使你没有那个模块,你也可以在 Linux 的终端中使用 VLC 播放 mp3 和 mkv 文件:

import os
os.system('nvlc /home/Italiano/dwhelper/"Bella Ciao Originale.mkv"')

更多信息在这里:https://linuxhint.com/play_mp3_files_commandline/

【讨论】:

【参考方案17】:
import os
os.system('file_path/filename.mp3')

【讨论】:

这不会做任何事情,除非操作系统只通过输入路径和文件名来执行音频文件;大多数(如果不是全部)系统都不会这样做。此外,强烈建议不要使用os.system。如果必须,请改用subprocess,甚至使用sh 它可能适用于 Windows。但我会改用os.startfile

以上是关于在 python 上播放 mp3 歌曲的主要内容,如果未能解决你的问题,请参考以下文章

当我从 <a> 标签单击歌曲时,如何让 mp3 播放器播放歌曲?

带有播放列表的 flash mp3 播放器正在播放已删除或更改的歌曲

为网站构建自定义 mp3 播放器 - 不知道如何编写播放上一首歌曲,播放下一首歌曲功能

PHP/JavaScript MP3 播放器采样和销售歌曲 [关闭]

C# axWindowsMediaPlayer播放MP3有时会卡,怎么办?

Mp3 播放类播放列表中的歌曲,但要等到一首完成后再继续