Conversion vidéo flv sur serveur IIS asp.net

Fermé
esperento57 Messages postés 2 Date d'inscription mercredi 15 octobre 2003 Statut Membre Dernière intervention 8 novembre 2008 - 4 nov. 2008 à 14:08
 dkknd - 26 nov. 2011 à 10:05
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
A voir également:

5 réponses

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
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
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
dod,d,dnd
0
samcsharp Messages postés 4 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 5 avril 2009 1
24 févr. 2009 à 22:32
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
samcsharp Messages postés 4 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 5 avril 2009 1
25 févr. 2009 à 18:23
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
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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