Was ist der Unterschied zwischen aac+ und mp3?
MPEG-4 High Efficiency Advanced Audio Coding (kurz HE-AAC), auch AAC+ v1 genannt, ist ein lizenzpflichtiger Audio-Codec, der Moving Picture Experts Group (MPEG). Der Standard liefert bei niedrigen Bitraten vergleichsweise gute Ergebnisse und eignet sich daher besonders für Live-Streams.
Im Verhältnis zu mp3 bietet aac+ auch bei niedrigen Bitraten (32kbit) eine akzeptable gute Qualität. Allerdings ist aac+ ein lizenzplfichtiger Audio-Codec und für Linux gibt es dafür nicht wirklich viel Software, welche dieses Format encoden können. Decoder gibt es wie Sand am Meer, aber wenn man eben in aac+ Streamen möchte und die Daten als mp3 vorliegen, so braucht man dazu einen Encoder der die Daten von mp3 nach aac+ konvertiert.
Motivation
Ein Bekannter hat mich gestern deshalb gefragt, ob ich dafür eine Lösung parat hätte. Ich habe dann mal etwas ausgefuchst, um einfach den mp3 Stream von Antenne Bayern in aac+ zu konvertieren.
Benötigte Software
Folgende Software wird benötigt:
- shoutcast server
- mp4tools, genauer aacplusenc (lokaler Mirror: http://www.netz-guru.de/mirror/mp4tools/)
- mplayer
- PHP - oder eine andere Scriptsprache, welche Sockets und Stdin lesen und schreiben kann, z.b. Perl
- Linux - (ich habe ubuntu verwendet)
Dies reicht aus um den Stream konvertieren zu können und als aac+ Stream weiter verwenden zu können. Ich gehe davon aus dass Du als User in der Lage bist, shoutcast, mp4tools und mplayer zu installieren.
Let’s do it!
Ich habe dafür auf einem VServer einen user “streaming” angelegt und bin in das Home-Dir des Users gewechselt. Entpacke dort den shoutcast Server. Zunächst müssen wir mit mkfifo einen Fifo erstellen, über den wir später den Stream von Antenne Bayern durchschleusen:
~# mkfifo streamin
Dann müssen wir ein kleines Script schreiben, welches die encodierten aac+ Daten an den Shoutcast-Server übergibt:
#!/usr/bin/php
<?php
$address = "192.168.200.10";
$port = 8000;
$sock = fsockopen($address,($port+1),&$errno, &$errstr, 10);
fputs($sock,"changeme\r\n");
$res = fgets($sock);
wlog($res);
fputs($sock,"icy-name:my Server
icy-genre:
icy-url:http://www.shoutcast.com
icy-irc:%23shoutcast
icy-icq:0
icy-aim:N%2FA
icy-pub:1
icy-br:32
content-type:audio/aacp
icy-reset:1
");
$res = fgets($sock);
wlog($res);
$fd = fopen("php://stdin","r");
while (!feof($fd)) {
$buf = fgets($fd,512);
//wlog("Sending 512 bytes");
fputs($sock,$buf);
}
fclose($fd);
function wlog($msg) {
$fd = fopen("/tmp/ss.log","a");
fputs($fd,$msg."\n");
fclose($fd);
}
?>
Adresse und Port müssen angepasst werden, so dass hier der installierte Shoutcast Server angesprochen wird. Das Script habe ich bei mir als “simple_server.php” gespeichert und die Modes 755 gesetzt, damit dieses direkt über die Console gestartet werden kann (sollte das nicht funktionieren, fehlt php-cli!).
Nun haben wir schon alles was wir benötigen um zu starten:
aacplusenc streamin - 32 | ./simple_server.php & mplayer -ao pcm:file=streamin http://mp3.webradio.antenne.de:80
Dies erzeugt uns den aac+ Stream, welchen man dann z.B. mit VLC oder Winamp über den installierten Shoutcast Server abspielen kann.

10 comments so far
Hallo,
ich hab das hier mal alles nach diese Anleitung gemacht…
Folgende Meldungen bekomme ich:
Starten des SHOUTCast Servers:
alster019:/etc/init.d # ./SI-SHOUTCast_AAC start
Starte SI-AACP Server (Listner Server SHOUTcast)
***********************************************
** SHOUTcast Distributed Network Audio Server
** Copyright (C) 1998-2004 Nullsoft, Inc. All Rights Reserved.
** Use “sc_serv filename.ini” to specify an ini file.
***********************************************
done
alster019:/etc/init.d #
Soweit OK… Server Läuft…
Nun der rest:
alster019:/home/rdt-technik/StreamSystem # aacplusenc streamin -32 | ./aacStream.php & mplayer -ao pcm:file=aacStreamIn http://127.0.0.1:15000/live
-bash: aacplusenc: command not found
: No such file or directoryhp
./aacStream.php: line 2: =: command not found
: command not foundne 2:
./aacStream.php: line 3: =: command not found
: command not foundne 3:
./aacStream.php: line 4: syntax error near unexpected token `(’
‘/aacStream.php: line 4: `$sock = fsockopen($address,($port+1),&$errno, &$errstr, 10);
[1] 6875
MPlayer 1.0rc1-3.3.5 (C) 2000-2006 MPlayer Team
CPU: AMD Opteron(tm) Processor 148 (Family: 15, Model: 39, Stepping: 1)
CPUflags: MMX: 1 MMX2: 1 3DNow: 1 3DNow2: 1 SSE: 1 SSE2: 1
Compiled with runtime CPU detection.
Can’t open joystick device /dev/input/js0: No such device
Can’t init input joystick
mplayer: could not connect to socket
mplayer: Connection refused
Failed to open LIRC support. You will not be able to use your remote control.
Playing http://127.0.0.1:15000/live.
Resolving 127.0.0.1 for AF_INET6…
Couldn’t resolve name for AF_INET6: 127.0.0.1
Connecting to server 127.0.0.1[127.0.0.1]: 15000…
Cache size set to 320 KBytes
Cache fill: 0.00% (0 bytes)
ICY Info: StreamTitle=’Dido - Don`t Leave Home’;StreamUrl=’http://www.sound-inferno.de’;
Audio file file format detected.
==============================================
Opening audio decoder: [mp3lib] MPEG layer-2, layer-3
mpg123: Can’t rewind stream by 680 bits!
AUDIO: 44100 Hz, 2 ch, s16le, 96.0 kbit/6.80% (ratio: 12000->176400)
Selected audio codec: [mp3] afm: mp3lib (mp3lib MPEG layer-2, layer-3)
==============================================
[AO PCM] File: aacStreamIn (WAVE)
PCM: Samplerate: 44100Hz Channels: Stereo Format s16le
[AO PCM] Info: Faster dumping is achieved with -vc null -vo null -ao pcm:fast
[AO PCM] Info: To write WAVE files use -ao pcm:waveheader (default).
MPlayer interrupted by signal 2 in module: ao2_init
[1]+ Exit 2 aacplusenc streamin -32 | ./aacStream.php
alster019:/home/rdt-technik/StreamSystem #
1. Wie bekomme ich den aacplusenc Installiert..? (System suse 9.3)
2. Wie soll sich das phpscript auf dem Server einloggen um überhaupt Streamen zu können..?
Wäre klasse wenn dir dazu noch was einfallen täte..
LG DJ Dac
October 11th, 2008 at 10:54 pm
Um aacplusenc unter SuSE zu bauen, musst Du es wohl von den Sourcen kompilieren.
Die Sourcen findest Du hier:
http://www.netz-guru.de/mirror/mp4tools/aacplusenc-0.17.1.tar.bz2
Weiterhin hast Du PHP überhaupt installiert? - Das Script streamt direkt an den Shoutcast Server - ein Login bei dem Shoutcast Server ist dafür nicht erforderlich, solange Du es lokal benutzt.
October 12th, 2008 at 9:47 am
Hmm naja mplayer rennt aacplusenc auch …
sc_serv sowieso
der encoder greift den source stream auch erfolgreich ab,
aber die source wird beim sc_serv immer sofort nach connect gedroppt. kA wieso ??
December 19th, 2008 at 2:57 pm
Tjo, ohne weitere Infos kann ich dazu natürlich nicht sagen…
December 19th, 2008 at 3:46 pm
ach damn it. entschuldige war mein fehler ich habe das mkfifo im falschen ordner gehabt : P
December 19th, 2008 at 10:20 pm
eine frage habe ich jedoch noch,
bei deinem beispiel greifst du ja den antenne stream ab. dieser ist bekanntlich 24/7 online ohne reconnect.
was ich festgestellt habe ist, das wenn sich bei meinem server der moderator einklinkt und die playlist kickt, reicht die kurze zeit aus das der “transcoder” abschmiert.
besteht eine möglichkeit das zu fixen ?
December 20th, 2008 at 12:44 am
Prinzipiell ja.
Schreibe ein Shell-Script, welches eine While-Schleife durchläuft. Also z.B. while (1) {…} bei jedem reconnect startest Du dann einfach alles wieder von vorne. Sollten nicht mehr als ein paar Zeilen sein:
Leg ein File an: streamwatch.pl:
#!/usr/bin/perl
while (1) {
system(”aacplusenc streamin - 32 | ./simple_server.php & mplayer -ao pcm:file=streamin http://mp3.webradio.antenne.de:80“);
}
dann:
perl streamwatch.pl
Du kannst das auch als screen starten:
screen -dmS mystream perl streamwacht.pl
mit STRG+A+D detachest Du den Screen, mit screen -r mystream holst Du den Screen zurueck.
December 20th, 2008 at 1:18 am
hallo,
halo das System habe ich soweit zum laufen bekommen …
ich habe lediglich das problem, das troz streamwatch
sich das ganze nach 3 4 tagen haengt und sich abschiesst.
ergo ist das leider momentan nicht wirklich tauglich um 24/7 transcoding von mp3 streams zu betreiben
malsehen was die zukunft bringt , obs vielleicht doch irgendwann ne waschechte loesung gibt dieses Vorhaben zu verwirklichen.
January 3rd, 2009 at 10:47 pm
Keine Ahnung, bei mir funktioniert das mit dem Antenne Bayern Stream eigentlich sehr stabil. Was meinst Du denn mit “aufhaengen” - es wird ja sicherlich eine Fehlermeldung angezeigt - wie lautet diese denn?
January 3rd, 2009 at 10:54 pm
Mit aufhaenging meine ich, das mplayer den stream zwar “empfaengt” aber der weitere weg ueber das php zum destination server nicht mehr einwandfrei laeuft.
die php laeuft nicht mehr weiter und ende .
es kann sein das das eventuell was mit den streamtiteln zu tun gat ( aenderung im schnitt alle 15 sec ) was ich aber bezweifel …
wenn ich wieder ueber eine anstaendige leitung verfuege kann ich mal aufm root nachsehen . momentan sind mir dahingehend die haende gebunden …
January 4th, 2009 at 6:04 pm
Leave a Comment