FFmpeg. Чтение и запись нескольких файлов из потока

Рейтинг: 0Ответов: 1Опубликовано: 08.01.2023

Проблема следующая. Мне надо конвертировать видео в набор картинок через процесс ffmpeg. Раньше я успешно это делал при помощи следующего кода:

public void VideoToImages1()
    {
        var inputFile = @"D:\testVideo.avi";
        var outputFilesPattern = @"D:\image%03d.jpg";

        using var process = new Process
        {
            StartInfo = new ProcessStartInfo
            {
                UseShellExecute = false,
                CreateNoWindow = true,
                Arguments = $"-y -i {inputFile} {outputFilesPattern}",
                FileName = "ffmpeg.exe"
            },
            EnableRaisingEvents = true
        };

        process.Start();

        process.WaitForExit();
    }

Теперь же мне необходимо передавать видео через входной Stream и получать данные из выходного Stream. Для этого у меня следующий код. Он полностью рабочий так как я использовал его для конвертации видео и успешно передавал входные данные через Stream и получал выходные данные в через Stream и создавал корректный файл.

public void VideoToImages2()
    {
        var inputFile = @"D:\testVideo.avi";
        var outputFile = @"D:\resultImages.png";

        var process = new Process
        {
            StartInfo = new ProcessStartInfo
            {
                RedirectStandardInput = true,
                RedirectStandardOutput = true,
                UseShellExecute = false,
                CreateNoWindow = true,
                Arguments = "-y -i - -f image2 -",
                FileName = _ffmpeg
            },
            EnableRaisingEvents = true
        };

        process.Start();

        //Write input data to input stream
        var inputTask = Task.Run(() =>
        {
            using (var input = new FileStream(inputFile, FileMode.Open))
            {
                input.CopyTo(process.StandardInput.BaseStream);
                process.StandardInput.Close();
            }
        });


        //Read multiple files from output stream
        var outputTask = Task.Run(() =>
        {
            //Problem here
            using (var output = new FileStream(outputFile, FileMode.Create))
                process.StandardOutput.BaseStream.CopyTo(output);
        });


        Task.WaitAll(inputTask, outputTask);

        process.WaitForExit();
    }

Проблема здесь в том что вместо того чтобы создать файлы в директории по указанному паттерну он возвращает эти файлы в потоке. В итоге я не знаю записать все файлы из Stream и как этот выходной обрабатывать так как он содержит множество файлов. В данный момент у меня создается лишь 1 картинка. Помогите пожалуйста.

Ответы

▲ 0Принят

Решение найдено. Мне пришлось написать алгоритм по декодированию потока на наличие сигнатур файлов. Пока он плоховато работает и требует доработки.