Bonjour à tous
Tout d'abord le contexte:
j'ai plusieurs fichier mp4 (h264) qui ont chacun une durée de 1 heure. Je souhaite les rendre accès en Streaming.
Chaque mp4 possède son fichier .idx qui informe la position de chaque Frame pour chaque seconde, ainsi je peux me déplacer dans mon mp4 à ma guise à l'aide d'une date.
Pour des raison de performance je ne peux pas charger un fichier entièrement.
Pour cela, lorsque je parse mon mp4, je le decoupe en plusieurs isoFile représentant pour chacun 10 sec du mp4.
mes iso sont crée comme suit dans une boucle :
le chargement de ces iso :
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 _output=null; _movie.setTracks( new LinkedList<Track>() ); for (Track aTrack : tracks ) { //position de la derniere frame long lastFrame; int lastidx = timeCodes.size()-1; int idxTrack = tracks.indexOf(aTrack); _startFrame = (fileIndexStart.getTrackPosition()[idxTrack]); //check position de la derniere frame while (true) { FileIndex fi = timeCodes.get( lastidx ); lastFrame = fi.getTrackPosition()[ idxTrack ]; if (lastFrame > _startFrame) { break; } lastidx--; } //création de l'iso // frame de fin = startFrame + 10 sec; int index = timeCodes.indexOf(fileIndexStart); int indexEnd; if( (index+10)>lastidx ) {indexEnd = lastidx;} else {indexEnd = index + 10;} fileIndexEnd = timeCodes.get(indexEnd); _endFrame = (fileIndexEnd.getTrackPosition()[idxTrack]); // if(_endFrame> lastFrame) // { // _endFrame=lastFrame; // } _movie.addTrack( new CroppedTrack( aTrack , _startFrame, _endFrame )); } _output = new DefaultMp4Builder().build(_movie);
coté serveur tout ce passe bien, mais coté navigateur mon mp4 ce stop au bout de la 10e seconde (donc mon premier isoFile)
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 int lastindex = timeCodes.size()-1; while(true) { if(_output != null) { for(int i=0;i<_output.getBoxes().size();i++) { Box abox = _output.getBoxes().get(i); abox.getBox(channel); } int indexFileEnd = timeCodes.indexOf(fileIndexEnd); if(lastindex != indexFileEnd) {setPosition(fileIndexEnd);}// création de l'iso des 10 prochaines secondes else {break;} }else{ break; } } //fin de fichier... return 0;
Je soupçonne que ce soit la faute du header du premier iso qui dit que c'est la fin du chargement, malgré tout, le serveur continue d'envoyer les autre iso
Je ne sais pas trop d'où peut venir le problème et mon expérience en mp4 est très faible
Pour info j'utilise l'api mp4parser
j'ai fais aussi le test sur vlc et même souci
si quelqu'un peut m'aider merci![]()
Partager