Thursday, January 05, 2012

MP3s mit Perl abspielen

Nett und öfter mal wieder gefragt: MP3-Dateien mit Perl abspielen.
Meistens wird dabei auf Module zurückgegriffen, die einen besondeten Player ansprechen. Win32::MediaPlayer, Bundle::Xmms und Win32::MultiMedia::Mci sind Beispiele dafür.

Ein anderer Ansatz ist, SDL dafür zu verwenden. Das hat beispielsweise gegenüber Win32::MultiMedia::Mci den Vorteil, dass das Programm auch auf Nicht-Windows-Systemen wie Appels OS X oder diversen Linux läuft.

SDL steht für Simple DirectMedia Layer und ist eine plattformunabhängige Multimedabibliothek, die in der Programmiersprache C geschrieben ist.

Das SDL-Perl-Projekt unter http://sdl.perl.org stellt eine Anbindung an die SDL-Bibliothek zur Verfügung. Das Modul kann mittlerweile bequem per CPAN installiert werden. Alien::SDL sorgt dabei für eine angenehm reibungslose Installation der Abhängigkeiten von SDL, imdem es den ganzen Prozess des Kompilieren der Abhängigkeiten erledigt.

SDL auf Mac OS X


Apple bringt zwar ein Perl mit, damit zu arbeiten fand ich bislang aber immer sehr mühselig. Deshalb habe ich mir kurzerhand über perlbrew (http://perlbrew.pl/) ein aktuelles Perl installiert. Damit das alles klappt, sollte man das aktuellste XCode (das man so von Apple kostenlos bekommt) installieren. Auf den Installations-CDs ist normalerweise eins dabei.

Was bleibt ist das nicht von Haus aus in Appels Betriebssystem enthaltene lame. Das wird benötigt, um mittels SDL MP3-Dateien abzuspielen. Da die Installation dieser Voraussetzung nicht Aufgabe von Alien::SDL ist, muss man es von Hand machen. Mir hat der unaufwendige Weg über Homebrew (http://mxcl.github.com/homebrew/) sehr gut gefallen.

Es reicht, den Befehl
> brew install lame

einzugeben, und schon ist lame installiert. Es fehlt dann nurnoch SDL Perl:

cpan> install Alien::SDL
cpan> install SDL


Also nochmal zusammengefasst, was man auf einem Mac alles installieren muss, um MP3s abspielen zu können:

  • XCode (neuste Version, aktualisieren nicht vergessen!)

  • perlbrew

  • ein aktuelles Perl (z.B. 5.14.1)

  • homebrew

  • lame

  • Alien::SDL

  • SDL



Das Programm


Nun zum interessanten Part: wie sieht das Programm aus?


#!perl

use strict;
use warnings;
use SDL;
use SDL::Mixer;
use SDL::Mixer::Music;
use SDLx::App;

# -- Initialisierung
SDL::Mixer::init( SDL_INIT_AUDIO | MIX_INIT_MP3 | MUS_MP3 );
unless( SDL::Mixer::open_audio( 44100, AUDIO_S16SYS, 2, 4096 ) == 0 ) {
Carp::croak "Cannot open audio: ".SDL::get_error();
}

# -- Anwendung erstellen
my $app = SDLx::App->new(
title => 'MP3 abspielen',
w => 400,
h => 200,
exit_on_quit => 1,
depth => 32
);

# -- Diese Datei soll abgespielt werden.
my $sound_file = 'music/Musikdatei.mp3';

# -- Datei in den Speicher laden
my $background_music = SDL::Mixer::Music::load_MUS($sound_file);

unless( $background_music ) {
Carp::croak "Cannot load music file [$sound_file]: " . SDL::get_error();
}

# -- Datei abspielen
my $loops = 0; # 0 = 1mal, -1 = unendlich oft
SDL::Mixer::Music::play_music( $background_music, $loops );

$app->run();

SDL::Mixer::Music::halt_music();
SDL::Mixer::close_audio;
exit(0);


Die Musikdatei, die der Einfachheit halber in der Variable $sound_file fest verdrahtet wurde, muss natürlich existieren. Man kann dort wahlweise MP3-, wav- oder ogg-Dateien eintragen. load_MUS() macht den Rest.

Zuerst wird die Hardware initialisiert, dann die Musikdatei geladen und schlussendlich abgespielt. Es ist möglich, die Anzahl der Wiederholungen festzulegen und natürlich kann man das Musikstück auch anhalten und weiterlaufen lassen - auch mit fading. Wie genau, ist in der Manpage von SDL::Mixer::Music enthalten.

Eventuell hat jemand Lust, das obenstehende Programm zu erweitern, so dass man eine Datei auswählen, starten, anhalten und beenden kann?

Ein paar technische Anmerkungen:
Verwendetes OS: Mac OS X snow leopard 10.6.8
Perl: 5.14.1
SDL::version is 1.2.14
SDL::linked_version is 1.2.14

4 comments:

Anonymous said...

Unter Linux ist es möglich Audio und Video Dateien mit GStreamer + Gtk2 (hab' es noch nicht mit Gtk3 versucht) abzuspielen. Eventuell sollte ich da auch mal einen Post drüber schreiben.

Unknown said...
This comment has been removed by the author.
phaylon said...

Okay, noch ein letzter Versuch ob Blogspot einen unkaputten Eintrag annimmt und auch behält:

Auf Linux kann man mit Gtk und GStreamer sowohl Audio als auch Video Dateien relativ einfach abspielen, falls es jemand interessiert. Sollte da mal einen Post drüber machen wenn ich Zeit habe.

--phaylon

Anonymous said...

Du darfst das auch gerne als Artikel für das Perl-Magazin schreiben ;-)