3

什么是最容易编码的技术,它可以让我实时访问视频的帧,并允许我修改它们。我知道 DirectShow,但它的编程模型似乎相当复杂。有没有一个框架可以让这样的帧过滤器更容易编程?

4

9 回答 9

5

让我实时访问视频的帧,并允许我修改它们

您是否正在寻找未压缩的视频帧并在渲染之前对其进行修改?或者您想修改视频帧,将它们保存回媒体文件?

第一个会稍微容易一些。尽管 DirectShow 乍一看可能看起来很复杂,但它确实是一个优雅的框架。我强烈建议查看 DirectShow.NET 示例。要访问视频的帧,您只需配置 SampleGrabber 过滤器并将其添加到 DirectShow 图形,执行 graph.RenderFile(mymediafile, null),您将收到每个帧的回调。您可以修改像素数据,它将出现在渲染的视频上。这不应占用超过 1 页的代码。我有一个使用 SampleGrabber 的示例源代码,但它是为网络摄像头制作的。播放媒体要容易得多(graph.RenderFile!)。

如果您需要将这些内容写入文件,您将执行与上述类似的操作,但您必须将图形配置为使用视频编码器和复用器,而不是使用视频渲染器。对于 DirectShow 的新手来说可能不好玩;)。

如果您只想获取帧,directshow 中有一个非常简单的接口,称为 IMediaDet。我编写了一个简单的类来轻松地从媒体文件中提取任何帧。它面向 WPF,但您可以将其与直接 GDI 一起使用。

于 2009-10-22T00:40:01.723 回答
4

您可以查看使用 libavcodec 库的ffmpeg命令和开源项目。

于 2009-10-18T18:39:11.873 回答
4

我不知道您到底要达到什么目的,所以这可能对您没有帮助,但是如果您只需要动态更改视频的帧,我强烈建议您查看AviSynth。它是一个使用脚本语言来改变视频的视频帧服务器。还有一个 SDK,您可以使用它来编写二进制插件。已经有很多插件可用于完成各种任务。示例脚本如下所示:

AviSource("C:\video.avi")
Crop(20,0,-20,0) //Crops 20px from the left and right of video 
BicubicResize(640,480) //Resize to 640x480 using bicubic filter
# increase the gamma
Levels(0, 1.2, 255, 0, 255)

然后可以在媒体播放器或编码器(如 Virtualdub)中打开这些脚本。

于 2009-10-24T19:01:59.580 回答
3

好的,既然你要求“简单”,我不得不提到 HTML5 <video>。在这些链接中查看演示和说明:

于 2009-10-24T21:55:02.393 回答
1

Hy Opencv 正是您所需要的。它是一个可以操作图像、视频和更多内容的框架,请查看http://opencv.willowgarage.com/wiki/

于 2009-10-18T19:52:35.037 回答
0

不久前,在一些来自 MS 的 C++ 包中有一个名为 AviFile 的类。我不确定那会发生什么。

如果您坚持使用 Windows,则解决此问题的最佳方法是使用 DirectShow。

AVI 文件格式(文档很好,您可以在 google 下找到)有点类似于:

AVIRIFF  size speed imgWidth imgHeight frameTotal imgCodec audioCodec frame size 
  FRAME
  SOUND
  FRAME 
  SOUND
于 2009-10-08T23:43:16.420 回答
0

考虑创建一个 VLC插件

在 Linux 和 Windows 上运行,支持实时实时视频、文件流式传输、编解码器负载等。

于 2009-10-18T20:05:49.860 回答
0

最简单的解决方案是使用AVIFile API。有很多可用的样品。

于 2009-10-19T08:18:16.257 回答
0

您可以使用FFMpeg

检查 FFmpeg文档

于 2009-10-20T11:58:46.107 回答