Bonjour à tous,

Je me débats sur un problème depuis plusieurs jours. Etant totalement débutant en programmation multithread, je dois lancer de manière parallèle des encodages vidéos avec une application externe : ffmpeg.exe.
Je développe en C# .net 4.0.

Je possède un wrapper permettant donc de créer un processus pour lancer l'encodage.

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
using (Process process = new Process())
                {
                    process.StartInfo.FileName = encoderPath + "ffmpeg.exe";
 
                    process.StartInfo.UseShellExecute = false;
                    process.StartInfo.RedirectStandardOutput = true;
                    process.StartInfo.RedirectStandardError = true;
                    process.StartInfo.CreateNoWindow = false;
 
                    ...
 
                    arguments += " " + filenameOutput + " ";
 
                    process.StartInfo.Arguments = arguments;
                    process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                    process.Start();
 
                    bool succes = LireSortie(process);
                    process.WaitForExit();
                    process.Close();
                    return succes;
                }
            }
Ce procédé lance et termine bien la commande quand exécutée normalement.

Seulement, je dois lancer divers encodages pour un même fichier en plusieurs formats et le tout simultanément.
Ce que j'effectue avec le code ci-dessous. Le deuxième paramètre des méthodes représente le nombre de threads (mis par défaut à 1, car il semblerait que ffmpeg ne supporte pas le multithread pour le flv).

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
Task[] tasks = {
                               Task.Factory.StartNew(new Action(()=>{ fm.Encodeto200p("test200p.mp4", 4); })),
                               Task.Factory.StartNew(new Action(()=>{ fm.EncodetoFlash200p("test200p.flv"); })),
                               //Task.Factory.StartNew(new Action(()=>{ fm.Encodeto240p("test240p.mp4",4); })),
                               //Task.Factory.StartNew(new Action(()=>{ fm.EncodetoFlash240p("test240p.flv"); })),
                               //Task.Factory.StartNew(new Action(()=>{ fm.Encodeto360p("test360p.mp4", 4); })),
                               //Task.Factory.StartNew(new Action(()=>{ fm.EncodetoFlash360p("test360p.flv"); })),
                               //Task.Factory.StartNew(new Action(()=>{ fm.EncodetoVGA("testVGA.mp4", 4); })),
                               //Task.Factory.StartNew(new Action(()=>{ fm.EncodetoFlashVGA("testVGA.flv"); })),
                               Task.Factory.StartNew(new Action(()=>{ fm.Encodeto404p("test404p.mp4", 4); })),
                               Task.Factory.StartNew(new Action(()=>{ fm.EncodetoFlash404p("test404p.flv"); })),
                               Task.Factory.StartNew(new Action(()=>{ fm.Encodeto720p("test720p.mp4", 4); }))
                           };
 
            Task.WaitAll(tasks, 5000);
Vous vous demandez sûrement pourquoi j'ai mis un timeout de 5000 au WaitAll. Tout simplement parce que sinon, ça attend indéfiniment et les processus ffmpeg.exe finissent par planter en plein encodage tout en restants ouverts avec 0% de processeur.

Je crois que TPL et Process se téléscopent mais je ne sais pas du tout comment faire pour tout gérer. J'aimerais pouvoir capturer les états et événements de chaque tache. Seulement chaque fois que je les interroge, je récupère le sempiternel "Running" et jamais rien d'autre.

Merci d'avance pour votre aide.