首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python点阵字玩转动态歌词

下面介绍设计思路,歌词动态播放效果见文末视频,截图如下

歌词lrc文件

玩过mp3的话对此应该不陌生,就是配在歌曲mp3文件边上后缀为lrc的文件。lrc是英文lyric即歌词的缩写。lrc文件可以用文本编辑器直接打开,其内容分为标识标签时间标签,如图

标识标签指 [ti:歌曲名]、[ar:歌手名]、[al:专辑名]、 [offset:时间补偿值]这类介绍信息。

时间标签指[mm:ss.ff]加对应歌词,mm:ss.ff是分钟和精确到百分位的秒数,当歌曲播放到特定的时间点,根据时间标签读取对应的歌词文本,实现歌词同步、动态显示。

搞清lrc的格式,思路也就清晰了:读取文件中的时间标签,解析出我们需要的时间和对应的歌词文本,定时按文本内容打印输出点阵字。

读取时间标签

涉及到lrc文件的编码格式,直接读取会报错,引入codecs来读取文件。

读取文本我采用了readlines(),读取整个文件所有行,每行作为一个元素保存到一个列表list中。

学python的新手朋友可以回顾下读取文件read()、readline()和这里的readlines()的区别,这里选用readlines() 是因为lrc本身不大,直接读到列表中也方便后续操作。

接下来都是Python入门的应用,拿到读取出的列表,遍历列表,也就是检查每一项,挑选出符合时间标签格式的字符串,把字符串分离成时间数字和歌词文本。

按时间打印歌词

以“[00:02.88]无条件“为例,在第2.88秒时将“无条件”打印输出,再到下一句的5.59秒,输出下一个文本,这里我采用了比较简单的方式:利用time模块中的time.sleep(t) 来推迟执行命令。

这样做忽略了执行代码的运行时间,但是好在代码简单、新手友好,而且忽略的影响并不明显。

代码概览

importre

importtime

importprintPlay

importcodecs

openLyric = codecs.open("无条件.lrc",encoding='utf-8')

lyricList = openLyric.readlines()

timeTable = []

lyricDict = {}

timeDict = {}

pattern =r'\d:\d.\d'

forstrinlyricList:

strList = str.split(']')

foriinrange(len(strList)-1):

ifre.match(pattern,strList[i][1:]):

t = (int(strList[i][1:][:2]) *60+int(strList[i][1:][3:5]))+int(strList[i][1:][6:8])*0.01

timeTable.append(t)

lyricDict[t] = strList[-1][:-1]

歌词转点阵字

通过导入定义点阵字打印方法的py文件名 import printPlay,在新的代码文件中直接调用printPlay.printPlay()来实现。

在之前printPlay.py文件基础上,我做了些改动,将运行printPlay.py时要执行的代码放入main中并对__name__先做个判断再执行。

defmain():

inpt =input("写你所想:")

lineSign ="0"

backgroundSign ="."

printPlay(inpt,lineSign,backgroundSign)

if__name__ =='__main__':

main()

__name__是标识模块名字的一个系统变量:假如当前模块是主模块来直接执行,那么此模块名字就是__main__,通过判断直接执行主函数内容;假如此模块是被import的,则此模块名字为文件名字,跳过if语句中的内容,再被import中的文件中,通过 文件名.函数 来执行被调用的函数。

歌曲播放

歌词问题解决,接下来是歌曲,我们选用pygame的mp3播放功能。这个需要安装pygame, 可以通过pip install pygame来直接操作。

装好后在py文件中importpygame ,接下来就是三行代码来初始化、读取、播放。

importpygame

注意,要将mp3和lrc文件都放在和py文件同一个文件夹,如果改变路径,则需要在代码中lrc和mp3读取处添加对应路径。

最终成果视频

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190116G1DZFN00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券