Audiodaten von Windows Media Player bekommen

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.
rotalever
User
Beiträge: 14
Registriert: Montag 8. Oktober 2007, 15:35

Montag 8. Oktober 2007, 15:41

Hallo,
I möchte mp3-files über Python abspielen. Dafür will ich den Windows Media Player benutzen. Es gibt zwar auch gute Python-Bibliotheken, aber da MP3 Patentrechtlich geschützt ist, möchte ich es lieber über den WMP machen. Für das Abspielen habe ich bereits diesen Code gefunden. Ich habe ihn zwar noch nicht ausprobiert, aber er sollte funktionieren.

Code: Alles auswählen

from win32com.client import Dispatch
wmp = Dispatch("WMPlayer.OCX")
wmp.openPlayer("mp3")
newItem = wmp.newMedia("mp3") wmp.currentPlaylist.appendItem(newItem)
Ich hoffe auch mal, dass man den Windows Media Player beim Abspielen nicht sieht ;-)

Allerdings habe ich noch ein kleines Problem, da ich auch Audio Visualisierungen auf den Bildschirm zeichnen muss. Dazu muss ich aber die gerade abgespielte Mp3-Datei wieder vom WMP als Audiodaten zurückbekommen. Wie mache ich das mit Python?
Ich habe gehört, dass das mit irgendwelchen "dshow filtern" funktioniert, davon habe ich aber leider keine Ahnung. Kann mir da irgendjemand helfen? Wenn keiner etwas weiß, würde ich mich auch über einen Ansatz freuen, mit dem ich dann weitersuchen kann.

Danke schon mal.[/code]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 8. Oktober 2007, 16:59

rotalever hat geschrieben:Ich habe ihn zwar noch nicht ausprobiert, aber er sollte funktionieren.
Er wird nicht funktionieren, da in der letzten Zeile zwei Anweisungen drin sind und weil ``newItem`` undefiniert ist.
rotalever hat geschrieben:Allerdings habe ich noch ein kleines Problem, da ich auch Audio Visualisierungen auf den Bildschirm zeichnen muss. Dazu muss ich aber die gerade abgespielte Mp3-Datei wieder vom WMP als Audiodaten zurückbekommen. Wie mache ich das mit Python?

Code: Alles auswählen

audiodatei = file('deinedatei.mp3', 'r')
audiodaten = audiodatei.read()
audiodatei.close()
Wozu man den WMP an dieser Stelle nutzen sollte, ist mir unklar.
rotalever hat geschrieben:Ich habe gehört, dass das mit irgendwelchen "dshow filtern" funktioniert
"DirectShow", falls du eine Suchmaschine verwenden willst.
rotalever hat geschrieben:Wenn keiner etwas weiß, würde ich mich auch über einen Ansatz freuen, mit dem ich dann weitersuchen kann.
GOOM?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Montag 8. Oktober 2007, 17:18

@Leonidas: Ich glaube es sollten die dekodierten Audiodaten gelesen werden und nicht einfach nur die MP3-Datei so wie sie $GOTT, äh der Encoder, geschaffen hat. ;-)

Zum Dekodieren kann man unter anderem die Python-Anbindung an die `libmad` benutzen.
rotalever
User
Beiträge: 14
Registriert: Montag 8. Oktober 2007, 15:35

Montag 8. Oktober 2007, 17:19

Leonidas hat geschrieben: Er wird nicht funktionieren, da in der letzten Zeile zwei Anweisungen drin sind und weil ``newItem`` undefiniert ist.
Jo kleiner Kopierffehler, aber warum ist newItem undefiniert? Da steht doch "newItem = ...".

Code: Alles auswählen

audiodatei = file('deinedatei.mp3', 'r')
audiodaten = audiodatei.read()
audiodatei.close()
Wozu man den WMP an dieser Stelle nutzen sollte, ist mir unklar.
[/quote]
Ganz einfach. Die Audiodaten sind bei MP3 komprimiert. Das ist ja auch grad das Problem. Der Algorithmus zum Entkomprimieren (enthalen in vielen Bibliotheken) ist leider patentiert. WMP bietet eine Schnittstelle zum Abspielen von MP3s. Das Benutzen dieser verstößt aber nicht gegen das Patentrecht. Ist zwar an sich unlogisch, aber damit muss man halt leben. Nur wird jetzt halt das Audio vom WMP abgespielt und ist auch zu hören, aber an die (unkomprimierten) Audiodaten komme ich eben nicht mehr ganz so einfach ran.
Leonidas hat geschrieben: "DirectShow", falls du eine Suchmaschine verwenden willst.
Ja und wie macht man das dann in Python? Habe sowas noch nie gemacht.
Leonidas hat geschrieben: GOOM?
Nene ich will das selber machen.
rotalever
User
Beiträge: 14
Registriert: Montag 8. Oktober 2007, 15:35

Montag 8. Oktober 2007, 17:20

BlackJack hat geschrieben:@Leonidas: Ich glaube es sollten die dekodierten Audiodaten gelesen werden und nicht einfach nur die MP3-Datei so wie sie $GOTT, äh der Encoder, geschaffen hat. ;-)
Da war jemand schneller als ich :D
BlackJack hat geschrieben: Zum Dekodieren kann man unter anderem die Python-Anbindung an die `libmad` benutzen.
Wie gesagt, geht leider aus den genannten Gründen nicht, sonst hätte ich schon die passende Bibliothek.
BlackJack

Montag 8. Oktober 2007, 17:25

Also entweder Du überwindest Deine Abscheu gegenüber dem patentierten Code oder Du steigst auf Ogg Vorbis um. :-)

Edit: Ist das *dekodieren* überhaupt lizenzpflichtig?
rotalever
User
Beiträge: 14
Registriert: Montag 8. Oktober 2007, 15:35

Montag 8. Oktober 2007, 17:30

BlackJack hat geschrieben:Also entweder Du überwindest Deine Abscheu gegenüber dem patentierten Code oder Du steigst auf Ogg Vorbis um. :-)
Das erste möchte ich halt nicht so gerne. Das zweite bringt mir nicht viel, wäre aber prinzipiell das Beste.
BlackJack hat geschrieben: Edit: Ist das *dekodieren* überhaupt lizenzpflichtig?
Ja kostet $50000, selbst bei für den Enduser kostenlosen Opensource Projekten.
Zuletzt geändert von rotalever am Dienstag 9. Oktober 2007, 20:23, insgesamt 1-mal geändert.
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Montag 8. Oktober 2007, 19:03

Hi rotalever,

schade, Mustafas Page ist grad down. Aber er hat zu Deinem Code im ersten Posting auf jeden Fall ne Lösung. In Deinem Script fehlt jedoch natürlich ein

Code: Alles auswählen

wmp.Visible=0
. Über das Decoding weiß ich jedoch auch nichts weiter.

Gruß Andy

EDIT: HA, jetzt ist sie wieder verfügbar! :lol:

Code: Alles auswählen

# this program will play MP3, WMA, MID, WAV files via the WindowsMediaPlayer
from win32com.client import Dispatch
mp = Dispatch("WMPlayer.OCX")
# use an mp3 file you have ...
#tune = mp.newMedia("C:/Program Files/Common Files/HP/Memories Disc/2.0/audio/Swing.mp3")
# or copy one to the working folder ...
#tune = mp.newMedia("Bier1.mp3")
 
# you can also play wma files, this cool sound came with XP ...
tune = mp.newMedia("C:/WINDOWS/system32/oobe/images/title.wma")
mp.currentPlaylist.appendItem(tune)
mp.controls.play()
# to stop playing use
raw_input("Press Enter to stop playing")
 
mp.controls.stop()

Aber statt auf raw_input, solltest Du auf das Script von Leo zugreifen http://www.python-forum.de/post-75664.html#75664
Zuletzt geändert von Andy am Montag 8. Oktober 2007, 19:57, insgesamt 2-mal geändert.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 8. Oktober 2007, 19:37

rotalever hat geschrieben:
Leonidas hat geschrieben: Er wird nicht funktionieren, da in der letzten Zeile zwei Anweisungen drin sind und weil ``newItem`` undefiniert ist.
Jo kleiner Kopierffehler, aber warum ist newItem undefiniert? Da steht doch "newItem = ...".
Sorry, habe ich übersehen. Ungültige Coder verwirrt mich inzwischen genauso wie den Interpreter ;)
rotalever hat geschrieben:Ganz einfach. Die Audiodaten sind bei MP3 komprimiert. Das ist ja auch grad das Problem. Der Algorithmus zum Entkomprimieren (enthalen in vielen Bibliotheken) ist leider patentiert. WMP bietet eine Schnittstelle zum Abspielen von MP3s. Das Benutzen dieser verstößt aber nicht gegen das Patentrecht. Ist zwar an sich unlogisch, aber damit muss man halt leben. Nur wird jetzt halt das Audio vom WMP abgespielt und ist auch zu hören, aber an die (unkomprimierten) Audiodaten komme ich eben nicht mehr ganz so einfach ran.
rotalever hat geschrieben:
Leonidas hat geschrieben: "DirectShow", falls du eine Suchmaschine verwenden willst.
Ja und wie macht man das dann in Python? Habe sowas noch nie gemacht.
Es gibt inzwischen mit DirectPython eine Anbindung an DirectX. Aber DirectX zu nutzen.. ich weiß nicht...
My god, it's full of CARs! | Leonidasvoice vs Modvoice
rotalever
User
Beiträge: 14
Registriert: Montag 8. Oktober 2007, 15:35

Montag 8. Oktober 2007, 19:41

leonidas hat geschrieben: Es gibt inzwischen mit DirectPython eine Anbindung an DirectX. Aber DirectX zu nutzen.. ich weiß nicht...
Das wäre wahrscheinlich etwas overkill :roll:
Aber möglicherweise kann man sich ja aus deren Code was rausholen (wenn nichts anderes mehr hilft).
poker
User
Beiträge: 146
Registriert: Donnerstag 20. September 2007, 21:44

Montag 8. Oktober 2007, 23:44

rotalever hat geschrieben:Es gibt zwar auch gute Python-Bibliotheken, aber da MP3 Patentrechtlich geschützt ist, möchte ich es lieber über den WMP machen.
IMO bezieht sich der Patentschutz nur darauf wenn du selber eine Implementierung des Codecs schreibst oder wenn du einen Proprietären Codec selber im Programm nutzen willst. Auch beziehen sich die Lizenzansprüchen IMO darauf das du Löhnen musst wenn du Kommerziell MP3-Files vermarkten willst (IMO haben die ehe ein an der Klatsche).

rotalever hat geschrieben: Ganz einfach. Die Audiodaten sind bei MP3 komprimiert. Das ist ja auch grad das Problem. Der Algorithmus zum Entkomprimieren (enthalen in vielen Bibliotheken) ist leider patentiert.
rotalever hat geschrieben:
BlackJack hat geschrieben: Edit: Ist das *dekodieren* überhaupt lizenzpflichtig?
Ja kostet $50000, selbst bei für den Enduser kostenlosen Opensource Projekten.
Ja, aber doch nur wenn du selber einen Dekoder **implementierst** und nicht einen bestehenden als backend nutzt(?)
Dennoch können da Projekte wie libavcodec[1] und FFmpeg[1], und VLC das FFmpeg voraussetzt(!) ohne Schwierigkeiten bestehen.


Irgendwie verstehe ich nicht wirklich die Problematik von dir, rotalever, auch wenn ich mir den Thread jetzt schon zum 2 mal durchlese. Du willst ja keinen Codec selber schreiben. -- Deshalb mal für ganz dumme wie mich zusammengefasst:
- Du willst ein Programm schreiben das MP3-Files abspielen kann.
- Du willst zusätzlich den dekodierten Strom abfangen um die Daten weiter zu verarbeiten (In deinem Fall für Visualisierungszwecke)
- Du willst keinen Codec selber schreiben!

Habe ich das soweit erfast? Wenn ja: Wo ist den bitte das Problem!? Binde z.B. FFmpeg ein[1] über ctypes oder schau ob du nen Python Wrapper findest. Songbird ist doch auch Open source und kann viele Medien abspielen :? Und die Zahlen sicherlich auch keine Gebühren :?


[1]: OK, die Lizenz technische Frage ist hier heikel. Aber VLC nutzt FFmpeg auch und keiner hat denen bisher vors knie gefickt! Eventuell wäre es angebracht das du dich mal mit den Devs von VLC in Verbindung setzt und fragst, wie Sie die "rechtliche" diffuse "Problematik" mit FFmpeg umgehen. Nur so als Vorschlag.

Ich denke nämlich, solange du FFmpeg und libavcodec nicht direkt selber mitlieferst sondern **nur** von deinem Programm voraussetzt(!) dürfte es für dich keinerlei Rechtlicher Konsequenzen geben! Das ist aber nur Spekulation, die darauf beruht das VLC das auch nutzt und bisher keine Schwierigkeiten hatte. In dem Fall muss dann der User aus dem FFmpeg selber ein Binary machen (oder pre-comps aus dem netzt saugen).

BTW: Falls ich hier gerade nur müll geschrieben habe, lasst es mich wissen. Aber IMO denke ich, da es sich rotalever etwas zu kompliziert macht :?

Als Abschluss: rotalever setzt dich mit diversen Devs von Open Source Projekten (in dem Bereich) in Verbindung und bespreche diese Thematik mit denen und wie Sie damit umgehen und bis zum welchen Grad es Rechtlich ist.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Dienstag 9. Oktober 2007, 09:02

rotalever hat geschrieben:Ja kostet $50000, selbst bei für den Enduser kostenlosen Opensource Projekten.
Das glaub ich aber kaum oO' Immerhin verwenden viele Programme libmad und ich glaube kaum, dass die 50000 $ zur Verfügung haben... Das entwickeln eines decoders kostet soviel, wie poker schon richtig gesagt hat. Aber mit einer libmad Anbindung hast du ja schon einen hervorragenden decoder...
rotalever
User
Beiträge: 14
Registriert: Montag 8. Oktober 2007, 15:35

Dienstag 9. Oktober 2007, 12:41

Ich habe mich ausgibig informiert, dass jedes, und mit jedes war wirklich jedes gemeint, Projekt die Lizenzgebühren zahlen muss.

Auch wenn man eine Bibliothek benutzt und diese nur einbindet ist es nicht legal. Man darf keinen MP3 Decoder mit seinem Programm ausliefern, wenn man keine Lizenz hat. Egal ob der jetzt selbstprogrammiert ist oder nicht. Das ist Fakt und offiziell exakt genauso bestätigt.

Aber den WMP als Backend zu benutzen ist legal, da er erstens im Windows enthalten ist und nicht beim Programm dabei ist und zweitens von Microsoft eine Lizenz dafür erworben wurde.

Warum existieren so viele Opensource/kostenlose Projekte? Ganz einfach, sie handeln alle illegal. Ob man sich jetzt sagt, dass man auch dieses Risiko eingehen möchte, ist eben eine persönliche Entscheidung der Entwickler.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Dienstag 9. Oktober 2007, 12:43

Vielleicht kannst du uns'ne gute Quelle für diese Behauptung geben. Zu sagen, dass jedes OpenSource Projekt das mit libmad arbeitet illegal handelt, ist doch'ne ziemlich gewagte Aussage oO'
rotalever
User
Beiträge: 14
Registriert: Montag 8. Oktober 2007, 15:35

Dienstag 9. Oktober 2007, 12:48

BlackVivi hat geschrieben:Vielleicht kannst du uns'ne gute Quelle für diese Behauptung geben. Zu sagen, dass jedes OpenSource Projekt das mit libmad arbeitet illegal handelt, ist doch'ne ziemlich gewagte Aussage oO'
Schreib halt eine Email an www.mp3licensing.com

Das ganze wird aber eigentlich auch etwas Offtopic...
Antworten