Raspberry Pi Web Radio Player



พอดีค้นไปเจอโครงงานชื่อ Raspberry Pi Web Radio (https://sourceforge.net/projects/raspberrypiwebr/) น่าสนใจดี เขาทำเป็นเรื่องเป็นราวเลยนะ หากจะทำแบบเขาคงต้องใช้เวลาเหมือนกัน อยากทำแบบที่มันง่าย (เยอะเลย) ใช้ส่วนตัวเราเอง เผื่อเอาไว้เปิดเพลงกล่อมลูกค้าในร้านกาแฟของเราเอง (ถ้ามี)

เตรียมอุปกรณ์

1. Raspberry Pi board จะรุ่นไหนก็ได้ครับ และก็ติดตั้ง OS ซะให้เรียบร้อย ผมใช้ Raspbian ครับ (รุ่นไหนก็ใช้งานได้ครับ) และแน่นอนว่าต้องต่อกับ internet ได้ด้วย

2. Speakers หรือลำโพง หรือระบบขยายเสียง ตามทรัพยากรที่ท่านมีอยู่ ทำการติดตั้งกับ Raspberry Pi

เตรียมซอฟต์แวร์

ผมใช้ Gstreamer ซึ่งเป็น opensource multimedia framework ที่ทรงพลังน่าดู (https://gstreamer.freedesktop.org/)  ติดตั้งด้วยคำสั่ง


$sudo apt-get update
$sudo apt-get install gstreamer1.0-x \
gstreamer1.0-tools \
gstreamer1.0-alsa \
gstreamer1.0-libav \
gstreamer1.0-omx \
gstreamer1.0-plugins-good \
gstreamer1.0-plugins-base \
gstreamer1.0-plugins-bad \
gstreamer1.0-plugins-ugly \
libgstreamer1.0-0 \
python-gst-1.0 \
python-gtk2 



หลังจากรอการติดตั้งเสร็จแล้วต่อไปก็เป็นการสร้างโปรแกรม ผมใช้ Python 2.7 ครับ ถนัดมือดี

Python Code


import sys, os
import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GObject, Gtk

class GTK_Main(object):
    
    def __init__(self):
        window = Gtk.Window(Gtk.WindowType.TOPLEVEL)
        window.set_title("My Radio Web Player")
        window.set_default_size(300, -1)
        window.connect("destroy", Gtk.main_quit, "WM destroy")
        vbox = Gtk.VBox()
        window.add(vbox)
        self.entry = Gtk.Entry()
        vbox.pack_start(self.entry, False, True, 0)
        self.button = Gtk.Button("Start")
        self.button.connect("clicked", self.start_stop)
        vbox.add(self.button)
        window.show_all()

        self.player = Gst.ElementFactory.make("playbin", "player")
        bus = self.player.get_bus()
        bus.add_signal_watch()
        bus.connect("message", self.on_message)
        
    def start_stop(self, w):
        if self.button.get_label() == "Start":
            filepath = self.entry.get_text()
            self.button.set_label("Stop")
            self.player.set_property("uri",filepath)
            self.player.set_state(Gst.State.PLAYING)
        else:
            self.player.set_state(Gst.State.NULL)
            self.button.set_label("Start")

    def on_message(self, bus, message):
        t = message.type
        if t == Gst.MessageType.EOS:
            self.player.set_state(Gst.State.NULL)
            self.button.set_label("Start")
        elif t == Gst.MessageType.ERROR:
            self.player.set_state(Gst.State.NULL)
            err, debug = message.parse_error()
            print "Error: %s" % err, debug
            self.button.set_label("Start")


Gst.init(None)
GTK_Main()
GObject.threads_init()
Gtk.main()


 ผมตั้งชื่อ Python code นี้ว่า my_web_radio.py

ทดสอบโปรแกรม

ต้องหาเว็บไซต์ที่เขามีเพลงให้ฟัง ถ้าจะเอาง่ายไม่ต้องค้นก็เอาของโครงงาน Raspberry Pi Web Radio ที่เขาเตรียมไว้มาใช้เลยก็ได้ หรือค้นจาก Google ก็ได้ ส่วนตัวผมใช้เว็บ https://www.shoutcast.com/# เป็นแหล่งข้อมูลครับ

การนำ URL จาก https://www.shoutcast.com/ มาใช้

1. เข้าไปในเว็บ https://www.shoutcast.com/ แล้วเลือก Station ที่ต้องการ

2. คลิ๊กที่ icon download  แล้วเลือกรายการ Any player(.m3u)  เพื่อนำเอา m3u file มา


 3. เปิด m3u ด้วย Text Editor จะเห็นข้อมูล ให้สำเนา URL  ไว้ครับ


หยุดตรงนี้นิดหนึ่งครับ อยากขยายความ URL ที่ใช้หน่อย
  • ท่านควรทดสอบความถูกต้องของ URL นิดหนึ่ง เพราะบางครั้งมันเป็น URL ที่นำไปสู่หน้าเว็บเพจไม่ใช่ streaming ครับ หากไม่แน่ใจควรลองใช้งานกับ media player เช่น VLC ดูก่อน
  • ประการหนึ่ง แม้ Gstreamer จะสามารถเล่น media ได้หลาย format แต่ถ้าจะให้ได้ performance ที่ดี ควรเลือก mp3 ครับ 
  • Code ชุดนี้ใช้ความสามารถของ playbin ซึ่งเป็น utility ที่ติดมาพร้อมกับ gstreamer ดังนั้นอาจจะมีบาง protocol ที่ playbin ไม่เข้าใจ เช่น rtsp, rtmp เป็นต้น ดังนั้นเพื่อความมั่นใจควรเลือก http ไว้ก่อน ครับ

4. เรียกโปรแกรมของเรา

$python my_web_radion.py


จะเห็น window ดังภาพ


พิมพ์ URL ที่ได้จากข้อ 3 เข้าไป แล้วคลิ๊ก Start




แล้วก็มีความสุขเล็ก ๆ กับการฟังเพลงที่ชอบไป 
Previous
Next Post »