IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Windows Discussion :

Task Parallel Library et exe externe (ffmpeg)


Sujet :

Développement Windows

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 23
    Par défaut Task Parallel Library et exe externe (ffmpeg)
    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.

  2. #2
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Quel genre d'etat tu aimerais voir? Simple du style "tâche xx en cours" "tâche xx finie" ou reprende tout ce que ffshow donne comme info?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 23
    Par défaut
    Alors en fait j'aimerais simplement que le TPL attende bien la fin de l'éxécution de ffmpeg.exe pour annoncer l'état "isCompleted" ou le status "RantoComplete" plutôt que la fin de l'éxécution du code, donc du lancement de ffmpeg.exe.

    J'ai déja résolu une partie du problème en supprimant le WaitforExit de mon wrapper.

Discussions similaires

  1. Une Task Parallel Library pour Silverlight & Windows Phone 7
    Par DavidCatuhe dans le forum Silverlight
    Réponses: 2
    Dernier message: 16/05/2011, 21h34
  2. [MOSS2k7] Alimenter Documet Library de l'externe
    Par engineer_Dz dans le forum SharePoint
    Réponses: 14
    Dernier message: 01/02/2008, 20h09
  3. Réponses: 4
    Dernier message: 10/09/2007, 19h10
  4. [C#] Comment interagir avec un EXE externe ?
    Par therock dans le forum C#
    Réponses: 2
    Dernier message: 16/08/2006, 18h56
  5. Exécution d'un exe externe
    Par alainvh dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 21/06/2005, 10h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo