逐帧访问视频

3

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

9个回答

5
给我实时访问视频帧并允许我修改它们。
你是否想要获取未压缩的视频帧并在呈现之前对其进行修改?还是想要修改视频帧,并将其保存回媒体文件?
第一个选择会稍微容易一些。尽管DirectShow初看起来可能很复杂,但它确实是一个优秀的框架。我强烈建议查看DirectShow.NET示例。要访问视频的帧,您只需配置和添加SampleGrabber过滤器到DirectShow图中,在graph.RenderFile(mymediafile,null)中执行,然后您将为每个帧接收回调。您可以修改像素数据,它将出现在渲染的视频上。这不需要超过1页的代码。我有一个使用SampleGrabber的示例源代码,但它是针对网络摄像头制作的。播放媒体更容易(graph.RenderFile!)。
如果您需要将此内容写入文件,则需要做类似于上述描述的操作,但是您将不使用视频渲染器而是配置图形使用视频编码器和混合器。对于新手来说可能不太好玩😉。
如果您只想获取帧,则DirectShow中有一个非常简单的接口称为IMediaDet。我已经编写了一个简单的类,可轻松从媒体文件中提取出任何帧。它针对WPF进行了优化,但您可以将其裁剪为使用直接GDI。

我想获取帧,修改它们,然后将它们渲染到屏幕上。关于你的WPF实现,我应该担心任何性能问题吗? - luvieere
我的MediaDetector类只适用于从媒体中提取缩略图。不建议用于视频播放。我拥有的SampleGrabber网络摄像头示例非常高效。您可以获得回调,暴露将发送到渲染器的实际帧缓冲区。使用WPF是否允许您完全不使用DShow?使用WPF,您可以轻松地在视频上合成各种元素,包括MediaElement。 - Jeremiah Morrill

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

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

1

0
以前微软的几个C++包中有一个叫做AviFile的类。我不确定它现在发生了什么事情。
解决这个问题最好的方法是如果你仍然使用Windows,那就使用DirectShow。
AVI文件格式(可以在谷歌上找到详细文档)与一些东西有点相似:
AVIRIFF  size speed imgWidth imgHeight frameTotal imgCodec audioCodec frame size 
  FRAME
  SOUND
  FRAME 
  SOUND

0

考虑创建一个VLC 插件

该插件可在Linux和Windows上运行,支持实时视频直播,从文件流式传输,支持众多编解码器等功能。


0

最简单的解决方案是使用AVIFile API。有许多示例可用。


0

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