Howto convert mp3-Streams to aac+ Streams in Linux

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:

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"); // Passwort ändern!
$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.

26 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

DJ Dac
October 11th, 2008 at 22:54

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.

Florian Wiessner
October 12th, 2008 at 09:47

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 ??

DoCC
December 19th, 2008 at 14:57

Tjo, ohne weitere Infos kann ich dazu natürlich nicht sagen…

Florian Wiessner
December 19th, 2008 at 15:46

ach damn it. entschuldige war mein fehler ich habe das mkfifo im falschen ordner gehabt : P

DoCC
December 19th, 2008 at 22:20

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 ?

DoCC
December 20th, 2008 at 00:44

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.

Florian Wiessner
December 20th, 2008 at 01:18

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.

DoCC
January 3rd, 2009 at 22:47

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?

Florian Wiessner
January 3rd, 2009 at 22:54

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 …

DoCC
January 4th, 2009 at 18:04

Hallo,
und wie bekomme ich einen aac+ Stream in mp3 Stream umgewadelt?
Danke im Vorraus ;-)

Gruß
Dado

Dado
January 11th, 2009 at 19:30

Hallo!

Wie meldet sich das Skript denn am AAC Shoutcast Server an? Irgendwo müsste ich doch Benutzernamen und Passwort eingeben können..
Oder encodet der DJ direkt auf das Skript. Irgendwie steige ich da noch nicht ganz durch! Danke

Gruß

Nimda05

Nimda05
February 22nd, 2009 at 20:54

Das Skript ist dazu gedacht, direkt auf dem Server zu laufen und den Stream als mp3 von einem Shoutcast Server zu holen, transcodieren und dann direkt lokal an einen weiteren Shoutcast-Server zu streamen – hierbei wird dann kein User/Passwort benötigt.

Florian Wiessner
February 23rd, 2009 at 08:45

Und wie muss ich die sc_serv.conf verändern, damit der auf die streamin zugreift? oder muss ich das php file als backupfile angeben?

mfg
trl

TRL
March 10th, 2009 at 22:05

Überhaupt nicht – das PHP Script leitet den transcodierten Stream ja direkt zu Shoutcast, welcher diesen dann streamt. Die FIFOs werden nur zum transcodieren verwendet und shoutcast greift darauf überhaupt nicht direkt zu.

Florian Wiessner
March 10th, 2009 at 22:35

hmm, ok, nett wäre auch noch wenn du mir evtl. mal genau sagen könntest, wohin der stream genau geht.

TRL
March 10th, 2009 at 22:49

Siehe Dir mal die ersten zwei Zeilen des PHP-Skripts genau an, dann kommst Du selbst drauf…

Florian Wiessner
March 10th, 2009 at 23:15

jaa, nurr wenn ich den port auf 8011 setze (mein shoutcast port läuft auf 8010) dann spuckt er mir ein fehler aus (Zeile 27 im php Skript)
setze ich den port im script auf 8010 dann steht der stream weiterhin auf offline

TRL
March 11th, 2009 at 12:27

Hat sich schon geklär, du solltest evttl noch sagen, dass sie ihr shoutcast pw (das zum streamen) eintragen sollen, wo changeme steht
fputs($sock,”changeme\r\n”); <<<— daaa

greez
TheRealLink

TRL
March 11th, 2009 at 16:11

Sehr geiles tut, hab es mal ausprobiert hab zwar paar anlaufschwierigkeiten gehabt aber nun läuft es 1A

die quali von aacplusenc kommt zwar nicht ganz an die von z.B. Winamp Encoder ran aber es ist kostenlos uns immernoch wesentlich besser als MP3 mit 32Kbit

aPollO
April 16th, 2009 at 17:20

Gibt es eine Möglichkeit, mit diesem Verfahren an einen Darwin-Server zu streamen, incl. der Erstellung der SDP ?
Was muss ich tun ?

Marth
June 24th, 2009 at 13:55

Gute Frage – allerdings kann ich die so kaum beantworten. Welches Protokoll verwendet denn der Darwin-Server? Was meinst Du mit “Erstellung der SDP?”

Florian Wiessner
July 2nd, 2009 at 08:36

Der Darwin-Server (freie alternative zu Apple’s Quicktime-Streaming-Server) verwendet RTSP als Protokoll. Der AAC+ Stream sollte über RTP an Darwin zugeliefert werden (dazu gehört eine Beschreibungsdatei, die SDP = Session Description Protokoll).

Abgeholt wird der Stream vom Nutzer über RTSP. Dies macht vorallem im Mobile-Streaming-Sektor sinn, da viele mobile Endgeräte (allen voran Sony-Ericson-Handys) RTSP-fähige Realplayer integriert haben und somit die bandbreitenarmen Streams in bester Qualität abgreifen können. Shoutcast können mobile Endgeräte ohne Zusatzsoftware (und die gibt es oft nicht) leider nicht verarbeiten. Genau das möchte ich jedoch realisieren.
Any idea ?

Marth
July 9th, 2009 at 09:53

Prinzipiell sollte das gehen, sofern man den simple_server.php etwas umbaut. Mir ist allerdings keine PHP-Klasse zum streamen für RTSP/RTP bekannt und eine 1-min Googlesuche hat hier auch auf die Schnelle nichts gebracht.
Theoretisch kann man auch mit einer anderen Script-Sprache oder Programm streamen, welches RTP beherrscht…

Florian Wiessner
July 9th, 2009 at 21:13

Hallo,
Ich habe die Anleitung genau befolgt und es scheint bis auf einen kleinen Felhler alles zu funktionieren. Nur sagt er mit das er kein “ADTS File” erstellen kann…. Alles startet, er verbindet siuch mit dem server und dann wenn er versucht die wiedergabe zu “starten” sagt er das er kein adts file erstellen kann und dann kommt die meldung “MPlayer interrupted by signal 13 in module: play_audio”

Was mache ich falsch?

gruß
Arsimael

Arsimael
August 23rd, 2009 at 18:26

Das scheint mir mehr daran zu liegen, dass deine Quelle bereits aac ist und Du eventuell nicht die libs zum decoden von aac im mplayer compiliert hast.

Florian Wiessner
September 4th, 2009 at 09:29

Leave a Comment

Name (required)

Mail (will not be published) (required)

Website

Comment