当directshow AVIMux提供两个数据流(例如音频和视频)并且一个流先于另一个流开始时,是否有任何方法可以控制AVIMux的行为方式?即,如果AVIMux在音频开始之前获得几个视频帧,它实际上将省略来自输出AVI的视频帧。这与最后当音频丢失时的情况形成鲜明对比,当时音频包含视频帧。
我的音频和视频来源是实时流(商业捕捉过滤器,我无法真正改进/控制),即使音频稍后开始,我也希望保留视频帧。
有一个很好的方法吗?我可以想象将两个过滤器包装成一个带有自己图形的自定义过滤器并根据需要插入静音,但是不必去解决所有这些问题就太棒了。
答案 0 :(得分:0)
关于在多路复用器中丢帧的问题看似错误。多路复用器查看视频和音频数据时间戳。如果"之前几帧......"表示时间戳为负数且数据为预卷数据,然后将其删除并从结果文件中排除。否则,无论多路复用器输入的实际数据顺序如何,都包括在内。音轨的开头会出现相应的音频静音。
即,确保数据已正确加盖时间戳,多路复用器将对其进行写入。
答案 1 :(得分:0)
tl; dr - 对于我的用例,我在最终AVI中没有出现的帧是showstopper,而且AVI mux / demux过程很复杂,我最好只假设一些可以在开始时丢弃少量帧。因此,在开始处理帧之前,我可能会决定在开始时推送一些特殊帧(在像素中编码的GUID /计数器对)。然后,我可以在写入AVI后查找这些特殊帧,以识别处理开始的帧。
我所看到的一切都让我相信我最初的要求实际上是不可能的。基于文件大小,我认为技术上视频帧被写入AVI文件,但对于大多数意图,它们可能不是。
即,像virtualdub和VLC这样的avi播放器,甚至是directshow AVI分离器,忽略/丢弃音频开始前存在的任何视频帧。所以我想你必须用其他库来解析AVI文件以提取前音频帧。
我关心这个的原因是因为我写了一个并行数据结构,其中包含AVI文件中每个帧的条目,我需要知道哪个数据与哪个帧相关。如果从AVI中删除帧,我就无法匹配帧和数据。
我成功地在视频/音频捕获过滤器之后创建了自定义变换滤镜。这些过滤器查看时间戳并丢弃视频帧,直到建立音频开始时间并且视频帧在此之后。然后,下游过滤器知道他们可以依赖于他们处理的视频帧。缺点是音频滤波器实际上提供了一点延迟的采样,所以当音频从100ms开始时,我都没有发现,直到我已经处理了250ms的视频帧,这意味着我已经掉线了250毫秒的视频数据,以确保我知道视频帧何时会伴随音频。当视频在音频启动后启动超过1个视频采样持续时间时,将其与不同的AVI工具相结合,我对尝试控制AVIMux / Splitter的信心开始减弱。
所有这一切都让我接受了AVIMux和AVI Splitter的复杂性,以至于不值得尝试完全控制它们。