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 шт):
mp4 формат требует от кодека перемотки файла назад и вперед. Но fseek не сделать на пайпе. В этом контейнере не получится потоковая передача. Используйте другой контейнер (например mpegts) или другой способ передачи(http вместо пайпа). Или поменяйте и то и другое и используйте RTSP.