Проигрывание Mp3 через Http

Тема в разделе "Другие", создана пользователем GrandMaster, 13 авг 2010.

  1. GrandMaster

    GrandMaster Гость

    Привет всем. Пишу прогу на python для прослушки записей. Причем эти записи храняться на удаленном компе.
    К этим записям есть доступ по http вида http://site:8888/file.mp3.
    Программа пока умеет играть локальные файлы типа "/home/user/Desktop/test.mp3"
    как научить ее играть по http://site:8888/file.mp3

    Ниже пример с куском из моей программы:

    <!--shcode--><pre><code class='python'>#!/usr/bin/env python

    import sys, os, thread, time
    import pygtk, gtk, gobject
    import pygst
    pygst.require("0.10")
    import gst

    class GTK_Main:

    def __init__(self):
    window = gtk.Window(gtk.WINDOW_TOPLEVEL)
    window.set_title("Player")
    window.set_default_size(500, -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)
    hbox = gtk.HBox()
    vbox.add(hbox)
    buttonbox = gtk.HButtonBox()
    hbox.pack_start(buttonbox, False)
    rewind_button = gtk.Button("Rewind")
    rewind_button.connect("clicked", self.rewind_callback)
    buttonbox.add(rewind_button)
    self.button = gtk.Button("Start")
    self.button.connect("clicked", self.start_stop)
    buttonbox.add(self.button)
    forward_button = gtk.Button("Forward")
    forward_button.connect("clicked", self.forward_callback)
    buttonbox.add(forward_button)
    self.time_label = gtk.Label()
    self.time_label.set_text("00:00 / 00:00")
    hbox.add(self.time_label)
    window.show_all()

    self.player = gst.Pipeline("player")
    source = gst.element_factory_make("filesrc", "file-source")
    decoder = gst.element_factory_make("mad", "mp3-decoder")
    conv = gst.element_factory_make("audioconvert", "converter")
    sink = gst.element_factory_make("alsasink", "alsa-output")

    self.player.add(source, decoder, conv, sink)
    gst.element_link_many(source, decoder, conv, sink)

    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()
    if os.path.isfile(filepath):
    self.button.set_label("Stop")
    self.player.get_by_name("file-source").set_property("location", filepath)
    self.player.set_state(gst.STATE_PLAYING)
    self.play_thread_id = thread.start_new_thread(self.play_thread, ())
    else:
    self.play_thread_id = None
    self.player.set_state(gst.STATE_NULL)
    self.button.set_label("Start")
    self.time_label.set_text("00:00 / 00:00")

    def play_thread(self):
    play_thread_id = self.play_thread_id
    gtk.gdk.threads_enter()
    self.time_label.set_text("00:00 / 00:00")
    gtk.gdk.threads_leave()

    while play_thread_id == self.play_thread_id:
    try:
    time.sleep(0.2)
    dur_int = self.player.query_duration(gst.FORMAT_TIME, None)[0]
    if dur_int == -1:
    continue
    dur_str = self.convert_ns(dur_int)
    gtk.gdk.threads_enter()
    self.time_label.set_text("00:00 / " + dur_str)
    gtk.gdk.threads_leave()
    break
    except:
    pass

    time.sleep(0.2)
    while play_thread_id == self.play_thread_id:
    pos_int = self.player.query_position(gst.FORMAT_TIME, None)[0]
    pos_str = self.convert_ns(pos_int)
    if play_thread_id == self.play_thread_id:
    gtk.gdk.threads_enter()
    self.time_label.set_text(pos_str + " / " + dur_str)
    gtk.gdk.threads_leave()
    time.sleep(1)

    def on_message(self, bus, message):
    t = message.type
    if t == gst.MESSAGE_EOS:
    self.play_thread_id = None
    self.player.set_state(gst.STATE_NULL)
    self.button.set_label("Start")
    self.time_label.set_text("00:00 / 00:00")
    elif t == gst.MESSAGE_ERROR:
    err, debug = message.parse_error()
    print "Error: %s" % err, debug
    self.play_thread_id = None
    self.player.set_state(gst.STATE_NULL)
    self.button.set_label("Start")
    self.time_label.set_text("00:00 / 00:00")

    def demuxer_callback(self, demuxer, pad):
    adec_pad = self.audio_decoder.get_pad("sink")
    pad.link(adec_pad)

    def rewind_callback(self, w):
    pos_int = self.player.query_position(gst.FORMAT_TIME, None)[0]
    seek_ns = pos_int - (10 * 1000000000)
    self.player.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, seek_ns)

    def forward_callback(self, w):
    pos_int = self.player.query_position(gst.FORMAT_TIME, None)[0]
    seek_ns = pos_int + (10 * 1000000000)
    self.player.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, seek_ns)

    def convert_ns(self, t):
    # This method was submitted by Sam Mason.
    # It's much shorter than the original one.
    s,ns = divmod(t, 1000000000)
    m,s = divmod(s, 60)

    if m < 60:
    return "%02i:%02i" %(m,s)
    else:
    h,m = divmod(m, 60)
    return "%i:%02i:%02i" %(h,m,s)

    GTK_Main()
    gtk.gdk.threads_init()
    gtk.main()[/CODE]
     
Загрузка...
Похожие Темы - Проигрывание Mp3 через
  1. alexas
    Ответов:
    2
    Просмотров:
    1.168
  2. lazybiz
    Ответов:
    7
    Просмотров:
    3.917

Поделиться этой страницей