Bonjour à vous,

Je suis actuellement stagiaire chez un gros opérateur télécom (pour ne pas le citer).
Mon sujet consiste à évaluer les performances de la technologie WebRTC sur les browsers Firefox et Chrome.
J'ai d'abord étudié le fonctionnement de l'application Firefox Hello pour comprendre ce qu'est la technologie WebRTC, voir son fonctionnement, l'échange de média etc.

Puis j'ai commencé mon étude en utilisant le site https://apprtc.appspot.com/ sur les 2 browsers, afin de comparer le comportement de chaque browser sur une même plateforme webRTC. Jusque là aucun problème majeur, si ce n'est que je ne maîtrise pas l'injection de contenu, le débit audio/vidéo et les codeurs choisis pour les streams. Car il faut savoir que Chrome comme Firefox bride le débit vidéo aux alentours de 2,2Mb/sec. Cela a un intérêt pour ne pas surcharger une connexion, seulement il est peut-être possible d'avoir une qualité meilleure en débridant le débit et en utilisant un codeur moins gourmand (le VP8 étant le codeur systématiquement sélectionné par les appli).

Une formation a été donnée à mes collègues afin de pouvoir développer sa propre application WebRTC en javascript, assez minimaliste mais qui permet de gérer de bout-en-bout toutes les contraintes médias. Je peux ainsi injecter du contenu HD-1080p d'un côté de la com', débrider le débit à une valeur que je maîtrise et obtenir en restitution la même résolution. Je précise toutefois que cette application a été utilisée en premier sur Chrome.
A chaque fois je modifie le contenu du SDP afin de pouvoir gérer le débit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
localSDP.sdp = localSDP.sdp.replace( /a=mid:video\r\n/g , 'a=mid:video\r\nb=AS:4000\r\n');
Ici je bride le débit vidéo à 4Mb/sec.

J'ai pu donc réaliser toutes mes manipulations sans problème sur Chrome. Mais il me faut pouvoir comparer mes résultats avec un autre codeur vidéo.
Sur Mozilla Firefox, le codeur H.264 est géré. Par conséquent je modifie le code source de mon appli javascript afin de forcer dans le SDP le choix du codeur H.264 à la place du VP8 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
localSDP.sdp = localSDP.sdp.replace( / 120 126 /g,' 126 ');
Ici, je remplace dans le SDP le codeur VP8 (identifié par le code 120) par le codeur H.264 (identifié par le code 126).
Je fais de même pour le codeur audio G.722 à la place du opus.
Si forcer les codeurs ne pose aucun problème, c'est la partie des media-stream qui devient compliquée sur Firefox.
En effet, si j'injecte du contenu 1080p mais que je ne modifie pas la résolution dans l'application pour une transmission 1080p de bout-en-bout, je me retrouve avec un affichage vidéo downscalé en 640x480. Peu importe le contenu injecté, il sera transmit en 640x480.
Mais si je modifie la résolution pour une transmission 1080p (par exemple), j'ai un affichage 1080p mais je perds le stream audio.
D'ailleurs, au lancement de la com' le browser ne me demande même pas de partager mon micro si je modifie la résolution.

Pour expliquer un peu comment fonctionne l'application je donne quelques bouts de code (Je ne peux fournir le code en entier, n'étant pas le développeur de l'appli) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
var mediaConstraints = {video:true,audio:true};
[...]
mediaConstraints = generateMediaConstraints();
[...]
function generateMediaConstraints(){
	if (replaceResolution == true && replaceFPS == true && replaceRatio == true){
		return {
                            video: {
                                mandatory: {
                                    maxWidth: userMaxWidht.value,
                                    maxHeight: userMaxHeight.value,
                                    minWidth: userMinWidht.value,
                                    minHeight: userMinHeight.value,
									maxAspectRatio: userRatio.value,
									minAspectRatio: userRatio.value,
									minFrameRate: userFPS.value,
									maxFrameRate: userFPS.value
                                    }
                            }
                        };
	}
	else if(replaceResolution == true && replaceFPS == true && replaceRatio == false){
		return {
                            video: {
                                mandatory: {
                                    maxWidth: userMaxWidht.value,
                                    maxHeight: userMaxHeight.value,
                                    minWidth: userMinWidht.value,
                                    minHeight: userMinHeight.value,
									minFrameRate: userFPS.value,
									maxFrameRate: userFPS.value
                                    }
                            }
                        };
	}
	else if(replaceResolution == true && replaceFPS == false && replaceRatio == true){
		return {
                            video: {
                                mandatory: {
                                    maxWidth: userMaxWidht.value,
                                    maxHeight: userMaxHeight.value,
                                    minWidth: userMinWidht.value,
                                    minHeight: userMinHeight.value,
									maxAspectRatio: userRatio.value,
									minAspectRatio: userRatio.value
                                    }
                            }
                        };
	}
	else if(replaceResolution == true && replaceFPS == false && replaceRatio == false){
		return {
                            video: {
                                mandatory: {
                                    maxWidth: userMaxWidht.value,
                                    maxHeight: userMaxHeight.value,
                                    minWidth: userMinWidht.value,
                                    minHeight: userMinHeight.value
                                    }
                            }
                        };
	}
	else if(replaceResolution == false && replaceFPS == true && replaceRatio == true){
		return {
                            video: {
                                mandatory: {
									maxAspectRatio: userRatio.value,
									minAspectRatio: userRatio.value,
									minFrameRate: userFPS.value,
									maxFrameRate: userFPS.value
                                    }
                            }
                        };
	}
	else if(replaceResolution == false && replaceFPS == true && replaceRatio == false){
		return {
                            video: {
                                mandatory: {
									minFrameRate: userFPS.value,
									maxFrameRate: userFPS.value
                                    }
                            }
                        };
	}
	else if(replaceResolution == false && replaceFPS == false && replaceRatio == true){
		return {
                            video: {
                                mandatory: {
									maxAspectRatio: userRatio.value,
									minAspectRatio: userRatio.value
                                    }
                            }
                        };
	}
	else{
		return {video:true,audio:true}
	}
}
J'ai essayé de placer la variable audio dans une des sous-conditions de la fonction, par exemple dans celle-ci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
else if(replaceResolution == true && replaceFPS == false && replaceRatio == false){
Je peux effectivement obtenir mon stream audio mais je ne peux plus modifier la résolution.
Donc soit c'est tout l'un, soit c'est tout l'autre. Je n'arrive pas à comprendre pourquoi et/ou comment.
Les collègues qui ont développé cette application ne sont plus disponibles. Je suis très mauvais en dev et je n'ai aucune logique niveau algo... Ca fait 1 semaine que je bloque sur ce problème, je ne vois pas comment faire. Certes j'ai encore 1 mois et demi de stage mais j'aimerais ne pas perdre trop de temps là-dessus, surtout que j'ai des résultats à fournir.

Pourriez-vous m'aider à trouver solution à mon problème ?

Cdlt,

dulquen.