FFmpeg потоковый ввод файлов

Не могу передать mp4 файл в качестве входного файла через поток в ffmpeg процесс. Сначала я преобразую видеофайл в массив байтов и передаю в метод PipeTest.

var vProcessor = new VideoProcessor();

var stream = File.OpenRead(@"C:\supertest\video.mp4");
var fileBytes = new byte[stream.Length];
stream.Read(fileBytes, 0, fileBytes.Length);
stream.Close();

await vProcessor.PipeTest(fileBytes, TimeSpan.FromMilliseconds(1500), @"C:\supertest\PipeScreen.png");

Далее сам метод PipeTest

public async Task PipeTest(byte[] data, TimeSpan frameTime, string outFile)
{
        var proc = new Process();
        proc.StartInfo.FileName = _ffmpeg;
        proc.StartInfo.Arguments = $"-i - -codec copy C:\\supertest\\qqq.mp4";
        proc.StartInfo.UseShellExecute = false;
        proc.StartInfo.RedirectStandardInput = true;
        proc.StartInfo.RedirectStandardOutput = false;
        proc.Start();

        proc.StandardInput.BaseStream.Write(data);

        await proc.WaitForExitAsync();
}

ffmpeg в логах выдает ошибку

[mov,mp4,m4a,3gp,3g2,mj2 @ 000002314aa4b1c0] stream 0, offset 0x30: partial file
pipe:: Invalid data found when processing input

Помогите пожалуйста как исправить это.

Моя идея заключается в том чтобы передавать данные в ffmpeg в поток в StandartInput и получать обработанные им файлы в поток из StandartOutput.

Все выходные перерыл интернет, нигде нету решения.


Ответы (1 шт):

Автор решения: eri

mp4 формат требует от кодека перемотки файла назад и вперед. Но fseek не сделать на пайпе. В этом контейнере не получится потоковая передача. Используйте другой контейнер (например mpegts) или другой способ передачи(http вместо пайпа). Или поменяйте и то и другое и используйте RTSP.

→ Ссылка