Seite 1 von 1

Mit Python Sound ausgeben?

Verfasst: Montag 24. März 2008, 13:41
von Miko
Hi,

ich suche ein Modul welches viele Funktionen für die Soundausgabe bereithält aber dennoch möglichst auf einer High Level Schicht arbeitet.

Ich habe mir Pygame angeschaut welches fast alles bietet was ich brauche bis auf eine Funktion: Das setzen der Position im Musikstream.

Kennt jemand ein Modul welches meinen Anforderungen entspricht?

Schöne Grüße
Miko

Verfasst: Montag 24. März 2008, 15:14
von rayo

Verfasst: Montag 24. März 2008, 17:20
von Miko
Die gibts auf sourceforge nur für Windows. Ich brauch aber was für Linux! Das braucht auch nicht auf Windows laufen. Es reicht wenn die Unixe abgedeckt sind da ich das ganze eh für ein curses Programm verwende.

Verfasst: Montag 24. März 2008, 17:27
von Ene Uran
Dazu ist pysonic auch noch sehr alt. Ich schlage vor wxPython zu verwenden. Hier ist ein Beispiel:

Code: Alles auswählen

# experiment with wxPython's
# wx.media.MediaCtrl(parent, id, pos, size, style, backend)
# the correct backend is usually figured by the control
# wxMEDIABACKEND_DIRECTSHOW   Windows
# wxMEDIABACKEND_QUICKTIME    Mac OS X
# wxMEDIABACKEND_GSTREAMER    Linux
# plays .mid .mp3 .wav .au .avi .mpg

import wx
import wx.media
import os

class MyPanel(wx.Panel):
    def __init__(self, parent, id):
        wx.Panel.__init__(self, parent, -1, 
            style=wx.TAB_TRAVERSAL|wx.CLIP_CHILDREN)
        try:
            self.mc = wx.media.MediaCtrl(self, style=wx.SIMPLE_BORDER)
        except NotImplementedError:
            self.Destroy()
            raise

        loadButton = wx.Button(self, -1, "Load File")
        self.Bind(wx.EVT_BUTTON, self.onLoadFile, loadButton)
        
        playButton = wx.Button(self, -1, "Play")
        self.Bind(wx.EVT_BUTTON, self.onPlay, playButton)
        
        pauseButton = wx.Button(self, -1, "Pause")
        self.Bind(wx.EVT_BUTTON, self.onPause, pauseButton)
        
        stopButton = wx.Button(self, -1, "Stop")
        self.Bind(wx.EVT_BUTTON, self.onStop, stopButton)
     
        ext = ".mid .mp3 .wav .au .avi .mpg"
        self.st_file = wx.StaticText(self, -1, ext, size=(200,-1))
        self.st_size = wx.StaticText(self, -1, size=(100,-1))
        self.st_len  = wx.StaticText(self, -1, size=(100,-1))
        self.st_pos  = wx.StaticText(self, -1, size=(100,-1))
        
        # setup the button and label layout using a sizer
        sizer = wx.GridBagSizer(5,5)
        sizer.Add(loadButton, (1,1))
        sizer.Add(playButton, (2,1))
        sizer.Add(pauseButton, (3,1))
        sizer.Add(stopButton, (4,1))
        sizer.Add(self.st_file, (1, 2))
        sizer.Add(self.st_size, (2, 2))
        sizer.Add(self.st_len,  (3, 2))
        sizer.Add(self.st_pos,  (4, 2))
        # for .avi .mpg video files
        sizer.Add(self.mc, (5,1), span=(5,1))
        self.SetSizer(sizer)

        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.onTimer)
        self.timer.Start(100)
        
    def onLoadFile(self, evt):
        dlg = wx.FileDialog(self, message="Choose a media file",
            defaultDir=os.getcwd(), defaultFile="",
            style=wx.OPEN|wx.CHANGE_DIR )
        if dlg.ShowModal() == wx.ID_OK:
            path = dlg.GetPath()
            self.doLoadFile(path)
        dlg.Destroy()
        
    def doLoadFile(self, path):
        if not self.mc.Load(path):
            wx.MessageBox("Unable to load %s: Unsupported format?" % path,
                "ERROR", wx.ICON_ERROR | wx.OK)
        else:
            folder, filename = os.path.split(path)
            self.st_file.SetLabel('%s' % filename)
            self.GetSizer().Layout()
            self.mc.Play()
        
    def onPlay(self, evt):
        self.mc.Play()
    
    def onPause(self, evt):
        self.mc.Pause()
    
    def onStop(self, evt):
        self.mc.Stop()

    def onTimer(self, evt):
        offset = self.mc.Tell()
        self.st_size.SetLabel('size: %s ms' % self.mc.Length())
        #self.st_len.SetLabel('( %d seconds )' % (self.mc.Length()/1000))
        self.st_pos.SetLabel('position: %d ms' % offset)


app = wx.PySimpleApp()
# create a frame, no parent, -1 is default ID
frame = wx.Frame(None, -1, "play audio and video files", size = (320, 350))
MyPanel(frame, -1)
frame.Show(True)
app.MainLoop()

Verfasst: Montag 24. März 2008, 17:47
von Miko
Danke für die Antworten. Aber es soll eine konsolen Anwendung werden und möglichst auf zusätzliche Installationen (besonders in so großem Umfang wie wx) verzichten.
Deswegen kommt wx für mich nicht in Frage.

Außerdem bekomme ich bei deinem Beispiel einen merkwürdigen Fehler wenn ich das Programm starte:

Traceback (most recent call last):
File "wx_sound_test.py", line 97, in ?
MyPanel(frame, -1)
File "wx_sound_test.py", line 18, in __init__
self.mc = wx.media.MediaCtrl(self, style=wx.SIMPLE_BORDER)
File "/usr/lib/python2.4/site-packages/wx-2.6-gtk2-unicode/wx/media.py", line 96, in __init__
newobj = _media.new_MediaCtrl(*args, **kwargs)
NotImplementedError


Vielleicht meldet sich ja auch der ein oder andere der schon mehrere sound Libaries angeguckt hat und etwas Erfahrung hat.

Verfasst: Montag 24. März 2008, 20:25
von Leonidas
Unter Linux bietet sich das gstreamer mit seinem Python-Binding an. Benutzt habe ich es nicht, wohl aber in Python geschriebene Mediaplayer gesehen, die das nutzen, scheint also funktionsfähig zu sein.

pysonic und FMOD sollten auch unter Linux gehen. Das Problem ist das FMOD non-free ist und ich sowas nur höchst ungerne einsetzen würde. Aber wenn dir das egal ist, kannst du auch diesen Weg gehen.

Verfasst: Dienstag 25. März 2008, 13:57
von Miko
Hättest du vielleicht auch ein Tutorial dazu? Die Sachen die ich im Netz gefunden hab sind nicht sonderlich toll.

Wenn FMOD nicht Open Source ist will ich es nicht wirklich benutzen. Pysonic für Linux war nicht auf den Sourceforge Seiten.

Verfasst: Dienstag 25. März 2008, 14:05
von Leonidas
Miko hat geschrieben:Hättest du vielleicht auch ein Tutorial dazu? Die Sachen die ich im Netz gefunden hab sind nicht sonderlich toll.
Sind die nicht gut?

Verfasst: Dienstag 25. März 2008, 14:08
von Miko
Die Python Tutorials sind alle mit GTK.

Ich hab mir sowas wie bei Pygame erhofft:
http://www.pygame.org/docs/ref/mixer.ht ... ixer.Sound

Aber danke für deine Hilfe. Ich will ja nicht undankbar erscheinen ;-)

Verfasst: Dienstag 25. März 2008, 14:16
von Leonidas
Miko hat geschrieben:Die Python Tutorials sind alle mit GTK.
Dann lass es halt weg. Ich bin mir aber nicht sicher ob du ohne GLib-Mainloop auskommst.

Verfasst: Mittwoch 26. März 2008, 12:44
von lunar
http://pyxine.sourceforge.net/

Ist zwar uralt, aber vielleicht funktioniert das ja.