J'ai un problème avec la class NSTask. Je voudrais en fait faire une interface graphique pour un logiciel UNIX.
Pas de problème si c'est un programme qui renvoie un certain nombre de ligne et qui se termine (genre ls, ps, grep ...).
Mais dans mon cas, c'est ffmpeg, logiciel d'encodage qui envoie en continue des données.
J'arrive à récupérer les données que ffmpeg transmet au fur et à mesure et récupérer ce qui m'intéresse, mais ce mécanisme occupe 80 % du processeur ne laissant que 20 % à ffmpeg.
Le problème vient certainement du fait que les données arrivent en continue et très vite. Donc je me demandais si il n'y avait pas moyen de lancer ffmpeg par NSTask et ensuite d'aller chercher les données que toutes les 2 secondes par exemple.
Voilà le code que j'utilise (ça vient de Cocoa Dev Central) ...
Ce qui occupe toutes les ressources, c'est la fonction copyData:.
C'est une boucle qui lit en permanence les données transmises par ffmpeg et les recopie dans un champ de texte.
Pour régler le problème, je pensais faire en sorte que ce qui se trouve dans la boucle ne soit exécuté qu'une fois toutes les 1 ou 2 secondes. Mais est-ce possible ? Ou dois-je procéder autrement ?
Je débute totalement en Objectif C donc si quelqu'un pouvait m'aider, ça serait sympa parce là je suis perdu
Pas de problème si c'est un programme qui renvoie un certain nombre de ligne et qui se termine (genre ls, ps, grep ...).
Mais dans mon cas, c'est ffmpeg, logiciel d'encodage qui envoie en continue des données.
J'arrive à récupérer les données que ffmpeg transmet au fur et à mesure et récupérer ce qui m'intéresse, mais ce mécanisme occupe 80 % du processeur ne laissant que 20 % à ffmpeg.
Le problème vient certainement du fait que les données arrivent en continue et très vite. Donc je me demandais si il n'y avait pas moyen de lancer ffmpeg par NSTask et ensuite d'aller chercher les données que toutes les 2 secondes par exemple.
Voilà le code que j'utilise (ça vient de Cocoa Dev Central) ...
- (IBAction)launchFfmpegid)sender
{
NSTask *ffmprgGo = [[NSTask alloc] init];
NSPipe *pipe=[[NSPipe alloc] init];
NSFileHandle *handle;
NSString *pathToFfmpeg = [NSString stringWithFormat:@"%@%@",[[NSBundle mainBundle] resourcePath],@"/ffmpeg"];
[ffmprgGo setLaunchPath: pathToFfmpeg];
[ffmprgGo setArguments:[NSArray arrayWithObjects:@"-vcodec", @"mpeg4", @"-acodec", @"mp3", @"-b", @"1000", [pathToSplit stringValue] , nil]];
[ffmprgGo setStandardOutput: pipe];
handle=[pipe fileHandleForReading];
[ffmprgGo launch];
[NSThread detachNewThreadSelector:@selector(copyData toTarget:self withObject:handle];
[pipe release];
[ffmprgGo release];
}
- (void)copyDataNSFileHandle*)handle {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSData *data;
while([data=[handle availableData] length]) {
NSString *string=[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
[pourcent setStringValue:string];
[string release];
}
[pool release];
}
@end
Ce qui occupe toutes les ressources, c'est la fonction copyData:.
C'est une boucle qui lit en permanence les données transmises par ffmpeg et les recopie dans un champ de texte.
Pour régler le problème, je pensais faire en sorte que ce qui se trouve dans la boucle ne soit exécuté qu'une fois toutes les 1 ou 2 secondes. Mais est-ce possible ? Ou dois-je procéder autrement ?
Je débute totalement en Objectif C donc si quelqu'un pouvait m'aider, ça serait sympa parce là je suis perdu