使用FFMPEG和C#创建转换队列



好吧,这个想法是创建一个可以修改和重组的文件队列(这是完成的),并且每个文件都执行一个FFMPEG进程以将其转换为另一种格式。

用于转换的使用xabe.ffmpeg和.net 4.5所有使用异步和等待。

问题将是如何在该变量队列的并行执行x数量的进程(示例4),以及当其中一个人完成执行下一个过程时,执行始终并行执行。我可以从头开始,但是我需要有关如何以最简单的方式做到这一点的想法。该程序本身很简单(使用GUI)将文件夹及其子文件夹及其所有视频文件进行排队并启动转换,您可以添加其他文件夹,其中包含更多文件,并独立文件对其进行重新排序,以将其转换为更大的<<<<<<<<<<。/p>

在某一时刻,我发现了一个包裹,我认为Nuget(或Github)确实做了我所需的工作,但我无法回来。

感谢您提前的帮助。

请原谅英语,因为我使用Google的翻译来更快,因为我的领域有限,但足以理解答案。


好吧,我发现我正在寻找的名为ProcessManager是一个Nupkg软件包。它有2年的发展,但似乎稳定。唯一的缺点是,一旦您添加了文件,它不允许我组织转换队列,尽管我必须尝试一些可能功能的想法。

var manager = new Manager(4); // Max 4 processes will be started simultaneously
manager.Start();
manager.ProcessErrorDataReceived += (sender, e) => Console.WriteLine(e.Data);
manager.ProcessOutputDataReceived += (sender, e) => Console.WriteLine(e.Data);
foreach (var videoFileName in Directory.EnumerateFiles("videos"))
{
    var info = new ProcessInfo(
        "ffprobe.exe",
        string.Format("-v quiet -print_format json -show_format -show_streams "{0}"", videoFileName));
    manager.Queue(info);
}

Process Manager

我认为您可以使用伪生产者消费者模式。创建几个任务,这些任务将继续进行转换,并使用 consurrentqueue 用于存储要转换的文件。每个工人都应从队列中获取下一个文件并对其进行处理。这样,您可以在工人工作时重新排列队列。您应该在ffmpeg中禁用多线程( iconversionusemultithread(false))。

一些代码:

        ConcurrentQueue<string> filesToConvert = new ConcurrentQueue<string>();
        foreach(string file in Directory.GetFiles("C:", "*.mkv"))
        {
            filesToConvert.Enqueue(file);
        }
        for (int i = 0; i < Environment.ProcessorCount; i++)
        {
            new Task(async () =>
            {
                while(true)
                {
                    if(filesToConvert.TryDequeue(out string path))
                    {
                        await new Conversion().SetInput(path)
                                        .UseMultiThread(false)
                                        .SetOutput(Path.GetRandomFileName())
                                        .Start();
                    }
                }
            });
        }

最新更新