AJ Kipper:用Python写一个简易的MP3播放器

用Python写一个简易的MP3播放器

前言

最近在学习Web.py框架的时候,了解了基本的Python连接数据库(MySQL)的方法。学完后,总想用它来干点啥,于是,就想能不能写一个MP3播放器。一开始大概的想法是一方面实现连接MySQL数据库,可以进行歌曲的存入和删除;另一方面实现在终端控制歌曲的播放和停止等功能。

产品设计

既然做一个项目,一开始要做的肯定不是编程,而是项目设计,从产品功能层面开始,再到程序实现层面。

产品层面还算简单,毕竟不用考虑太细节的用户体验,先把框架搭建出来。

界面信息

显示可播放的歌曲

显示功能操作信息

功能操作

点击播放

点击停止

点击继续

删除歌曲

增加歌曲

产品层面大概就这样了,因为我没打算写客户端界面(虽然可以用Python的GUI包PyQt来实现),先把功能实现再说。

程序框架

现在来考虑程序的实现层面。

从最简单的开始吧,那就先写界面。于是,写了下面的main.py模块:


第九行为:unction_dict={"1":"play","2":"stop","3":"continue","4":"delete","5":"upload"}

终端运行一下,看看效果:

逻辑是设定好了,输入指令,调用相关函数,输出相关信息。下一步我想的是完善捕获异常输入,比如说,如果用户输入的指令不在范围内,程序岂不是崩溃了!

但是这个都比较简单,也就是增加一些判断逻辑嘛,所以不给代码了,待会一块给。

MySQLdb的使用

前面的代码相信大家都能看明白。接下来就是数据库方面了,先要写一个数据库模块提供操作接口。这个是重点,我就一点一点讲吧。

首先,你得确认电脑安装了MySQL和Python用于操作数据库的模块MySQLdb哦,安装方法就不在这里说了,自行解决,乖~(~( ̄▽ ̄)~)

先来连接数据库。

con=mdb.connect(host="localhost",user="root",passwd="ha",db="Pydb")

就先讲讲这一条语句吧,调用MySQLdb模块下的connect方法,获取一个数据库连接类对象(con)。再看看里面的参数host,user,passwd,db,这4个容易理解,就是①数据库地址,②用户名,③密码,④数据库名字。注意:不了解MySQL的童鞋,这里的数据库名字db不是指你安装的数据库的名字,比如直接写MySQL。而是你在进入了数据库,新创建database的那个名字,忘记了可以用 show databases 指令来查看。

这4个参数是最基本的参数,有些人还会增加端口号比如port = “3306”,还有charset = “utf8”,首先,port是端口参数,由于MySQL默认端口是3306,所以不用写了,你要加上也行别写错。charset参数是中文编码方式,我建议大家加上,不然存中文数据的时候可能会出错。我这里没加的原因是,我在自己的MySQL配置文件上把编码方式全部设置成了utf8,所以不用啦!(=Ω=)

如果你认为这就是connect的全部参数那就错了,那些不常用的参数在下面文档里有写。

http://structure.usc.edu/mysqldb/MySQLdb-3.html

接下来用connect对象获取一个cursor对象,再用cursor提供的方法来进行数据库操作,cursor下的方法主要分为两方面,执行命令和接收参数,在这个项目中,我用了cursor.execute( )来执行单条数据库命令,用了cursor.fetchall( )来接收所有的返回值。更多的cursor方法这里就不列了。

例子:(具体用法请看注释)


数据库操作方面最重要的知识点就这些了,等等,还有些问题要想清楚,歌单信息table是要预先创建吧?table的结构具体包括什么呢?

我想了一下,列出了下面这个表格:

idnamesingerpath

int(11)varchar(20)varchar(20)varchar(60)

所以,我先在终端进入MySQL里,直接用MySQL语言创建了一个名为Pydb的database,然后创建了一个名为Song的table,结构如下。


当然,以上的database和table创建,用Python也是可以实现的,因为这些东西只执行一次,所以我就没有写进这个项目里面。但是要注意,对数据库所有数据删除或者写入操作,最后都要加上commit()指令,不然Python程序运行结束,对数据的操作是没有保存的。如下:


接下来写了一个数据库接口的模块,mdb.py


实现播放MP3文件

看来,数据库方面的接口已经写好了,我好像忘记了一个最核心的问题:怎么来播放MP3文件?

说实话,解决这个问题的过程中很有趣也很蛋疼。

第①种方案

一开始,我想的是看看mac终端有没有什么shell命令或者接口可以直接播放MP3文件的,在网上搜寻了许久,终于找到一个”open path*.MP3″命令来播放MP3文件,怀着激动的心情,在终端试了试…结果终端打开了默认播放器iTunes来播放,这不是我想要的啊,我要的是在终端直接播放文件而不依靠任何其他软件。

第②种方案

接着又在网上搜寻者,突然发现一个亮瞎我双眼的python模块 —— mp3play(~~~///(^v^)\\\~~~)

上面给出的代码说这样就可以播放mp3文件:


我赶紧下了这个模块,在程序中 import mp3play 的时候,却提示:mp3play 模块不适用当前系统,而适用于Windows系统….好吧,原来这个模块只适用于Windows系统.(╮(╯3╰)╭)

第③种方案

没事,有问题就解决,我接着寻找。既然mac没有提供这些接口给终端,那么Xcode中用Objective-C肯定能调用底层接口吧?不然mac系统怎么编写音乐播放客户端?于是求救一个IOS开发的程序员,结果他说接口是有,但是写出来之后无法用Python来控制啊,因为OC程序的接口是不对外的,像是一个封装的箱子,用户只能操作按钮,不能往里面塞东西,那也就还是不行…#!- _ –

卧槽,没辙了,先用第①种方案,调用iTunes来播放吧!#!→_→

问题又出来了,怎么实现暂停和继续播放功能?

还好,Mac终端有”kill -STOP process_pid” 和 “kill -CONT process_pid” 两个指令来控制一个进程的暂停和继续。所以,也就是我只要找出iTunes进程的pid,就可以实现控制它的暂停和继续了。

这时候要用到psutil模块,psutil可以实现查看cpu的信息、查看内存信息、查看系统启动时间、查看网卡信息等等,具体的功能可以看官方文档:psutil documentation,也可以去github看:giampaolo/psutil

下面是getpid.py文件:


其实框架已经写好了,用简单的图表示一下:


然后第一版代码出来了,实现了基本功能,但是对输入的异常处理不够,还望各位有兴趣自己去填充吧。

main.py


mdb.py


getpid.py


在终端测试一下:

在终端进入这个项目的文件,输入Python main.py即可启动。


基本的功能实现了,不过这个项目理论上来说并没有实现MP3播放功能,而只是写了一个控制iTunes的Python脚本,有点伤心啊,如果哪位知道怎么调用底层接口(Mac),实现终端直接播放MP3文件的话,可以告诉我呀(*O_O*)!

后续

后来心有不服,还是去网上各种搜寻,终于搜出一个名叫sox的程序,安装在Mac OX系统中,用play path*.mp3命令即可以播放,播放效果太酷了(*>_<*),如下:



连这首歌的播放时间等信息都有,可还是失望一场!!因为sox是音频处理程序,只能播放,不能停止和继续,只能用Control + z强行退出,那也就是退出Python程序了,然并卵,宝宝心里好桑心!#!Q_Q

总结

这个项目主要是为了熟练MySQLdb模块而做的,当然还可以锻炼自己对module和函数的调用,如果有编程风格方面的缺陷,希望大家可以评论给我指出来,还是学生一枚,轻喷(⊙.⊙)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容