在Python上播放mp3歌曲

86
我想从Python播放我的音乐(mp3),你能给我一个最简单的命令吗?
这不正确:
import wave
w = wave.open("e:/LOCAL/Betrayer/Metalik Klinik1-Anak Sekolah.mp3","r")

1
请查看pygame,并阅读raspberrypi.stackexchange上的这个问题 - Steinar Lima
可能是使用Python播放MP3文件的重复问题。 - user
尝试使用just_playback - droptop
17个回答

5

那么为什么不提一下 python-audio-tools 呢:

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

(在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)

1
我有过这样的经验,即“python-audio-tools”只能在Python 2中运行,而不能在Python 3中运行。 - bomben

3
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()

2
到目前为止,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)

2
您应该像这样使用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("")

2
对于任何在2020年仍在寻找的人:经过比我预期更长的搜索,我刚刚找到了simpleaudio库,它似乎得到良好维护,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()

安装指南基本上就是pip install simpleaudio


1
不支持MP3,但是。 - Jhonny D. Cano -Leftware-

0

正如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/


-3
import os
os.system('file_path/filename.mp3')

除非操作系统仅通过输入路径和文件名执行音频文件,否则此操作不会执行任何操作;大多数系统都不会这样做。同时,强烈不建议使用os.system。请改用subprocess或者如果必须的话,甚至可以使用sh - Ben
它可能在Windows上运行。但我会使用os.startfile代替。 - Jean-François Fabre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接