逐帧访问视频

时间:2009-10-08 16:06:44

标签: language-agnostic video filter frames

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

9 个答案:

答案 0 :(得分:5)

  
    

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

  

您是否希望获得未压缩的视频帧并在呈现之前对其进行修改?或者您想修改视频帧,将它们保存回媒体文件?

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

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

如果您只想获取帧,那么directshow中有一个非常简单的界面叫做IMediaDet。我有written a simple class可以轻松地从媒体文件中提取任何帧。它适用于WPF,但你可以将其用于直接使用GDI。

答案 1 :(得分:4)

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

答案 2 :(得分: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)中打开这些脚本。

答案 3 :(得分:3)

好的,既然你要求“简单”,我必须提到HTML5< video>。请参阅以下链接中的演示和说明:

答案 4 :(得分:1)

Hy Opencv就是您所需要的。它是一个框架,你可以操纵图像,视频和更多东西检查http://opencv.willowgarage.com/wiki/

答案 5 :(得分:0)

在MS的一些C ++包中有一个名为AviFile的类。我不确定发生了什么事。

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

AVI文件格式(这是很好的文档,你可以在谷歌下找到)有点类似于:

AVIRIFF  size speed imgWidth imgHeight frameTotal imgCodec audioCodec frame size 
  FRAME
  SOUND
  FRAME 
  SOUND

答案 6 :(得分:0)

考虑创建VLC plug-in

在Linux和Windows上运行,支持实时直播视频,文件流,编解码器等。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

您可以使用FFMpeg

检查FFmpeg documentation