C# 上传任何视频并在 .net 中在线转换为 .mp4

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/16694024/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-10 01:41:13  来源:igfitidea点击:

Upload any video and convert to .mp4 online in .net

c#.netvideomp4

提问by Sachin

I have a strange requirement. User can upload their video of any format (or a limited format). We have to store them and convert them to .mp4format so we can play that in our site.

我有一个奇怪的要求。用户可以上传任何格式(或有限格式)的视频。我们必须存储它们并将它们转换为.mp4格式,以便我们可以在我们的网站上播放。

Same requirement also for audio files.

音频文件也有同样的要求。

I have googled but I can't get any proper idea. Any help or suggestions....??

我用谷歌搜索,但我无法得到任何正确的想法。任何帮助或建议....??

Thanks in advance

提前致谢

回答by Vitaliy Fedorchenko

You can convert almost any video/audio user files to mp4/mp3 with FFMpeg command line utility. From .NET it can be called using wrapper library like Video Converter for .NET(this one is nice because everything is packed into one DLL):

您可以使用FFMpeg 命令行实用程序将几乎所有视频/音频用户文件转换为 mp4/mp3 。从 .NET 可以使用包装库调用它,例如Video Converter for .NET(这个很好,因为所有内容都打包到一个 DLL 中):

(new NReco.VideoConverter.FFMpegConverter()).ConvertMedia(pathToVideoFile, pathToOutputMp4File, Formats.mp4)

Note that video conversion requires significant CPU resources; it's good idea to run it in background.

请注意,视频转换需要大量 CPU 资源;在后台运行它是个好主意。

回答by Tejas

Your Answer

你的答案

please Replace .flv to .mp4 you will get your answer

请将 .flv 替换为 .mp4,您将得到答案

private bool ReturnVideo(string fileName)
    {
        string html = string.Empty;
        //rename if file already exists

        int j = 0;
        string AppPath;
        string inputPath;
        string outputPath;
        string imgpath;
        AppPath = Request.PhysicalApplicationPath;
        //Get the application path
        inputPath = AppPath + "OriginalVideo";
        //Path of the original file
        outputPath = AppPath + "ConvertVideo";
        //Path of the converted file
        imgpath = AppPath + "Thumbs";
        //Path of the preview file
        string filepath = Server.MapPath("~/OriginalVideo/" + fileName);
        while (File.Exists(filepath))
        {
            j = j + 1;
            int dotPos = fileName.LastIndexOf(".");
            string namewithoutext = fileName.Substring(0, dotPos);
            string ext = fileName.Substring(dotPos + 1);
            fileName = namewithoutext + j + "." + ext;
            filepath = Server.MapPath("~/OriginalVideo/" + fileName);
        }
        try
        {
            this.fileuploadImageVideo.SaveAs(filepath);
        }
        catch
        {
            return false;
        }
        string outPutFile;
        outPutFile = "~/OriginalVideo/" + fileName;
        int i = this.fileuploadImageVideo.PostedFile.ContentLength;
        System.IO.FileInfo a = new System.IO.FileInfo(Server.MapPath(outPutFile));
        while (a.Exists == false)
        {

        }
        long b = a.Length;
        while (i != b)
        {

        }


        string cmd = " -i \"" + inputPath + "\" + fileName + "\" \"" + outputPath + "\" + fileName.Remove(fileName.IndexOf(".")) + ".flv" + "\"";
        ConvertNow(cmd);
        string imgargs = " -i \"" + outputPath + "\" + fileName.Remove(fileName.IndexOf(".")) + ".flv" + "\" -f image2 -ss 1 -vframes 1 -s 280x200 -an \"" + imgpath + "\" + fileName.Remove(fileName.IndexOf(".")) + ".jpg" + "\"";
        ConvertNow(imgargs);


        return true;
    }
    private void ConvertNow(string cmd)
    {
        string exepath;
        string AppPath = Request.PhysicalApplicationPath;
        //Get the application path
        exepath = AppPath + "ffmpeg.exe";
        System.Diagnostics.Process proc = new System.Diagnostics.Process();
        proc.StartInfo.FileName = exepath;
        //Path of exe that will be executed, only for "filebuffer" it will be "flvtool2.exe"
        proc.StartInfo.Arguments = cmd;
        //The command which will be executed
        proc.StartInfo.UseShellExecute = false;
        proc.StartInfo.CreateNoWindow = true;
        proc.StartInfo.RedirectStandardOutput = false;
        proc.Start();

        while (proc.HasExited == false)
        {

        }
    }
    protected void btn_Submit_Click(object sender, EventArgs e)
    {
        ReturnVideo(this.fileuploadImageVideo.FileName.ToString());
    }

回答by peacefulgoes

I know it's a bit old thread but if I get here other people see this too. You shoudn't use it process info to start ffmpeg. It is a lot to do with it. Xabe.FFmpegyou could do this by running just

我知道这是一个有点旧的线程,但如果我到这里其他人也会看到这个。您不应该使用它处理信息来启动 ffmpeg。这与它有很大关系。Xabe.FFmpeg你可以通过运行来做到这一点

await Conversion.Convert("inputfile.mkv", "file.mp4").Start()

This is one of easiest usage. This library provide fluent API to FFmpeg.

这是最简单的用法之一。该库为 FFmpeg 提供流畅的 API。