1

我目前有一个可以正确播放的 DirectShow.NET 图,但我希望它也能够反向播放(从最后开始并向后播放)。

我尝试过使用 IMediaSeeking::SetRate(double) 方法,但这仅适用于正值。当我尝试使用负值时,它会崩溃。

帮助!

我正在使用 .avi 视频文件,但如果可以的话,我愿意尝试不同的格式。

4

3 回答 3

6

实际上,我不确定库存的 AVI 解复用器是否支持任何格式的负速率,即使该格式不使用时间压缩也是如此。当然,大多数其他 demux 过滤器不支持负速率。因此,您可能需要一个自定义 demux 过滤器来执行此操作。如果您这样做,请确保使用带有索引的容器格式(例如 mp4)。

如果您使用没有时间压缩的格式(运动 jpeg、仅 i-frames mpeg-2 等),您将在帧压缩方面付出相当大的代价,以便能够反向播放。如果您想很好地做到这一点,请考虑一些 DVD 实现所采用的方法。其中一些通过仅播放 i 帧来反向播放,因此您有 1 或 2 fps。但是高端实现将解码整个 GOP(大约 15 帧),然后在解码前一个 GOP 时以相反的顺序渲染这些帧。这在开发方面和系统资源方面都是昂贵的,但会得到良好的最终结果。

G

于 2009-11-15T18:05:42.070 回答
2

您是否尝试过各种视频文件?由于时间压缩技术,许多文件只能向前播放(即一帧中的信息取决于前一帧中的信息)。

您可以使用GSpot检查您的文件,看看它是否包含任何 P 帧;如果是这样,您不太可能反向播放它。AVI 是一个容器,其中的视频可以使用任何编解码器。

于 2009-11-12T21:32:11.850 回答
1

反复调用 IMediaSeeking::SetPositions 以每次向后退一帧将给您反向播放。它不太可能很顺利,但我认为这将是您无需编写多个自定义过滤器即可实现的最佳效果。

使用像 mjpeg 或 jpeg2000 这样没有任何时间压缩的编解码器对这项技术有很大帮助。对于常规的现代编解码器,降低分辨率和比特率会有所帮助。

您是否需要能够在任意时间对任意文件进行反向播放?如果您可以预处理您的媒体文件,那么准备一个可以切换到的反转版本就不难了。如果您对低级工具感到满意,Avisynth 可以做到这一点。

于 2009-11-19T19:42:19.123 回答