什么是最容易编码的技术,它可以让我实时访问视频的帧,并允许我修改它们。我知道 DirectShow,但它的编程模型似乎相当复杂。有没有一个框架可以让这样的帧过滤器更容易编程?
9 回答
让我实时访问视频的帧,并允许我修改它们
您是否正在寻找未压缩的视频帧并在渲染之前对其进行修改?或者您想修改视频帧,将它们保存回媒体文件?
第一个会稍微容易一些。尽管 DirectShow 乍一看可能看起来很复杂,但它确实是一个优雅的框架。我强烈建议查看 DirectShow.NET 示例。要访问视频的帧,您只需配置 SampleGrabber 过滤器并将其添加到 DirectShow 图形,执行 graph.RenderFile(mymediafile, null),您将收到每个帧的回调。您可以修改像素数据,它将出现在渲染的视频上。这不应占用超过 1 页的代码。我有一个使用 SampleGrabber 的示例源代码,但它是为网络摄像头制作的。播放媒体要容易得多(graph.RenderFile!)。
如果您需要将这些内容写入文件,您将执行与上述类似的操作,但您必须将图形配置为使用视频编码器和复用器,而不是使用视频渲染器。对于 DirectShow 的新手来说可能不好玩;)。
如果您只想获取帧,directshow 中有一个非常简单的接口,称为 IMediaDet。我编写了一个简单的类来轻松地从媒体文件中提取任何帧。它面向 WPF,但您可以将其与直接 GDI 一起使用。
您可以查看使用 libavcodec 库的ffmpeg命令和开源项目。
我不知道您到底要达到什么目的,所以这可能对您没有帮助,但是如果您只需要动态更改视频的帧,我强烈建议您查看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)中打开这些脚本。
好的,既然你要求“简单”,我不得不提到 HTML5 <video>。在这些链接中查看演示和说明:
Hy Opencv 正是您所需要的。它是一个可以操作图像、视频和更多内容的框架,请查看http://opencv.willowgarage.com/wiki/
不久前,在一些来自 MS 的 C++ 包中有一个名为 AviFile 的类。我不确定那会发生什么。
如果您坚持使用 Windows,则解决此问题的最佳方法是使用 DirectShow。
AVI 文件格式(文档很好,您可以在 google 下找到)有点类似于:
AVIRIFF size speed imgWidth imgHeight frameTotal imgCodec audioCodec frame size
FRAME
SOUND
FRAME
SOUND
考虑创建一个 VLC插件
在 Linux 和 Windows 上运行,支持实时实时视频、文件流式传输、编解码器负载等。
最简单的解决方案是使用AVIFile API。有很多可用的样品。