You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过管道向ffmpeg传图生成视频?输出空文件求助

解决ffmpeg管道输入生成空视频文件的问题

你的代码有几个关键问题导致输出空文件,直接改这几点就能解决:

  1. 没告诉ffmpeg输入的图片格式
    image2pipe默认不会自动识别PNG流,必须显式添加-vcodec png参数,让ffmpeg知道要按PNG格式解码管道输入。

  2. 写完图片后没关闭输入流
    ffmpeg会一直等待管道输入,直到你明确关闭输入流,它才会结束编码并生成完整视频。

  3. 多余的标准输出重定向
    你已经在参数里指定了输出文件路径,不需要重定向StandardOutput,这会干扰ffmpeg的正常输出流程。

  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 15:55:20