如何通过管道向ffmpeg传图生成视频?输出空文件求助
解决ffmpeg管道输入生成空视频文件的问题
你的代码有几个关键问题导致输出空文件,直接改这几点就能解决:
没告诉ffmpeg输入的图片格式
image2pipe默认不会自动识别PNG流,必须显式添加-vcodec png参数,让ffmpeg知道要按PNG格式解码管道输入。写完图片后没关闭输入流
ffmpeg会一直等待管道输入,直到你明确关闭输入流,它才会结束编码并生成完整视频。多余的标准输出重定向
你已经在参数里指定了输出文件路径,不需要重定向StandardOutput,这会干扰ffmpeg的正常输出流程。MemoryStream位置未重置
写入PNG数据到MemoryStream后,流的位置会停在末尾,直接WriteTo相当于没写入有效数据,需要重置到开头。
修改后的完整代码:
using System.Diagnostics; using SkiaSharp; Process process = new Process(); process.StartInfo.FileName = @"ffmpeg"; // 添加-vcodec png指定输入格式,参数顺序更符合ffmpeg惯例 process.StartInfo.Arguments = "-f image2pipe -vcodec png -r 30 -i - /home/user/Videos/test33.mp4"; process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardInput = true; // 移除不必要的标准输出重定向 // process.StartInfo.RedirectStandardOutput = true; process.Start(); for (int i = 0; i < 300; i++) { using var ms = new MemoryStream(); SKImageInfo imageInfo = new SKImageInfo(1280, 720, SKColorType.Rgba8888); using SKSurface surface = SKSurface.Create(imageInfo); SKCanvas canvas = surface.Canvas; canvas.Clear(SKColor.Parse("#ffffff")); using SKImage image = surface.Snapshot(); using SKData data = image.Encode(SKEncodedImageFormat.Png, 80); data.SaveTo(ms); // 重置流位置到开头,确保写入完整PNG数据 ms.Position = 0; ms.WriteTo(process.StandardInput.BaseStream); // 立即刷新缓冲区,避免数据滞留 process.StandardInput.BaseStream.Flush(); } // 关闭输入流,告知ffmpeg输入结束 process.StandardInput.Close(); // 等待ffmpeg完成编码流程 process.WaitForExit(); // 可通过退出码确认执行状态(0为成功) Console.WriteLine($"ffmpeg退出码: {process.ExitCode}"); process.Dispose();
内容的提问来源于stack exchange,提问作者m_j_alkarkhi
相关产品推荐
相关产品推荐

