Mit Python Sound ausgeben?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
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
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

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.
Ene Uran
User
Beiträge: 125
Registriert: Sonntag 17. September 2006, 20:14
Wohnort: Hollywood

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()
Atomkraftwerkaktienbesitzer
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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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 ;-)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lunar

http://pyxine.sourceforge.net/

Ist zwar uralt, aber vielleicht funktioniert das ja.
Antworten