【问题标题】:DirectShow Record Problem - fpsDirectShow 记录问题 - fps
【发布时间】:2011-05-30 06:47:52
【问题描述】:

我只是创建简单的图表来记录来自源过滤器的视频:

SourceFilter ---> Muxer ---> FileWriter

我可以将来自 SourceFilter 的视频保存到我的本地磁盘。

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

肯定存在fps(每秒帧数)问题。我该如何解决?有什么想法吗?

PS:

要检查我的 SourceFilter 是否提供正确的 fps,我只需创建另一个图表:

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

它以正确的速度播放 (fps)

更多详情:

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

此记录但 fps 错误。

当我尝试 gdcl MP4 Mux (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)写入文件。而且我可能不需要将音频与视频同步...为什么需要复用器吗?

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

SourceFilter(whatever format) ---> File writer

【问题讨论】:

  • 如果您在问题中添加文件格式和编解码器信息会有所帮助
  • 谢谢拉尔夫。文件格式为 mp4 和 h264。我在更多详细信息部分的问题中添加了更多详细信息。 @Ralf
  • 我之前在 AVI 多路复用器上遇到过类似的问题,不幸的是很久以前我不记得我的问题是什么了。您是否根据msdn.microsoft.com/en-us/library/dd318188(v=vs.85).aspx 在源过滤器中设置 VIDEOINFOHEADER 的 AvgTimePerFrame?
  • 其实,现在我只是使用 GraphEdit...没有编程任何东西...我没有在 SOURCE 过滤器中做任何修改。

标签: video directshow video-capture directshow.net


【解决方案1】:

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

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

【讨论】:

  • 另一个详细说明 Geraint 答案的示例:当使用 Intel 2012 Media SDK 的 H.264 编解码器和 .mp4 muxer 时,丢弃的捕获帧似乎完全被忽略了。虽然这在转码环境中并不重要(因为从不丢帧),但在捕捉时却是一个严重的限制,因为丢帧的数量会缩短影片长度。
【解决方案2】:

在我的情况下,我确实有一个没有正确设置 AvgTimePerFrame 的源过滤器。在我修复它(这是我自己的源过滤器)之后,AVI 也与它从上游接收到的任何内容一起使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 2021-01-25
    • 1970-01-01
    • 2011-08-07
    相关资源
    最近更新 更多