Sommaire

Traduction

Objectif

Installer Asterisk 1.4 avec le support de la vidéo 3G sur une distribution Debian etch. Nous utiliserons aussi une carte Digium B410P avec avec port BRI. (T0)

Fonctionne avec :

  • Nokia n95 (SFR)
  • LG Viewty KU 990 (Orange)
  • Nokia E65 (Orange)

Fonctionne pas avec :

  • Sony Ericson k600i (Orange)

Installation / mise à jour de debian

Le première chose à faire sera d'installer un système d'exploitation GNU/Linux. Nous allons choisir la distribution debian. Disponible sur http://www.debian.org.

Une fois l'installation terminé et vu qu'il s'agit d'une installation toute nouvelle, nous devons mettre à jour notre outil de mise à jour.

Lancez dans un prompt

aptitude update
aptitude upgrade

Répondez Y à la mise à jour. Puis rebooter votre machine car il y a sûrement des mises à jour sur le noyau linux.

reboot

Installation des drivers mISDN

Ces drivers nous permettrons d'avoir une connection sur un T0 avec une carte B410P de chez Digium.

Si jamais vous n'avez pas installé les outils de compilation, n'oubliez pas de les installer, ainsi que les kernel headers pour les modules mISDN.

aptitude install build-essential
aptitude install linux-headers-2.6.18-5-686
cd /usr/src
wget http://www.misdn.org/downloads/releases/mISDN-1_1_7.tar.gz
tar xfvz mISDN-1_1_7.tar.gz
cd mISDN-1_1_7
make
make install
cd ..
aptitude install flex
 wget http://www.misdn.org/downloads/releases/mISDNuser-1_1_7.tar.gz
tar xfvz mISDNuser-1_1_7.tar.gz
cd mISDNuser-1_1_7
make
make install


Installation des dépendances pour faire marcher mISDN

aptitude install pciutils bc

Puis configuration de la carte

/etc/init.d/misdn-init scan
/etc/init.d/misdn-init config
/etc/init.d/misdn-init start

Vérification de la présence des dépendances nécessaire.

Dans un terminal utilisez dpkg pour vérifier la présence de openssl, zlib, zlib-devel, curl, libnewt-dev.

dpkg -l libncurses5 libncurses5-dev libssl0.9.7 libssl-dev zlib1g zlib1g-dev curl libnewt-dev
Souhait=inconnU/Installé/suppRimé/Purgé/H=à garder
| État=Non/Installé/fichier-Config/dépaqUeté/échec-conFig/H=semi-installé
|/ Err?=(aucune)/H=à garder/besoin Réinstallation/X=les deux (État,Err: majuscule=mauvais)
||/ Nom                               Version                           Description
+++-=================================-=================================-==================================================================================
ii  libncurses5                       5.4-4                             Shared libraries for terminal handling
ii  libncurses5-dev                   5.4-4                             Developer's libraries and docs for ncurses
ii  libssl0.9.7                       0.9.7e-3sarge4                    SSL shared libraries
ii  libssl-dev                        0.9.7e-3sarge4                    SSL development libraries, header files and documentation
ii  libnewt-dev                       0.52.2-10                         Developer's toolkit for newt windowing library
ii  zlib1g                            1.2.2-4.sarge.2                   compression library - runtime
ii  zlib1g-dev                        1.2.2-4.sarge.2                   compression library - development
ii  curl                              7.13.2-2sarge5                    Get a file from an HTTP, HTTPS, FTP or GOPHER server


Vous devez avoir tous les paquets requis installés.

Si cela n'est pas le cas il faudra les installer avec la commande :

aptitude install libncurses5 libncurses5-dev libssl0.9.7 libssl-dev zlib1g zlib1g-dev curl libnewt-dev

Télécharger les tarballs du code source de la version 1.4

  1. Dans un terminal, connectez vous en root avec sudo -s.
  2. Changez de répertoire
cd  /usr/src 
wget http://downloads.digium.com/pub/asterisk/asterisk-1.4.15.tar.gz
wget http://downloads.digium.com/pub/asterisk/asterisk-addons-1.4.5.tar.gz
wget http://downloads.digium.com/pub/zaptel/zaptel-1.4.7.tar.gz
wget http://downloads.digium.com/pub/telephony/libpri/libpri-1.4.2.tar.gz
wget http://downloads.digium.com/pub/telephony/sounds/asterisk-core-sounds-fr-wav-current.tar.gz
wget http://downloads.digium.com/pub/telephony/sounds/asterisk-moh-freeplay-wav.tar.gz

Décompresser le code source

Toujours en étant connecté en root, dans le répertoire /usr/src, décompressez le code source:

tar xfvz asterisk-1.4.15.tar.gz
tar xfvz asterisk-addons-1.4.5.tar.gz
tar xfvz libpri-1.4.2.tar.gz
tar xfvz zaptel-1.4.7.tar.gz

Vous devez maintenant avoir les répertoires suivants:

libpri-1.4.2
zaptel-1.4.7
asterisk-1.4.15
asterisk-addons-1.4.5

Nous traiterons les fichiers sons et les fichiers de la musique d'attente un peu plus tard.

Compiler Asterisk et ses dépendances

L'ordre que nous devons suivre pour compiler le code

  1. libpri
  2. zaptel
  3. asterisk
  4. asterisk-addons


Vous remarquerez que Zaptel et Asterisk possèdent une étape supplémentaire: make config

Le make config configure linux afin qu'il lance ces applications au démarrage.

cd libpri-1.4.2
make
make install
cd ..
cd zaptel-1.4.7
./configure
make 
make install
make config 
cd ..
cd asterisk-1.4.15
./configure
make
make install
make samples
make config
cd ..
cd asterisk-addons-1.4.5
./configure
make
make install
make samples
cd ..

Après la prochaine étape consistant à redémarrer, vous devez avoir un Asterisk fonctionnel.

Installation du support 3G Asterisk

Développeur : http://sip.fontventa.com

Récupération des outils

aptitude install subversion
aptitude install libpt-1.11.2-dev
cd /usr/src/
svn co http://sip.fontventa.com/svn/asterisk/ asterisk-video
cd asterisk-video

Compilation de la librairie H324M

Comme nous souhaitons utiliser cette librairie avec mISDN, il faudra modifier le fichier h324m.cpp et commenter les lignes avec // qui contiendront TIFFReverseBits.

Fichier:Warning.gif Ceci n'est valable que pour mISDN et non pour zaptel. Voir le lien : http://sip.fontventa.com/content/view/26/53/

Nous allons le modifier avec ce petit patch. Il suffit de le copier dans un fichier, par exemple misdn_patch_h324m.diff puis d'aller dans le répertoire.

Le patch

--- h324m.cpp   2007-12-17 09:06:50.000000000 +0100
+++ h324m.cpp.orig      2007-12-17 09:06:22.000000000 +0100
@@ -40,14 +40,14 @@ 

 int  H324MSessionRead(void * id,unsigned char *buffer,int len)
 { 
-       //TIFFReverseBits(buffer,len);
+       TIFFReverseBits(buffer,len);
        return ((H324MSession*)id)->Read(buffer,len); 
 }
 
 int  H324MSessionWrite(void * id,unsigned char *buffer,int len)
 { 
        int ret = ((H324MSession*)id)->Write(buffer,len); 
-       //TIFFReverseBits(buffer,len);
+       TIFFReverseBits(buffer,len);
       return ret;
}

Puis

cd /usr/src/asterisk-video/libh324m
cp <endroit_de_votre_patch> .

Pour le patcher

patch -p0 < misdn_patch_h324m.diff

Puis nous pourrons compiler la librairie

cd /usr/src/asterisk-video/libh324m
make
make install

Installation du codec AMR

Nous allons installer notre codec AMR afin de pouvoir prendre en compte ce codec qui n'est pas par défaut dans Asterisk.

cd /usr/src/asterisk-1.4.15
patch -p0 < /usr/src/asterisk-video/amr/amr-asterisk-patch.txt
cd codecs
ln -s ../../asterisk-video/amr/amr_slin_ex.h .
ln -s ../../asterisk-video/amr/slin_amr_ex.h .
ln -s ../../asterisk-video/amr/codec_amr.c .
mkdir amr
cd amr
wget http://www.3gpp.org/ftp/Specs/archive/26_series/26.104/26104-700.zip
aptitude install unzip
unzip -j 26104-700.zip
unzip -j 26104-700_ANSI_C_source_code.zip
ln -s ../../asterisk-video/amr/Makefile .

Editer le fichier Makefile dans /usr/src/asterisk-1.4.15/codecs et modifier la ligne 59:

vi /usr/src/asterisk-1.4.15/codecs/Makefile

Changer

$(LIBAMR):
        @$(MAKE) -C amr

par

$(LIBAMR):
        @$(MAKE) -C amr all

Vous pouvez également modifier les fichiers interf_enc.c et interf_dec.c en enlevant les caractères bizarre en fin du fichier. Puis retourner dans les sources d'Asterisk.

cd /usr/src/asterisk-1.4.15/
./configure
make
make install

Rajouter la ligne suivante dans votre fichier de configuration des codecs Asterisk (/etc/asterisk/codecs.conf)

[amr]
octet-aligned=1

Installation de l'application H324 gateway

Cette application permettra d'avoir des commandes pour recevoir et émettre des appels en 3G. Nous allons ajouter un petit Makefile afin de pouvoir recompiler plus facilement notre application.

cd /usr/src/asterisk-video/app_h324m
cat Makefile << EOF
---------- cut ------------
CFLAGS ?= -O2 -fPIC
Z_CFLAGS := $(CFLAGS) -D _GNU_SOURCE -Wall -Wmissing-prototypes -Wstrict-prototypes
LIBS ?=
Z_LIBS := $(LIBS) -lpthread -lh324m

BINARY = app_h324m.so
OBJECTS = app_h324m.o

DESTDIR ?=
PREFIX ?= /usr

.PHONY: install clean

$(BINARY): $(OBJECTS)
        $(CC) -shared -Xlinker -x -o $(BINARY) $(OBJECTS) $(Z_LIBS)

%.o: %.c
        $(CC) $(Z_CFLAGS) -c -o $@ $<

install: $(BINARY)
        install -d $(DESTDIR)$(PREFIX)/lib/asterisk/modules
        install -m 755 $(BINARY) $(DESTDIR)$(PREFIX)/lib/asterisk/modules

clean:
        rm -f $(BINARY) $(OBJECTS)
---------- cut ---------
EOF

Il faudra également modifier le fichier app_h324m.c en ajoutant ligne 48 ce #define.

#define AST_MODULE      "h324m application"


Installation de la librairie mpeg4ip

Cette librairie est une dépendance de l'application app_mp4.

cd /usr/src/
wget http://heanet.dl.sourceforge.net/sourceforge/mpeg4ip/mpeg4ip-1.5.0.1.tar.gz
tar xfvz mpeg4ip-1.5.0.1.tar.gz
cd mpeg4ip-1.5.0.1
aptitude install libtool
./bootstrap
./configure --disable-player --prefix=/usr
make
make install


Installation de l'application app_mp4

Nous allons encore une fois créer un fichier Makefile.

cd /usr/src/asterisk-video/app_mp4
cat Makefile << EOF
---------- cut ------------
CFLAGS ?= -O2 -fPIC
Z_CFLAGS := $(CFLAGS) -D _GNU_SOURCE -Wall -Wmissing-prototypes -Wstrict-prototypes
LIBS ?=
Z_LIBS := $(LIBS) -lpthread -lmp4 -lmp4v2

BINARY = app_mp4.so
OBJECTS = app_mp4.o

DESTDIR ?=
PREFIX ?= /usr

.PHONY: install clean

$(BINARY): $(OBJECTS)
        $(CC) -shared -Xlinker -x -o $(BINARY) $(OBJECTS) $(Z_LIBS)

%.o: %.c
        $(CC) $(Z_CFLAGS) -c -o $@ $<

install: $(BINARY)
        install -d $(DESTDIR)$(PREFIX)/lib/asterisk/modules
        install -m 755 $(BINARY) $(DESTDIR)$(PREFIX)/lib/asterisk/modules

clean:
        rm -f $(BINARY) $(OBJECTS)
---------- cut ---------
EOF

Modifier la ligne 51 du fichier app_mp4.c et ajouter ceci :

#define AST_MODULE      "MP4 application"

Puis lancer la compilation avec :

make
make install


Compilation de l'application app_rtsp

Permet de streamer du flux RTSP.

CFLAGS ?= -O2 -fPIC
Z_CFLAGS := $(CFLAGS) -D _GNU_SOURCE -Wall -Wmissing-prototypes -Wstrict-prototypes
LIBS ?=
Z_LIBS := $(LIBS) -lpthread 

BINARY = app_rtsp.so
OBJECTS = app_rtsp.o

DESTDIR ?=
PREFIX ?= /usr

.PHONY: install clean

$(BINARY): $(OBJECTS)
        $(CC) -shared -Xlinker -x -o $(BINARY) $(OBJECTS) $(Z_LIBS)

%.o: %.c
        $(CC) $(Z_CFLAGS) -c -o $@ $<

install: $(BINARY)
        install -d $(DESTDIR)$(PREFIX)/lib/asterisk/modules
        install -m 755 $(BINARY) $(DESTDIR)$(PREFIX)/lib/asterisk/modules

clean:
        rm -f $(BINARY) $(OBJECTS)


Ne pas oublier aussi de rajouter le #define dans le fichier app_rtsp.c

#define AST_MODULE "Rtsp application"

Comme fait précédement, copier le fichier Makefile puis taper :

make
make install

Pour l'utiliser mettez dans votre sip.conf dans [general].

videosupport=yes

disable=all
allow=ulaw
allow=alaw
allow=h263
allow=h263p

Puis dans votre dialplan (/etc/asterisk/extensions.conf) dans la section [default] par exemple :

[default]
exten => 5003,1,Answer()
exten => 5003,n,Rtsp(rtsp://192.168.1.1/live.sdp)
exten => 5003,n,Hangup()

Installation de l'application app_transcoder

aptitude install libavcodec-dev

Fichier:Warning.gif Le fichier swscale.h est explicitement effacer par le packaging de debian car il est vu comme plus utilisé. Nous allons donc le récupérer pour compiler correctement notre application.

Ajouter un repository source dans votre fichier /etc/apt/sources.list.

deb-src http://ftp.fr.debian.org/debian/ etch main contrib non-free

Puis télécharger les sources de ffmpeg.

cd /usr/src
apt-get source ffmpeg

Puis nous allons copier l'header manquant dans le répertoire des includes.

cp /usr/src/ffmpeg-0.cvs20060823/libavcodec/swscale.h /usr/include/ffmpeg/

Ajouter dans le fichier app_transcoder.c à la ligne 47.

#define AST_MODULE      "Transcoder application"

Puis mettez le fichier Makefile

CFLAGS ?= -O2 -fPIC
Z_CFLAGS := $(CFLAGS) -D _GNU_SOURCE -Wall -Wmissing-prototypes -Wstrict-prototypes
LIBS ?=
Z_LIBS := $(LIBS) -lpthread -lavcodec

BINARY = app_transcoder.so
OBJECTS = app_transcoder.o

DESTDIR ?=
PREFIX ?= /usr

.PHONY: install clean

$(BINARY): $(OBJECTS)
        $(CC) -shared -Xlinker -x -o $(BINARY) $(OBJECTS) $(Z_LIBS)

%.o: %.c
        $(CC) $(Z_CFLAGS) -c -o $@ $<

install: $(BINARY)
        install -d $(DESTDIR)$(PREFIX)/lib/asterisk/modules
        install -m 755 $(BINARY) $(DESTDIR)$(PREFIX)/lib/asterisk/modules

clean:
        rm -f $(BINARY) $(OBJECTS)

Puis il suffira de lancer :

make
make install

Pour s'en servir ajouter dans le fichier extensions.conf dans la section [default]:

exten => 5004,1,Answer()
exten => 5004,n,Transcode(,s@camera,h263@qcif/fps=10/kb=52/qmin=4/qmax=12/gs=50)
exten => 5004,n,Hangup()

[camera] 
exten => s,1,Answer()
exten => s,n,Rtsp(http://192.168.1.2/live.sdp)
exten => s,n,Hangup()

Installation de l'outils pcm2mp4

cd /usr/src/asterisk-video/tools
make
cp mp4band pcm2mp4 /usr/bin/

Configuration de misdn.conf

Voici le fichier de configuration misdn.conf, situé dans /etc/asterisk que j'utilise.

[general] 
misdn_init=/etc/misdn-init.conf
debug=0
ntdebugflags=0
ntdebugfile=/var/log/misdn-nt.log
ntkeepcalls=no
bridging=no
l1watcher_timeout=0
stop_tone_after_first_digit=yes
append_digits2exten=yes
dynamic_crypt=no
crypt_prefix=**
crypt_keys=test,muh

[default]
context=from-misdn
language=fr
musicclass=default
senddtmf=yes
far_alerting=no
allowed_bearers=all
nationalprefix=0
internationalprefix=00
rxgain=0
txgain=0
te_choose_channel=no
pmp_l1_check=no
reject_cause=16
need_more_infos=no
nttimeout=no
method=standard
overlapdial=yes
dialplan=0
localdialplan=0
cpndialplan=0
early_bconnect=yes
incoming_early_audio=yes
nodialtone=no
presentation=-1
screen=-1
echocancel=no
echotraining=no
jitterbuffer=4000
jitterbuffer_upper_threshold=0
hdlc=yes
max_incoming=-1
max_outgoing=-1

[extern]
ports=1,2
msns=*

Dialplan Asterisk

Faut pouvez maintenant créer un appel depuis l'extérieur vers votre Asterisk comme cale par exemplen en éditant votre fichier extensions.conf dans /etc/asterisk.

[default]

exten => 5002,1,H324m_gw(sylvain@3gp_videos)

exten => 5003,1,Answer()
exten => 5003,n,Rtsp(rtsp://192.168.1.1/live.sdp)
exten => 5003,n,Hangup()

exten => 5004,1,Answer()
exten => 5004,n,Transcode(,s@camera,h263@qcif/fps=10/kb=52/qmin=4/qmax=12/gs=50)
exten => 5004,n,Hangup()

[camera]
exten => s,1,Answer()
exten => s,n,Rtsp(http://192.168.1.2/live.sdp)
exten => s,n,Hangup()

[3gp_videos]

exten => sylvain,1,H324m_gw_answer()
exten => sylvain,n,Video_loopback()

[from-misdn]

exten => 9965,1,Goto(default,5002,1)


Mini tutoriel MP4

Voici le tutoriel proposé par Sergio García sur son site web mais en Français. (Référence : http://sip.fontventa.com/content/view/34/66/)

Nous allons juste installer une dépendance requise pour ce tutoriel.

aptitude install ffmpeg

Le fichier est téléchargeable ici : http://sip.fontventa.com/files/sample_300kbit_ulaw.3gp

Avant de pouvoir utiliser un fichier mp4 avec app_rtsp et le streamer depuis un serveur avec un téléphone vidéo, il doit être encoder avec un format que support le téléphone.

Beaucoup de serveurs de streaming support les fichiers de type mp4/3gp. Le format h263-1998 reste cependant le meilleur choix pour encoder une vidéo et il existe beaucoup d'outils pour l'éditer/modifier. Le problème est que les codecs audio utilisé sur un téléphone vidéo (gsm/speech/g723/g729) ne sont pas spécialement utilisé pour faire du streaming contrairement à AAC/MP3.

Le format de fichier mp4 permet de stocker n'importe quelle type de donnée, mais pas beaucoup d'outils sont capable de nous permettre de faire cela.

L'outils pcm2mp4 permet de créer un fichier mp4 avec une piste audio PCMU (ulaw). Il peux être utilisé pour faire des tests de streaming. D'autres codecs pourrait être facilement intégré)

Nous allons utiliser un fichier de sample converti en h263 pour ce mini tutoriel.

$ mp4info sample_300kbit.3gp
mp4info version 1.5.0.1
sample_300kbit.3gp:
Track Type Info
201 video H.263, 69.973 secs, 94 kbps, 176x144 @ 10.003859 fps
65335 hint Payload H263-2000 for track 201
101 audio MPEG-4 AAC LC, 70.000 secs, 8 kbps, 12000 Hz
65435 hint Payload MP4A-LATM for track 101
1 od Object Descriptors
2 scene BIFS

D'abord nous allons extraire les deux média de notre fichier.

$ mp4creator -extract=201 sample_300kbit.3gp
$ mv sample_300kbit.3gp.t201 sample_300kbit.263
$ mp4creator -extract=101 sample_300kbit.3gp
$ mv sample_300kbit.3gp.t101 sample_300kbit.aac


Puis nous allons convertir l'audio AAC en fichier PCMU.

$ ffmpeg -i sample_300kbit.aac -acodec pcm_mulaw -ar 8000 -ac 1 -f mulaw sample_300kbit.mulaw
FFmpeg version SVN-rUNKNOWN, Copyright (c) 2000-2006 Fabrice Bellard, et al.
configuration: --prefix=/usr --libdir=${prefix}/lib --shlibdir=${prefix}/lib --incdir=${prefix}/include/ffmpeg --enable-shared --enable-mp3lame
--enable-gpl --enable-faad --mandir=${prefix}/share/man --enable-vorbis --enable-pthreads --enable-faac --enable-xvid --enable-dts --enable-amr_nb
--enable-amr_wb --enable-pp --enable-libogg --enable-libgsm --enable-x264 --enable-a52 --extra-cflags=-Wall -g -fPIC -DPIC --cc=ccache cc
libavutil version: 49.1.0
libavcodec version: 51.28.0
libavformat version: 51.7.0
built on Jan 19 2007 17:05:58, gcc: 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
Input #0, aac, from 'sample_300kbit.aac':
Duration: 00:01:09.4, start: 0.000000, bitrate: 8 kb/s
Stream #0.0: Audio: aac, 12000 Hz, mono, 8 kb/s
Output #0, mulaw, to 'sample_300kbit.mulaw':
Stream #0.0: Audio: pcm_mulaw, 8000 Hz, mono, 64 kb/s
Stream mapping:
Stream #0.0 -> #0.0
Press [q] to stop encoding
size= 2184kB time=70.0 bitrate= 64.0kbits/s
video:0kB audio:2184kB global headers:0kB muxing overhead 0.000000%

Nous allons maintenant utiliser l'outils pour créer un nouveau fichier mp4 avec notre fichier audio converti en PCMU.

$ /usr/bin/pcm2mp4 sample_300kbit.mulaw sample_300kbit_ulaw.3gp
$ mp4info sample_300kbit_ulaw.3gp
mp4info version 1.5.0.1
sample_300kbit_ulaw.3gp:
Track Type Info
1 audio G.711 uLaw, 70.000 secs, 64 kbps, 8000 Hz
2 hint Payload PCMU for track 1

Ensuite nous allons juste rajouter la parti video h263 dedans.

$ mp4creator -create=sample_300kbit.263 sample_300kbit_ulaw.3gp
$ mp4info sample_300kbit_ulaw.3gp
mp4info version 1.5.0.1
sample_300kbit_ulaw.3gp:
Track Type Info
1 audio G.711 uLaw, 70.000 secs, 64 kbps, 8000 Hz
2 hint Payload PCMU for track 1
3 video H.263, 69.903 secs, 94 kbps, 176x144 @ 10.013876 fps
$ mp4creator -hint=3 sample_300kbit_ulaw.3gp
$ mp4info sample_300kbit_ulaw.3gp
mp4info version 1.5.0.1
sample_300kbit_ulaw.3gp:
Track Type Info
1 audio G.711 uLaw, 70.000 secs, 64 kbps, 8000 Hz
2 hint Payload PCMU for track 1
3 video H.263, 70 secs, 94 kbps, 176x144 @ 10.013876 fps
4 hint Payload H263-2000 for track 3
Metadata Tool: mp4creator 1.5.0.1