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

在C#应用中基于SkiaSharp动画帧发布视频流的实现方案

实现SkiaSharp帧推流的最佳方案

针对你的需求,以下是几种可靠的实现方式,按通用性和易用性排序:


1. 通过FFmpeg进程管道推流(跨平台通用)

多数人尝试FFmpeg失败是因为未处理好像素格式匹配和管道通信逻辑。SkiaSharp的帧数据可以直接通过标准输入传给FFmpeg,由它编码成VLC/浏览器支持的流格式(RTSP、HTTP-FLV、HLS等)。

核心步骤:

  • 提取SkiaSharp帧数据:从SKBitmap中获取RGBA像素缓冲区(Skia默认采用RGBA8888格式)。
  • 启动FFmpeg进程:通过命令行参数指定输入格式、分辨率、帧率,将标准输入作为数据源,输出到目标流地址。
  • 持续写入帧数据:每帧渲染完成后,将像素数据写入FFmpeg的标准输入流,控制帧率保持稳定。

代码示例:

// 初始化参数:假设画布尺寸1920x1080,帧率30fps
var ffmpegPath = "ffmpeg"; // 若未加入环境变量,需指定全路径
var streamUrl = "rtsp://localhost:8554/skia-stream"; // 需先启动RTSP服务器(如rtsp-simple-server)
var ffmpegArgs = $"-f rawvideo -pixel_format rgba -video_size 1920x1080 -framerate 30 -i - -c:v libx264 -preset ultrafast -tune zerolatency -f rtsp {streamUrl}";

var ffmpegProcess = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = ffmpegPath,
        Arguments = ffmpegArgs,
        UseShellExecute = false,
        RedirectStandardInput = true,
        CreateNoWindow = true
    }
};
ffmpegProcess.Start();

// 循环渲染并推流
while (IsRendering)
{
    // 执行你的SkiaSharp绘制逻辑,输出到SKBitmap
    RenderFrameToBitmap(yourBitmap);

    // 将像素数据写入FFmpeg标准输入
    using var inputStream = ffmpegProcess.StandardInput.BaseStream;
    inputStream.Write(yourBitmap.Pixels, 0, yourBitmap.Pixels.Length * sizeof(int));
    inputStream.Flush();

    // 控制帧率,30fps对应约33ms间隔
    Thread.Sleep(33);
}

// 停止推流
ffmpegProcess.StandardInput.Close();
ffmpegProcess.WaitForExit();

关键注意点:

  • 必须在FFmpeg参数中明确指定-pixel_format rgba,否则会因格式不匹配导致画面错乱。
  • 推RTSP流需先启动RTSP服务器(如轻量的rtsp-simple-server),FFmpeg仅负责编码推流,不提供服务器功能。
  • 若要支持浏览器,可将输出格式改为HTTP-FLV(-f flv http://localhost:8080/stream.flv),配合flv.js播放;或HLS(-f hls http://localhost:8080/stream.m3u8),直接用浏览器video标签播放。

2. 使用.NET原生媒体编码库(无外部依赖)

如果不想依赖FFmpeg,可基于Windows平台的Media Foundation或跨平台的Microsoft.Media.MediaEncoder实现编码推流,但兼容性不如FFmpeg:

  • 将SkiaSharp的SKBitmap转换为IMFMediaBuffer(Media Foundation)或SoftwareBitmap(UWP)。
  • 调用系统编码器生成H.264码流,再通过RTSP/HTTP协议推送。
    此方案仅推荐Windows平台场景,跨平台下复杂度较高。

3. 常见FFmpeg失败排查

如果你之前尝试FFmpeg失败,可检查以下几点:

  • 流地址错误:RTSP/HLS流需要对应服务器接收,不能直接推送到空地址。
  • 权限问题:FFmpeg进程是否有权限访问标准输入或目标服务器。
  • 帧率不稳定:添加-re参数(放在-i -前),让FFmpeg按指定帧率处理输入,避免因写入速度波动导致流卡顿。

内容的提问来源于stack exchange,提问作者emillio5

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 02:01:13