Conversion vidéo flv sur serveur IIS asp.net

esperento57 Messages postés 2 Statut Membre -  
 dkknd -
Je cherche un moyen de convertir des videos de formats standarts (.avi, .mpeg) en FLV. Ce que je désire c'est de convertir ces fichiers sur le serveur et non pas grâce à une application tierse installée sur mon PC. Le but de mon client étant de faire un site youtube-like mais pour sa communauté professionnelle. Les membres seront en mesure de partager des vidéos techniques de la même manière que youtube. Mais pour des soucis d'espace et d'uniformité, il faudrait que je puisse convertir les vidéo au format FLV au moment de l'upload.

J'ai bien pensé à lancer le programme ffmpeg en ligne de commande sur le serveur (dans un thread comme ça ça ne demande pas d'attendre trop longtemps le chargement de la page si la vidéo est un peu grosse), et cela marche mais le problème que je me pose c'est: si des centaines voir des milliers d'utilisateurs ajoutent à peu près en même temps une vidéo, cela fait des centaines voir des milliers de fois le processus ffmpeg lancé sur le serveur web en même temps. Est-ce possible?
Sinon comment faire... J'ai parcouru le web mais je n'ai trouvé aucune solution et c'est pourquoi je me permet de demander l'avis d'experts.

Tout fonctionne très bien pour l'instant (site communautaire, enregistrement/connexion des membres, upload de fichiers). Tout ce qui me reste à faire, c'est le lecteur vidéo et le système qui me permettrait de convertir les formats.

Je travaille en ASP.net, code behind en C#.net.

Des suggestions ou pistes qui me permettraient d'avancer? Et, oui, j'ai déjà fouillé sur le site sans succès et j'ai pas mal épluché les résultats de google.

Merci
Configuration: Windows XP
Internet Explorer 7.0

5 réponses

  1. esperento57
     
    Et bien en fait la solution que j'avais trouvé était de créer un thread principal qui se lance au démarrage du serveur (grace au global.asax, application_start) )et qui scrute régulierement la base pour voir si des lignes ont été ajoutée dans une table "videoatratee".
    Ce thread principal gerant 5 autres threads et leur donnant le travail a faire et sur quels fichiers.
    Ces 5 threads étant chargés de lancer ffmpeg (ainsi il n'y a que maximum 5 fois ffmeg en mémoire).
    Il faut bien sur vérifier que ton hébergeur accepte le CGI (pour l'execution des ffmpeg) et concernant une certaine chose, a savoir que sur la plupart des hebergeurs ton site se met en pause s'il n'a pas de visite pendantun laps de temps donné et que donc ton thread principal et tes 5 threads aussi, ce qui peut etre résolu je pense (jamais testé) par un site qui fait des requetes régulieres sur ton site. (ca existe, c'est payant mais c'est pas cher)
    Voila chez moi ca marchait, je n'ai malheureusement plus les sources (disque mort, pas de onduleur merci la foudre) mais si tu veux faire ca va falloir coder...
    Quant a ffmpeg, il marche tres bien, tu peux meme incruster ton logo, le nom de ton site dans la video, extraire la premiere image etc...
    Voila j'espère que ca pourra t'aider, fais le moi savoir ca fait toujours plaisir, bon courrage a toi!

    Esperento57, ou J@nus[Fr] sur america's army
    1
    1. samcsharp
       
      Salut

      Je pensais pas avoir une réponse. Si vite en plus :)

      Je me sers également de ffmpeg. Tout marche très bien tant que les vidéos font 2 ou 3Mo. Création de thumbnail comprise. Mais dès que la vidéo source fait plus de 2 ou 3 Mo, la conversion réussie en théorie seulement : j'obtiens alors une vidéo noire sans son. J'ai pourtant augmenté dans web.config le noeud httpRuntime et notamment l'attribut executionTimeout ainsi que maxRequestLength en pensant que c'était l'upload des grosses vidéos qui foirait. Mais c'est apparemment la conversion qui foire : elle est très (trop) rapide et on ne voit rien s'afficher dans la console ffmpeg.
      Pour ma part j'utilise ces méthodes. Ca marche donc pour les vidéos de petite taille. J'ai pas dû tout comprendre aux subtilités de ffmpeg quand il s'agit de grosses vidéos.

      /// <summary>
      /// Testing file size, file extension and creating a swf video
      /// </summary>
      private void CreateSwfVideo()
      {
      //Cleaning
      lblMsg.Text = string.Empty;
      if (fulVideos != null || fulVideos.PostedFile != null)
      {
      //Testing video file size in byte (here 10Mo)
      if (fulVideos.PostedFile.ContentLength > 12000000)
      {
      lblMsg.Text = "La taille des vidéos est limitée à 10Mo";
      return;
      }
      postedFileName = fulVideos.PostedFile.FileName;
      //Only .avi, .wmv, .mpeg allowed
      bool fileUploadAllowed = false;
      string fileExtension = Path.GetExtension(postedFileName);
      switch (fileExtension)
      {
      case ".avi":
      fileUploadAllowed = true;
      break;
      case ".wmv":
      fileUploadAllowed = true;
      break;
      case ".mpeg":
      fileUploadAllowed = true;
      break;
      default:
      fileUploadAllowed = false;
      break;
      }
      if (fileUploadAllowed)
      {
      fileSavedIn = AppDomain.CurrentDomain.BaseDirectory + "Video\\";
      string newFileName = postedFileName;
      newFileName = newFileName.Substring(newFileName.LastIndexOf("\\") + 1);
      fileExtension = Path.GetExtension(newFileName);
      //To allow videos with the same name, I add DateTime.Now.Ticks to its name
      newFileName = newFileName.Remove(newFileName.LastIndexOf(".")) + "__"+ DateTime.Now.Ticks.ToString() + fileExtension;
      fileNameWithPath = fileSavedIn + newFileName;
      //Saves the file
      fulVideos.PostedFile.SaveAs(fileNameWithPath);
      //Starting conversion
      string inputFile, outPutFile, fileArgs, fileWithoutExtension;
      //Get file name without extension
      fileWithoutExtension = Path.GetFileNameWithoutExtension(fileNameWithPath);
      //
      inputFile = fileSavedIn + newFileName;
      //Ouput file in swf
      outPutFile = fileSavedIn + "swf\\" + fileWithoutExtension + ".swf";
      //To allow to point to full (path + new file name + swf)
      Session["fullPathConvertedVideo"] = outPutFile;
      //Chemin de la video swf jusqu'au dernier \ et SANS fichierNom.swf
      Session["pathWithoutFileName"] = fileSavedIn + "swf\\";
      //File alone
      Session["onlyFileNameWithExt"] = fileWithoutExtension + ".swf";
      //File args for ffmpeg
      fileArgs = "-i " + inputFile + " -ar 22050 " + outPutFile;
      string serverPath = Server.MapPath(".");
      Process proc = new Process();
      proc.StartInfo.FileName = serverPath + "\\ffmpeg\\ffmpeg.exe";
      proc.StartInfo.Arguments = fileArgs;
      proc.StartInfo.UseShellExecute = false;
      proc.StartInfo.CreateNoWindow = false;
      proc.StartInfo.RedirectStandardOutput = false;
      try
      {
      proc.Start();
      }
      catch (Exception ex)
      {
      Response.Write(ex.Message);
      }
      proc.WaitForExit();
      proc.Close();
      CreateThumbnails(fileWithoutExtension, inputFile, serverPath);
      }
      else
      {
      lblMsg.ForeColor = System.Drawing.Color.Red;
      lblMsg.Text = "Seuls les fichiers au format '.avi', '.wmv' ou '.mpeg' sont autorisés. ";
      }

      }
      }

      private void CreateThumbnails(string fileWithoutExtension, string inputFile, string serverPath)
      {
      string thumbPath, thumbName, thumbArgs;
      thumbPath = AppDomain.CurrentDomain.BaseDirectory + "Video\\Thumb\\";
      // !! sans le %d dans le nom, le thumbnail n'est pas créé
      thumbName = thumbPath + fileWithoutExtension + "%d" + ".jpg";
      Session["thumbName"] = thumbName;
      thumbArgs = "-i " + inputFile + " -vframes 1 -ss 00:00:07 -s 150x150 " + thumbName;
      //thumbArgs = "-i " + inputFile + "-an -s 150x150 -ss 00:00:07 -an -r 1 -vframes 1 -y -vcodec mjpeg -f mjpeg " + thumbName;
      //thumbArgs = "-i + stream_1146848749371.flv -y -f singlejpeg -ss 0.001 -vframes 1 -an test.jpg";
      Process thumbProc = new Process();
      thumbProc.StartInfo.FileName = serverPath + "\\ffmpeg\\ffmpeg.exe";
      thumbProc.StartInfo.Arguments = thumbArgs;
      thumbProc.StartInfo.UseShellExecute = false;
      thumbProc.StartInfo.CreateNoWindow = false;
      thumbProc.StartInfo.RedirectStandardOutput = false;
      try
      {
      thumbProc.Start();
      }
      catch (Exception ex)
      {
      Response.Write(ex.Message);
      }
      thumbProc.WaitForExit();
      thumbProc.Close();

      //Original file deletion
      File.Delete(inputFile);
      SaveDetails();
      lblMsg.Text = "Vidéo bien arrivée sur le serveur";
      Session["video"] = inputFile;
      //Response.Redirect(@"~/site/photo_index.aspx");
      hlnkGotToVideoIndex.Visible = true;
      }






      Sinon j'ai trouvé ces composents, mais pas testé encore :

      avs4you
      https://www.avs4you.com/fr/avs-free-video-converter.aspx/
      dont
      https://www.avs4you.com/fr/avs-free-video-converter.aspx/

      Video Sharing Script -- Start Your Own Video Sharing Site
      https://www.dvdfab.cn/?source=sothink

      TVideoGrabber v7.6 build 215.1 - TVideoGrabber is a video capture / media player component for developers working with C#
      https://www.datastead.com/products/video-sdk/?gclid=CPOu9aak85gCFYIU4wodSWDZ1A

      http://www.medialooks.com/products/multimedia_components.html

      https://www.dvdfab.cn/?source=sothink
      0
    2. samcsharp
       
      Salut

      Je pensais pas avoir une réponse. Si vite en plus :)

      Je me sers également de ffmpeg. Tout marche très bien tant que les vidéos font 2 ou 3Mo. Création de thumbnail comprise. Mais dès que la vidéo source fait

      plus de 2 ou 3 Mo, la conversion réussie en théorie seulement : j'obtiens alors une vidéo noire sans son. J'ai pourtant augmenté dans web.config le noeud

      httpRuntime et notamment l'attribut executionTimeout ainsi que maxRequestLength en pensant que c'était l'upload des grosses vidéos qui foirait. Mais c'est

      apparemment la conversion qui foire : elle est très (trop) rapide et on ne voit rien s'afficher dans la console ffmpeg.
      Pour ma part j'utilise ces méthodes. Ca marche donc pour les vidéos de petite taille. J'ai pas dû tout comprendre aux subtilités de ffmpeg.

          /// <summary>
          /// Testing file size, file extension and creating a swf video
          /// </summary>
          private void CreateSwfVideo()
          {
              //Cleaning
              lblMsg.Text = string.Empty;
              if (fulVideos != null || fulVideos.PostedFile != null)
              {
                  //Testing video file size in byte (here 10Mo)
                  if (fulVideos.PostedFile.ContentLength > 12000000) 
                  {
                      lblMsg.Text = "La taille des vidéos est limitée à 10Mo";
                      return;
                  }
                  postedFileName = fulVideos.PostedFile.FileName;
                  //Only .avi, .wmv, .mpeg allowed
                  bool fileUploadAllowed = false;
                  string fileExtension = Path.GetExtension(postedFileName);
                  switch (fileExtension)
                  {
                      case ".avi":
                          fileUploadAllowed = true;
                          break;
                      case ".wmv":
                          fileUploadAllowed = true;
                          break;
                      case ".mpeg":
                          fileUploadAllowed = true;
                          break;
                      default:
                          fileUploadAllowed = false;
                          break;
                  }
                  if (fileUploadAllowed)
                  {
                      fileSavedIn = AppDomain.CurrentDomain.BaseDirectory + "Video\\";
                      string newFileName = postedFileName;
                      newFileName = newFileName.Substring(newFileName.LastIndexOf("\\") + 1);
                      fileExtension = Path.GetExtension(newFileName);
                     //To allow videos with the same name, I add DateTime.Now.Ticks to  its name
                      newFileName = newFileName.Remove(newFileName.LastIndexOf(".")) + "__"+ DateTime.Now.Ticks.ToString() + fileExtension;
                      fileNameWithPath = fileSavedIn + newFileName;            
                      //Saves the file
                      fulVideos.PostedFile.SaveAs(fileNameWithPath);
                      //Starting conversion
                      string inputFile, outPutFile, fileArgs, fileWithoutExtension;
                      //Get file name without extension
                      fileWithoutExtension = Path.GetFileNameWithoutExtension(fileNameWithPath);
                      //
                      inputFile = fileSavedIn + newFileName;
                      //Ouput file in swf
                      outPutFile = fileSavedIn + "swf\\" + fileWithoutExtension + ".swf";
                      //To allow to point to full (path + new file name + swf)
                      Session["fullPathConvertedVideo"] = outPutFile;
                      //Chemin de la video swf jusqu'au dernier \ et SANS fichierNom.swf
                      Session["pathWithoutFileName"] = fileSavedIn + "swf\\"; 
                      //File alone
                      Session["onlyFileNameWithExt"] = fileWithoutExtension + ".swf";
                      //File args for ffmpeg
                      fileArgs = "-i " + inputFile + " -ar 22050 " + outPutFile;
                      string serverPath = Server.MapPath(".");
                      Process proc = new Process();
                      proc.StartInfo.FileName = serverPath + "\\ffmpeg\\ffmpeg.exe";
                      proc.StartInfo.Arguments = fileArgs;
                      proc.StartInfo.UseShellExecute = false;
                      proc.StartInfo.CreateNoWindow = false;
                      proc.StartInfo.RedirectStandardOutput = false;
                      try
                      {
                          proc.Start();
                      }
                      catch (Exception ex)
                      {
                          Response.Write(ex.Message);
                      }
                      proc.WaitForExit();
                      proc.Close();
                      CreateThumbnails(fileWithoutExtension, inputFile, serverPath);                
                  }
                  else
                  {
                      lblMsg.ForeColor = System.Drawing.Color.Red;
                      lblMsg.Text = "Seuls les fichiers au format '.avi', '.wmv' ou '.mpeg' sont autorisés. ";
                  }
      
              }
          }
      
          private void CreateThumbnails(string fileWithoutExtension, string inputFile, string serverPath)
          {
              string thumbPath, thumbName, thumbArgs;
              thumbPath = AppDomain.CurrentDomain.BaseDirectory + "Video\\Thumb\\";
              // !! sans le %d dans le nom, le thumbnail n'est pas créé
              thumbName = thumbPath + fileWithoutExtension + "%d" + ".jpg";
              Session["thumbName"] = thumbName;
              thumbArgs = "-i " + inputFile + " -vframes 1 -ss 00:00:07 -s 150x150 " + thumbName;
              //thumbArgs = "-i " + inputFile + "-an -s 150x150 -ss 00:00:07 -an -r 1 -vframes 1 -y -vcodec mjpeg -f mjpeg " + thumbName;
              //thumbArgs = "-i + stream_1146848749371.flv -y -f singlejpeg -ss 0.001 -vframes 1 -an test.jpg";
              Process thumbProc = new Process();
              thumbProc.StartInfo.FileName = serverPath + "\\ffmpeg\\ffmpeg.exe";
              thumbProc.StartInfo.Arguments = thumbArgs;
              thumbProc.StartInfo.UseShellExecute = false;
              thumbProc.StartInfo.CreateNoWindow = false;
              thumbProc.StartInfo.RedirectStandardOutput = false;
              try
              {
                  thumbProc.Start();
              }
              catch (Exception ex)
              {
                  Response.Write(ex.Message);
              }
              thumbProc.WaitForExit();
              thumbProc.Close();
      
              //Original file deletion
              File.Delete(inputFile);
              SaveDetails();
              lblMsg.Text = "Vidéo bien arrivée sur le serveur";
              Session["video"] = inputFile;
              //Response.Redirect(@"~/site/photo_index.aspx");
              hlnkGotToVideoIndex.Visible = true;
          }







      Sinon j'ai trouvé ces composants, mais pas testé encore :

      avs4you
      https://www.avs4you.com/fr/avs-free-video-converter.aspx/
      dont
      https://www.avs4you.com/fr/avs-free-video-converter.aspx/

      Video Sharing Script -- Start Your Own Video Sharing Site
      https://www.dvdfab.cn/?source=sothink

      TVideoGrabber v7.6 build 215.1 - TVideoGrabber is a video capture / media player component for developers working with C#
      https://www.datastead.com/products/video-sdk/?gclid=CPOu9aak85gCFYIU4wodSWDZ1A

      http://www.medialooks.com/products/multimedia_components.html

      https://www.dvdfab.cn/?source=sothink
      0
    3. dkknd
       
      dod,d,dnd
      0
  2. samcsharp Messages postés 4 Statut Membre 1
     
    T'as dû remarquer que mon long message est bien passé en fait : j'ai cru qu'il avait été filtré ou modéré.
    Ok, je te PM mon email. Je viens de m'inscrire sur ccm du coup ;)

    Merci pour tes réponses :)
    1
    1. samcsharp Messages postés 4 Statut Membre 1
       
      Arf, je viens de réaliser que tu n'étais pas inscrit a ccm. Vla mon email alors : octopulsien at yahoo point fr. Je n'ai peut-être pas la dernière version de ffmpeg. Je me pencherai là dessus ce WE.

      Pour ce qui est de la gestion de la gestion de tâches en parallèle, un collègue m'a parlé aujourd'hui d'un framework qui pourrait être sympa : Parallel Extensions for the .Net Framework

      http://msdn.microsoft.com/fr-fr/vbasic/cc678397.aspx

      https://www.programmez.com/magazine_articles.php?titre=Parallel-FX--la-parallelisation-facile&id_article=937&magazine=103

      A+ :)
      0
  3. samcsharp
     
    Salut,

    Je suis exactement dans le même cas que toi. Et ffmpeg, même s'il marche bien, ne me semble pas idéal. En fait par manque de temps, je ne peux pas l'étudier à fond et cherche donc un moyen permettre à des utilisateurs d'envoyer simultanément des fichiers assez gros. As-tu trouvé une solution depuis ?
    0
  4. samcsharp
     
    Salut,

    Merci pour ta réponse. Je t'ai moi-même longuement répondu, mais ma réponse passe pas. J'ai mis du code C# dans la réponse mais dans les balises "code", donc ça aurait dû passer :\
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. esperento57
     
    met moi ton mail j'ai retrouvé certaine sources qui pourraient t'etre utile, ca concerne la gestion de ces threads plus le thread principal etc.... Tu n'aurais qu'a utiliser ca dans ton global.asax
    Maintenant pour l'utilisation de ffmpeg as tu la derniere version de celui-ci?

    En tous cas moi le code ca donnait ca:

    //string FFmpegPutanja = "c:\\TEMP\\ffmpeg.exe";
    string FFmpegPutanja = this.fichierffmpg;
    string RnaSol=this.FichierVideoSource;
    string RnaComp=this.FichierVideoDestination;
    string OneLine;

    System.IO.StreamReader myStreamReader;
    System.Diagnostics.Process p = new System.Diagnostics.Process();
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.RedirectStandardError = true;
    p.StartInfo.RedirectStandardOutput = true;

    p.StartInfo.CreateNoWindow = true;
    p.StartInfo.FileName = FFmpegPutanja;
    //p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    p.StartInfo.Arguments = " -i " + RnaSol + " -s 640x480 -ar 44100 -aspect 4:3 -pass 1 -b 768k -r 24 -acodec mp3 -ab 64 -f " + typeconvet + " -y " + RnaComp;
    // p.StartInfo.Arguments = " -i " + RnaSol + " " + RnaComp;

    //test

    //fin test

    p.Start();
    processusID = p.Id;

    string aaa = "";

    myStreamReader = p.StandardError;
    OneLine = myStreamReader.ReadLine();

    do
    {
    aaa = aaa + OneLine + "<br>";
    OneLine = myStreamReader.ReadLine();
    } while (!(p.HasExited & (string.Compare(OneLine, "") == 0 | OneLine == null)));

    //Response.Write(aaa);

    p.WaitForExit();

    if ((p.HasExited == true))
    {

    Gotovo = true;

    }

    if ((p.ExitCode == 0))
    {

    Gotovo = true;
    p.Close();

    //UbaciMetaData(RnaComp);
    }

    else
    {

    Gotovo = false;
    p.Close();

    }

    }
    0