<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    stone2083

    Linux下基于命令行的音樂播放器

    按照同事的話說,我是一個十足的命令控。
    利用最近項目通宵發(fā)布的空閑時間中,寫了一個命令行下的音樂播放器,以滿足我在linux命令下的需求。

    播放器利用技術:
    Python+GST(http://gstreamer.freedesktop.org/modules/gst-python.html)+Console解析

    播放器自持操作:
    1. 播放
    2. 下一首
    3. 上一首
    4. 暫停
    5. 查看播放列表信息
    6. 查看當前播放信息
    7. 停止(退出)

    看一張截圖:


    通過分析meliae dump出來的內存信息,差不做占用2.5M內存,算的上比較小巧了。

    對應代碼:(需要安裝py-gst,ubuntu下:sudo apt-get install python-gst0.10)
      1 #!/usr/bin/env python
      2 
      3 import gst
      4 import gobject
      5 import sys
      6 #to avoid eclipse'warning
      7 eval('gobject.threads_init()'
      8 from threading import Thread
      9 
     10 class AudioPlayer:
     11     
     12     EVENT_PLAY_NEW = 1
     13     
     14     def __init__(self, advisor):
     15         self.main = gobject.MainLoop()
     16         self.player = gst.element_factory_make('playbin''player')
     17         self.index = -1
     18         self.list = None
     19         self.advisor = advisor
     20         
     21         bus = self.player.get_bus()
     22         bus.add_signal_watch()
     23         bus.connect('message', self.on_message)
     24         
     25         Thread(target=self.main.run).start()
     26        
     27     def add_list(self , list=[]):
     28         if list is None:
     29             list = []
     30         self.list = [(i, l.strip(), l[l.rfind('/'+ 1:]) for (i, l) in enumerate(list)]
     31         
     32     def play(self, index=None):
     33         #play specified tracks
     34         if 0 <= index < len(self.list):
     35             self.index = index
     36             self.player.set_state(gst.STATE_NULL)
     37             self.player.set_property('uri', self.list[index][1])
     38             self.player.set_state(gst.STATE_PLAYING)
     39             if self.advisor:
     40                 self.advisor.on_message(AudioPlayer.EVENT_PLAY_NEW, (self.index, self.get_title()))
     41         #resume playing
     42         if index is None:
     43             if self.index > -1:
     44                 self.player.set_state(gst.STATE_PLAYING)
     45     
     46     def pause(self):
     47         self.player.set_state(gst.STATE_PAUSED)
     48         
     49     def stop(self):
     50         self.player.set_state(gst.STATE_NULL)
     51         self.main.quit()
     52     
     53     def get_title(self):
     54         if self.index == -1 or len(self.list) == 0:
     55             return None
     56         return self.list[self.index][2
     57     
     58     def get_previous(self):
     59         if self.index == -1 or len(self.list) == 0:
     60             return - 1
     61         if self.index == 0:
     62             return 0
     63         return self.index - 1
     64     
     65     def get_next(self):
     66         if  len(self.list) == 0:
     67             return - 1
     68         if self.index + 1 == len(self.list):
     69             return 0
     70         return self.index + 1
     71     
     72     def on_message(self, bus, message):
     73         t = message.type
     74         if t == gst.MESSAGE_ERROR:
     75             self.play(self.get_next())
     76         elif t == gst.MESSAGE_EOS:
     77             self.play(self.get_next())
     78 
     79 class Console:
     80     
     81     def __init__(self, list):
     82         self.player = AudioPlayer(self)
     83         self.player.add_list(list)
     84         self.player.play(0)
     85 
     86         Thread(target=self.run).start()
     87         
     88     def run(self):
     89         while(True):
     90             self.on_cmd(raw_input())
     91     
     92     def on_cmd(self, cmd):
     93         if cmd is None:
     94             return
     95         if cmd.startswith('play'):
     96             self.player.play()
     97         elif cmd.startswith('next'):
     98             self.player.play(self.player.get_next())
     99         elif cmd.startswith('previous'):
    100             self.player.play(self.player.get_previous())
    101         elif cmd.startswith('pause'):
    102             self.player.pause()
    103         elif cmd.startswith('list'):
    104             print '====================================='
    105             for info in self.player.list:
    106                 print '%s. %s' % (info[0], info[2])
    107             print '====================================='
    108         elif cmd.startswith('info'):
    109             print '====================================='
    110             print '%s. %s' % (self.player.index, self.player.get_title())
    111             print '====================================='
    112         elif cmd.startswith('stop'):
    113             self.player.stop()
    114             sys.exit(0)
    115         elif cmd.startswith('dump'):
    116             from meliae import scanner
    117             scanner.dump_all_objects('./dump.txt')
    118         else:
    119             print '''=====================================
    120 Usage:
    121 play
    122 next
    123 previous
    124 pause
    125 list
    126 info
    127 stop
    128 dump
    129 ====================================='''
    130     
    131     def on_message(self, event, info):
    132         if event == AudioPlayer.EVENT_PLAY_NEW:
    133             print '====================================='
    134             print 'Tracks: %s.%s' % (info[0], info[1])
    135             print '====================================='
    136 
    137 
    138 if len(sys.argv) != 2:
    139     print 'player.py mp3.list'
    140     sys.exit(-1)
    141 list = [l.strip() for l in open(sys.argv[1]).readlines() if l.strip() != '']
    142 Console(list)

    下載

    posted on 2011-04-17 19:32 stone2083 閱讀(4281) 評論(4)  編輯  收藏 所屬分類: python

    Feedback

    # re: Linux下基于命令行的音樂播放器 2011-04-20 10:03 greatghoul

    哥們精神頭很足呀,py寫個基本功能的播放器竟然就這么點代碼。  回復  更多評論   

    # re: Linux下基于命令行的音樂播放器 2011-04-20 18:59 stone2083

    @greatghoul
    一直來自己動手,豐衣足食 :)
    用py寫一些小工具,確實是一種享受。太便捷了。  回復  更多評論   

    # re: Linux下基于命令行的音樂播放器[未登錄] 2014-07-21 13:12 John

    能否做一個,監(jiān)控無線路由比如TP,發(fā)現(xiàn)我的手機連接到WIFI就播放音樂,斷開就停止播放。最終效果是我回家就自動播放音樂,離家就暫停。  回復  更多評論   

    # re: Linux下基于命令行的音樂播放器 2014-07-21 14:16 stone2083

    @John
    有意思.
    可以搞, 給個思路
    利用局域網(wǎng)廣播, 監(jiān)聽局域網(wǎng)內有機器, 一旦獲得指定MAC(就是你手機的MAC地址)
    調用lib, 播放音樂, 即可.  回復  更多評論   

    主站蜘蛛池模板: 四虎国产精品免费永久在线| 无码午夜成人1000部免费视频| 高清在线亚洲精品国产二区| 最近免费中文字幕中文高清| 亚洲成a人片在线观| 国产真人无遮挡作爱免费视频 | 亚洲成人中文字幕| 毛片网站免费在线观看| 一级毛片**免费看试看20分钟| 亚洲一区二区在线视频| 免费a级毛片18以上观看精品| 国内少妇偷人精品视频免费| 亚洲高清乱码午夜电影网| 亚洲日韩小电影在线观看| 在线观看免费污视频| 久久免费国产精品一区二区| 精品久久久久亚洲| 亚洲福利视频一区二区三区| 亚洲欧洲日本在线| 成年男女男精品免费视频网站 | 中文字幕成人免费高清在线| 精品亚洲成在人线AV无码| 亚洲人成无码网站| 四虎影视在线永久免费观看| 999久久久免费精品国产| 国产男女爽爽爽免费视频| 亚洲熟妇无码AV| 久久亚洲AV无码精品色午夜麻豆| 国产一级淫片免费播放电影| 最近最新高清免费中文字幕| gogo免费在线观看| 亚洲AV无码XXX麻豆艾秋| 亚洲国产福利精品一区二区| 亚洲精品成人无码中文毛片不卡| 四虎免费久久影院| 日本媚薬痉挛在线观看免费| 国产精品视频免费| 精品香蕉在线观看免费| 国产精品白浆在线观看免费| 中文字幕在线免费看| 黄页网站在线观看免费|