2011-05-30 47 views
2

我只是创建从源过滤器简单的图来记录视频:DirectShow的记录问题 - FPS

SourceFilter ---> Muxer ---> FileWriter 

我能保存视频当中来自SourceFilter到我的本地磁盘。

But when i try to play the recorded video, it play in "slow motion" :-). 

确定存在fps(帧persecond)问题。我该如何解决它?有任何想法吗?

PS:

要检查我的SourceFilter给右击FPS我简单地创建另一个图表:

SourceFilter ---> Video Decoder ---> Video Renderer 

和小青在合适的速度(fps)的

更多详细信息:

SourceFilter(*.mp4 file format) ---> Avi Mux Filter ---> File writer Filter 

此记录但在错误的fps。

当我尝试gdcl MP4复合器(can see it here)我成功地获得正确的fps。

SourceFilter(*.mp4 file format) ---> GDCL MPEG 4 Mux Filter ---> File writer Filter 

其他情形

SourceFilter(*.h264 file format) ---> Avi Mux Filter ---> File writer Filter 
SourceFilter(*.h264 file format) ---> GDCL MPEG 4 Mux Filter---> File writer Filter 

它的记录,但记录文件无法播放

而实际上我不想解码任何东西......只需将最初编码的视频帧(mp4,h264)写入文件即可。而且我也许不需要与视频同步音频...为什么需要Mux?

我理想中的过滤器应该是这样的:

SourceFilter(whatever format) ---> File writer 
+0

它可以帮助如果您添加文件格式和编解码器信息的问题 – Ralf 2011-05-30 08:13:26

+0

谢谢拉尔夫。文件格式是mp4和h264。我在更多细节部分提供了更多细节。 @Ralf – DSBoy 2011-05-30 08:45:42

+0

我遇到过类似的问题与AVI mux之前,不幸的是很久以前我不记得在我的情况下是什么问题。根据http://msdn.microsoft,您是否在源代码过滤器中设置VIDEOINFOHEADER的AvgTimePerFrame?COM/EN-US /库/ dd318188(V = vs.85)的.aspx? – Ralf 2011-05-30 09:34:18

回答

3

拉尔夫的评论可能是正确的。 AVI文件格式不具有每帧时间戳,只是平均帧速率。所以当帧到达时,多路复用器必须决定是将这个帧放在下一个“时隙”中,还是插入一个“丢帧”标记,然后将帧放入插槽中。如果源过滤器的时间戳与媒体类型的帧速率不匹配,那么您将获得此效果。

您可以将视频基本流保存到文件,但使用转储过滤器示例,而不是文件编写器。文件写入器有一个特殊的协议,允许多路复用器随机访问文件(使用时间戳作为文件偏移量)。您只想将数据保存为流,而转储示例则会这样做。

+0

进一步举例说明Geraint的答案:使用英特尔2012媒体SDK的H.264编解码器和.mp4多路复用器丢弃捕获帧似乎完全被忽略。虽然这在代码转换环境中并不重要(因为帧永远不会丢失),但在捕获时这是一个严重的限制,因为电影长度会因丢失帧数而缩短。 – 2012-01-15 08:55:05

1

在我的情况下,我确实有一个源过滤器没有正确设置AvgTimePerFrame。在我修正后(它是我自己的源代码过滤器)之后,AVI也随之接收了上游收到的任何内容。