minibox | 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 :
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 :
- import java.io.*;
- import java.net.*;
- public class proxy {
- static private int END = 0;
- final static String CRLF = "\r\n";
- static private int nb_control = 0;
- static private int indes = 0;//pour indiquer qu'on est dans un bloc DESCRIBE
- static private int transport =0; //nombre de transport
- static String SOURCEAUDIOPORT;
- static String SOURCEVIDEOPORT;
- static public String convertMsg(String str,int portVod,String Ip){
- String msgModifie;
- if (str.equals("" )){
- msgModifie=CRLF;
- }
- else{
- String controlString = str.split(" " )[0];
- if (controlString.equals("OPTIONS" ) || controlString.equals("PLAY" ) || controlString.equals("PAUSE" )){
- String controlField[] = str.split(" " )[1].split("/" );
- String videoName = controlField[controlField.length -1];
- msgModifie=controlString+" rtsp://" + Ip + ":" + portVod + "/" + videoName + " RTSP/1.0"+CRLF;
- }
- else if(controlString.equals("DESCRIBE" )){
- String controlField[] = str.split(" " )[1].split("/" );
- String videoName = controlField[controlField.length -1];
- msgModifie=controlString+" rtsp://" + Ip + ":" + portVod + "/" + videoName + " RTSP/1.0"+CRLF;
- indes=1;
- }
- else if (controlString.equals("SETUP" )) {
- String controlField[] = str.split(" " )[1].split("/" );
- String videoName = controlField[controlField.length -2];
- String content = controlField[controlField.length -1];
- msgModifie=controlString+" rtsp://" + Ip + ":" + portVod + "/" + videoName + "/" + content + " RTSP/1.0" + CRLF;
- }
- else if (controlString.equals("Transport:" )){
- if (transport==0){
- SOURCEAUDIOPORT = str.split("=" )[1];
- msgModifie="Transport: RTP/AVP;unicast;client_port=10000-10001";
- transport++;}
- else if(transport==2){
- SOURCEVIDEOPORT = str.split("=" )[1];
- msgModifie="Transport: RTP/AVP;unicast;client_port=20000-20001";
- transport++;
- }
- else
- {
- msgModifie=str;
- }
- return msgModifie;
- }
- else if (controlString.equals("TEARDOWN" )){
- String controlField[] = str.split(" " )[1].split("/" );
- String videoName = controlField[controlField.length -1];
- msgModifie=controlString+" rtsp://" + Ip + ":" + portVod + "/" + videoName + " RTSP/1.0"+CRLF;
- END = 1;
- }
- else{
- msgModifie = str+CRLF;
- }
- }
- return msgModifie;
- }
- static public String convertMsgVOD(String str,int portProxy,String IpProxy){
- String msgModifieVOD;
- if (str.equals("" )){
- msgModifieVOD=CRLF;
- }
- else {
- String controlFieldVOD[] = str.split(":" );
- String controlVOD=controlFieldVOD[0];
- if (controlVOD.equals("a=control" )){
- String fields[] = controlFieldVOD[controlFieldVOD.length -1].split("/" );
- String videoName=fields[1];
- String contentTrack=fields[2];
- msgModifieVOD=controlVOD+":rtsp://" + IpProxy + ":" + portProxy + "/" + videoName + "/" + contentTrack + CRLF;
- nb_control=nb_control+1;
- }
- else if (controlVOD.equals("Transport" ))
- {
- if (transport==1){
- msgModifieVOD="Transport: RTP/AVP/UDP;client_port="+SOURCEAUDIOPORT;
- transport++;}
- else if(transport==3){
- msgModifieVOD="Transport: RTP/AVP/UDP;client_port="+SOURCEVIDEOPORT;
- transport++;}
- else
- msgModifieVOD=str;
- }
- else{
- msgModifieVOD=str+CRLF;
- }
- }
- return msgModifieVOD;
- }
- public static void main(String[] args ) {
- int portProxy = 5578;
- int portVod = 1234;
- String msgClient;
- String msgModifie;
- String msgVod;
- String msgModifieR;
- try {
- ServerSocket serverSocket = new ServerSocket(portProxy);
- System.out.println("Serv Started: " + serverSocket);
- Socket socketClient = serverSocket.accept();
- InetAddress addVod = InetAddress.getByName("127.0.0.1" );
- Socket socketVod = new Socket(addVod, portVod);
- BufferedReader inSClient = new BufferedReader (new InputStreamReader(socketClient.getInputStream()));
- BufferedReader inSVod = new BufferedReader (new InputStreamReader(socketVod.getInputStream()));
- PrintWriter outVod = new PrintWriter(socketVod.getOutputStream());
- PrintWriter outClient = new PrintWriter(socketClient.getOutputStream());
- do{
- //client -> proxy -> vod
- do{
- msgClient = inSClient.readLine();
- System.out.println("msg client: "+msgClient);
- msgModifie = convertMsg(msgClient,portVod,"127.0.0.1" );
- System.out.println("msg client modifie: " + msgModifie);
- outVod.write(msgModifie);
- outVod.flush();
- }while(!msgClient.equals("" ));
- //vod -> proxy -> client
- do{
- msgVod = inSVod.readLine();
- System.out.println("msg vod: "+msgVod);
- msgModifieR = convertMsgVOD(msgVod,portProxy,"127.0.0.1" );
- System.out.println("msg vod modifié: "+msgModifieR);
- outClient.write(msgModifieR);
- outClient.flush();
- }while (!msgVod.equals("" ));
- if (indes==1){
- while(nb_control!=2){
- msgVod = inSVod.readLine();
- System.out.println("msg vod: "+msgVod);
- msgModifieR = convertMsgVOD(msgVod,portProxy,"127.0.0.1" );
- System.out.println("msg vod modifié: "+msgModifieR);
- outClient.write(msgModifieR);
- outClient.flush();
- }
- indes=0;
- nb_control=0;
- }
- }while (END ==0);
- socketClient.close();
- socketVod.close();
- serverSocket.close();
- }
- catch (UnknownHostException e) {
- e.printStackTrace();
- }catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
|
Message édité par minibox le 06-05-2010 à 15:22:41
|