1. Мегаконкурс в апреле "Приведи друзей на codeby". Дарим деньги, подписку на журнал хакер и выдаем статус "Paid Access". Подробнее ...

    Скрыть объявление

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

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

Наш партнер Genesis Hackspace
  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.197
  2. lazybiz
    Ответов:
    7
    Просмотров:
    3.963

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