繁体   English   中英

在asp.net中使用ffmpeg

[英]Using ffmpeg in asp.net

我需要一个音频转换库。 在拉完头发之后..我放弃了一个事实,那就是那里没有这样的音频库。.那里的每个库都有一些或其他问题。

剩下的唯一选择是ffmpeg,这是最好的选择,但是不幸的是您不能在asp.net中使用它(我不是直接意思)。 网站上将转换文件的每个用户; 会启动一个exe吗? 我想我很快就会达到服务器内存的最大值。

底线:我将尝试使用ffmpeg.exe,看看它可以同时支持多少用户。

我去了ffmpeg网站,在Windows下载部分找到了3个不同的版本。 静态,共享和开发。

有谁知道哪个最好? 所有都打包在一个exe(静态)或dll中,而exe很小,可以在asp.net中使用它吗?

PS:任何人那里都有一个不错的图书馆..如果您能共享,那就太好了。

静态生成为每个程序(ffmpeg,ffprobe,ffplay)提供一个独立的.exe文件。

共享版本将每个库提供为单独的.dll文件(avcodec,avdevice,avfilter等)以及依赖于每个程序的那些库的.exe文件

开发包提供在其他程序中使用.dll文件所需的头文件和.lib / .dll.a文件。

ffMpeg是我使用过的最好的库,但是我不建议您尝试直接从asp.net调用它。

我所做的就是接受上传,将其存储在服务器上,或者存储在我的情况下的S3中,然后担任工作角色(如果使用的是类似Azure的角色),并且该过程不断查找和监视要转换的新文件。

如果您需要类似实时的解决方案,则可以更新数据库中的标志,并使用AJAX解决方案来轮询数据库以继续提供进度更新,然后在转换完成后提供下载链接。

我个人的方法是

  1. Azure Web角色
  2. Azure工作者角色
  3. ServiceBus

WorkerRole启动并正在监视ServiceBus队列中的消息。

ASP.NET站点上载文件并将其存储在S3或Azure中。然后,如果需要,ASP.NET站点会将信息记录在您的数据库中,并将消息发送到ServiceBus队列。

WorkerRole对此进行了转换。

如果需要实时监视解决方案,则ASP.NET网站上将需要AJAX。 否则,如果需要,您可以在完成后发送电子邮件。

使用排队过程还可以减轻您的负担,因为您在重负荷下只能等待一会儿,并且不会使所有事情停顿下来。 另外,如果对于一台服务器而言,负载过大,您可以根据需要扩展工作人员角色以平衡负载。

这是我从C#运行ffMpeg的方式(您将需要更改参数以满足您的要求)

String params = string.Format("-i {0} -s 640x360 {1}", input.Path, "C:\\FilePath\\file.mp4");

RunProcess(params);

private string RunProcess(string Parameters)
    {
        //create a process info
        ProcessStartInfo oInfo = new ProcessStartInfo(this._ffExe, Parameters);
        oInfo.UseShellExecute = false;
        oInfo.CreateNoWindow = true;
        oInfo.RedirectStandardOutput = true;
        oInfo.RedirectStandardError = true;

        //Create the output and streamreader to get the output
        string output = null; StreamReader srOutput = null;

        //try the process
        try
        {
            //run the process
            Process proc = System.Diagnostics.Process.Start(oInfo);
            proc.ErrorDataReceived += new DataReceivedEventHandler(proc_ErrorDataReceived);
            proc.OutputDataReceived += new DataReceivedEventHandler(proc_OutputDataReceived);

            proc.BeginOutputReadLine();
            proc.BeginErrorReadLine();

            proc.WaitForExit();

            proc.Close();
            proc.Dispose();
        }
        catch (Exception)
        {
            // Capture Error
        }
        finally
        {
            //now, if we succeeded, close out the streamreader
            if (srOutput != null)
            {
                srOutput.Close();
                srOutput.Dispose();
            }
        }



        return output;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM