[Java] Proxy Rtsp & application android

Proxy Rtsp & application android [Java] - Java - Programmation

Marsh Posté le 06-05-2010 à 15:21:07    

Bonjour,
je suis entrain de développer une application sous Android qui permet de lire des vidéos depuis un serveur VOD. l'application utilise le procole RTSP. La particularité de l'application est qu'elle est censé adapté le bitrate de la video en fonction du debit du terminal (si on utilise une connexion 3G, wifi, etc).
 
Pour cela, on va utiliser un Proxy Rtsp. Le proxy Rtsp va instancier VLC en mode "transcodage", c'est ce dernier qui va encoder la vidéo a la volé puis l'envoyer vers le terminal mobile, un petit schéma explicatif :  
http://img532.imageshack.us/img532/4993/helpa.jpg
 
le flux brut arrive sur le serveur de transcodage, puis le serveur de transcodage renvoie la video sur le terminal.
Pour l'instant en phase de devéloppement, j'ai qqs petits soucis :  
 
le proxy fonctionne a peu près correctement, j'arrive avec un client vlc et un vod vlc a lire une vidéo via le proxy.
 
J'essaye ensuite de rediriger la vidéo du VOD vers un autre client VLC qui lui demande a lire un flux UDP mais la ca coince...
niveau trame IP (avec wireshark), j'ai du ICMP "destination unreachable"
 
 
Pour rediriger le flux, je demande au client VLC 1 de demander telle video via le proxy, ensuite je modifie les ports dans les requetes RTSP puis j'envoie le flux audio et video vers un ports X et Y. j'essaye ensuite de lire le flux UDP X avec un client VLC 2 mais ca ne fonctionne pas... qqun aurait une idée?
 
merci!
 
PS : les sources ainsi que l'appli android sont dispo sur ce serveur svn : http://code.google.com/p/androidautotranscodeplayer
 
je met le code si des personnes sont inspirées... :  
 

Code :
  1. import java.io.*;
  2. import java.net.*;
  3. public class proxy {
  4. static private int END = 0;
  5. final static String CRLF = "\r\n";
  6. static private int nb_control = 0;
  7. static private int indes = 0;//pour indiquer qu'on est dans un bloc DESCRIBE
  8. static private int transport =0; //nombre de transport
  9. static String SOURCEAUDIOPORT;
  10. static String SOURCEVIDEOPORT;
  11. static public String convertMsg(String str,int portVod,String Ip){
  12.  String msgModifie;
  13.  if (str.equals("" )){
  14.   msgModifie=CRLF;
  15.  }
  16.  else{
  17.   String controlString = str.split(" " )[0];
  18.   if (controlString.equals("OPTIONS" ) || controlString.equals("PLAY" ) || controlString.equals("PAUSE" )){
  19.    String controlField[] = str.split(" " )[1].split("/" );
  20.    String videoName = controlField[controlField.length -1];
  21.    msgModifie=controlString+" rtsp://" + Ip + ":" + portVod + "/" + videoName + " RTSP/1.0"+CRLF;
  22.   }
  23.   else if(controlString.equals("DESCRIBE" )){
  24.    String controlField[] = str.split(" " )[1].split("/" );
  25.    String videoName = controlField[controlField.length -1];
  26.    msgModifie=controlString+" rtsp://" + Ip + ":" + portVod + "/" + videoName + " RTSP/1.0"+CRLF;
  27.    indes=1;
  28.   }
  29.   else if (controlString.equals("SETUP" )) {
  30.    String controlField[] = str.split(" " )[1].split("/" );
  31.    String videoName = controlField[controlField.length -2];
  32.    String content = controlField[controlField.length -1];
  33.    msgModifie=controlString+" rtsp://" + Ip + ":" + portVod + "/" + videoName + "/" + content + " RTSP/1.0" + CRLF;
  34.   }
  35.   else if (controlString.equals("Transport:" )){
  36.    if (transport==0){
  37.    SOURCEAUDIOPORT = str.split("=" )[1];
  38.    msgModifie="Transport: RTP/AVP;unicast;client_port=10000-10001";
  39.    transport++;}
  40.    else if(transport==2){
  41.     SOURCEVIDEOPORT = str.split("=" )[1];
  42.     msgModifie="Transport: RTP/AVP;unicast;client_port=20000-20001";
  43.     transport++;
  44.    }
  45.    else
  46.    {
  47.     msgModifie=str;
  48.    }
  49.    return msgModifie;
  50.   }
  51.   else if (controlString.equals("TEARDOWN" )){
  52.    String controlField[] = str.split(" " )[1].split("/" );
  53.    String videoName = controlField[controlField.length -1];
  54.    msgModifie=controlString+" rtsp://" + Ip + ":" + portVod + "/" + videoName + " RTSP/1.0"+CRLF;
  55.    END = 1;
  56.   }
  57.   else{
  58.    msgModifie = str+CRLF;
  59.   }
  60.  }
  61.  return msgModifie;
  62. }
  63. static public String convertMsgVOD(String str,int portProxy,String IpProxy){
  64.  String msgModifieVOD;
  65.  if (str.equals("" )){
  66.   msgModifieVOD=CRLF;
  67.  }
  68.  else {
  69.   String controlFieldVOD[] = str.split(":" );
  70.   String controlVOD=controlFieldVOD[0];
  71.   if (controlVOD.equals("a=control" )){
  72.    String fields[] = controlFieldVOD[controlFieldVOD.length -1].split("/" );
  73.    String videoName=fields[1];
  74.    String contentTrack=fields[2];
  75.    msgModifieVOD=controlVOD+":rtsp://" + IpProxy + ":" + portProxy + "/" + videoName + "/" + contentTrack + CRLF;
  76.    nb_control=nb_control+1;
  77.   }
  78.   else if (controlVOD.equals("Transport" ))
  79.   {
  80.    if (transport==1){
  81.    msgModifieVOD="Transport: RTP/AVP/UDP;client_port="+SOURCEAUDIOPORT;
  82.    transport++;}
  83.    else if(transport==3){
  84.     msgModifieVOD="Transport: RTP/AVP/UDP;client_port="+SOURCEVIDEOPORT;
  85.     transport++;}
  86.    else
  87.     msgModifieVOD=str;
  88.   }
  89.   else{
  90.    msgModifieVOD=str+CRLF;
  91.   }
  92.  }
  93.  return msgModifieVOD;
  94. }
  95. public static void main(String[] args ) {
  96.  int portProxy = 5578;
  97.  int portVod = 1234;
  98.  String msgClient;
  99.  String msgModifie;
  100.  String msgVod;
  101.  String msgModifieR;
  102.  try {
  103.   ServerSocket serverSocket = new ServerSocket(portProxy);
  104.   System.out.println("Serv Started: " + serverSocket);
  105.   Socket socketClient = serverSocket.accept();
  106.   InetAddress addVod = InetAddress.getByName("127.0.0.1" );
  107.   Socket socketVod = new Socket(addVod, portVod);
  108.   BufferedReader inSClient = new BufferedReader (new InputStreamReader(socketClient.getInputStream()));
  109.   BufferedReader inSVod = new BufferedReader (new InputStreamReader(socketVod.getInputStream()));
  110.   PrintWriter outVod = new PrintWriter(socketVod.getOutputStream());
  111.   PrintWriter outClient = new PrintWriter(socketClient.getOutputStream());
  112.   do{
  113.    //client -> proxy -> vod
  114.    do{
  115.     msgClient = inSClient.readLine();
  116.     System.out.println("msg client: "+msgClient);
  117.     msgModifie = convertMsg(msgClient,portVod,"127.0.0.1" );
  118.     System.out.println("msg client modifie: " + msgModifie);
  119.     outVod.write(msgModifie);
  120.     outVod.flush();
  121.    }while(!msgClient.equals("" ));
  122.    //vod -> proxy -> client
  123.    do{
  124.     msgVod = inSVod.readLine();
  125.     System.out.println("msg vod: "+msgVod);
  126.     msgModifieR = convertMsgVOD(msgVod,portProxy,"127.0.0.1" );
  127.     System.out.println("msg vod modifi√©: "+msgModifieR);
  128.     outClient.write(msgModifieR);
  129.     outClient.flush();
  130.    }while (!msgVod.equals("" ));
  131.    if (indes==1){
  132.     while(nb_control!=2){
  133.      msgVod = inSVod.readLine();
  134.      System.out.println("msg vod: "+msgVod);
  135.      msgModifieR = convertMsgVOD(msgVod,portProxy,"127.0.0.1" );
  136.      System.out.println("msg vod modifi√©: "+msgModifieR);
  137.      outClient.write(msgModifieR);
  138.      outClient.flush();
  139.     }
  140.     indes=0;
  141.     nb_control=0;
  142.    }
  143.   }while (END ==0);
  144.   socketClient.close();
  145.   socketVod.close();
  146.   serverSocket.close();
  147.  }
  148.  catch (UnknownHostException e) {
  149.   e.printStackTrace();
  150.  }catch (IOException e) {
  151.   e.printStackTrace();
  152.  }
  153. }
  154. }


Message édité par minibox le 06-05-2010 à 15:22:41
Reply

Marsh Posté le 06-05-2010 à 15:21:07   

Reply

Marsh Posté le 08-05-2010 à 19:27:18    

salut,  
il faudrait que tu précises ton environnement réseau: LAN, internet et les connexions des clients:3G, Wifi, etc... pq là ça peut être tout à la fois.
 
Sinon merci pr le partage du code, je début sur android et je dois dire qu'ayant lu bcp de comments comme quoi android c génial, je trouve le sdk assez pourri...


---------------
Voir les RAW sous Android: https://market.android.com/details? [...] .RawVision Blog Photo: http://photouch.me Applications mobiles: http://caketuzz.com Wapcam Project: http://wapcam.mobi
Reply

Marsh Posté le 09-05-2010 à 20:13:45    

oui exacte!
je tourne sous MacOs, pour l'instant, tous les tests sont en localhost!
 
Je pense savoir d'ou ca vient, apparament, le flux UDP est mal redirigé (le "proxy" doit mal réecrire les requetes) , du coup les paquets ne peuvent pas etre "transmis" sur ce port la, ca provoque les messages ICMP! (port unreachable)
 
faut que je compare les requetes RTSP entre le client/proxy et entre le serveur/proxy pour voir si elles sont bien modifiées comme on le souhaite
 
merci en tout cas !
 
Sinon pour le SDK, je trouve que ca va, ca fonctionne bien avec eclipse mais faut juste s'y habituer je pense :)
Après, c'est vrai que android c'est a la mode :P, surtout avec les nouveaux htc qui sont aussi bien que les iphones maintenant!

Message cité 1 fois
Message édité par minibox le 09-05-2010 à 23:47:00
Reply

Marsh Posté le 10-05-2010 à 01:06:20    

minibox a écrit :


Sinon pour le SDK, je trouve que ca va, ca fonctionne bien avec eclipse mais faut juste s'y habituer je pense :)
Après, c'est vrai que android c'est a la mode :P, surtout avec les nouveaux htc qui sont aussi bien que les iphones maintenant!


 
tu as raison, j'ai fini ma première appli et c'est vrai qu'en 2 jours, c'est pas mal. Mais je trouve que pour démarrer c'est assez compliqué. Une fois lancé, ca va mieux ;)
 
Sinon, pour ton projet, débugger RTSP et RTP c'est chaud déjà en normal (j'ai fait un serveur RTSP/RTP pour WapcamServer) alors quand tu rajoutes un proxy, pfiou bonjour l'analyse des trames :(
Je ne peux que te conseiller d'essayer d'utiliser des vrais serveurs, tu y verras qd m plus clair.
 
 


---------------
Voir les RAW sous Android: https://market.android.com/details? [...] .RawVision Blog Photo: http://photouch.me Applications mobiles: http://caketuzz.com Wapcam Project: http://wapcam.mobi
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed