将原始帧转换为webm实时流

3
我有一个ASP.NET应用程序,其设置如下:
  1. 一个摄像头以656x492的分辨率捕获原始RGB帧。
  2. 这些帧在我的C#代码中进行处理(包括一些简单的图像处理)。
  3. 原始图像存储在字节数组中(同时也包装在位图容器中)。
  4. 缺少魔法:将原始图像缓冲区转换为WebM流
  5. 在另一端,我有一个函数HttpResponseMessage函数,它使用PushStreamContent函数连接WebM流(灵感来自于这篇博客文章)。该函数将视频文件的块推送到网站上。
  6. 一个播放视频的网站。

我正在努力弄清楚如何实现第4点。目前,我只能流式传输视频文件。但我想将我的原始缓冲区编码为WebM容器并将其流式传输到我的网站。 第5点的核心代码如下:

while (length > 0 && bytesRead > 0)
{
    bytesRead = video.Read(buffer, 0, Math.Min(length, buffer.Length));
    await outputStream.WriteAsync(buffer, 0, bytesRead);
    length -= bytesRead;
}

基本上,我想通过一种方法将我的原始帧实时编码为WebM格式并存储在“buffer”中,以便它们可以作为实时流推送到网站,并取代“video.Read”函数。有没有直接的方法来做到这一点?如果有些帧被丢弃了也没关系。
如果有更好的完全不同的方法,当然也可以提出建议。

你需要直播还是先录制然后再进行直播? - aergistal
1
@aergistal:我需要进行直播。我已经能够录制并流式传输文件了。 - Lucas
在直播过程中,如果您使用管道解决方案,请确保使用单个连续进程进行编码。否则,每次生成新进程时时间戳会重置(为接近零的值),从而导致输出流中出现不连续性。 - aergistal
2个回答

3

根据您在服务器上的能力(不包括部署Web应用程序),您可以考虑将缓冲区写入管道,然后使用后台运行的ffmpeg来创建流,并使用类似 -f rawvideo -pixel_format rgb24 -video_size 656x492 的输入参数。


我对服务器拥有完全的控制权!但是是否可能仅对视频的部分进行编码? - Lucas
我们经常使用这个(尽管在Linux上,概念是相同的),只需根据需要启动/停止ffmpeg进程。FFmpeg也可以(通过-t参数)告诉它仅编码多少秒。 - Eugen Rieck
这听起来是个不错的计划,而且它几乎可以实现。我能够将数据传输到ffmpeg,但是我无法将ffmpeg输出的数据传回我的应用程序。 - Lucas
我在Stack Overflow上发布了一个关于我的FFmpeg问题的新问题:https://dev59.com/6VwY5IYBdhLWcg3w2Ksv - Lucas

1

WebM项目提供DirectShow过滤器,用于播放和编码WebM。

我们提供直接在Windows上进行WebM播放和处理的DirectShow过滤器。一旦安装了这些过滤器,使用DirectShow框架(例如Windows Media Player等)的应用程序将能够播放和编码WebM媒体

还有一个FFmpegInterop Microsoft计划,它使用FFmpeg多媒体框架。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接