我目前正在尝试实现一种算法,当编码到另一个MP4(使用Media Foundation)时,该算法可以快速丢弃MP4视频中不需要的帧。

编码部分似乎还不错-“ Source Reader plus Sink Writer”方法既好又快速。您基本上只需创建一个IMFSourceReader和IMFSinkWriter,在writer,yada,yada,yada上设置源本机媒体类型,然后循环:source。ReadSample(&sample)-> writer。WriteSample(&sample )。可以根据WriteSample()调用是否被“!2 b丢弃”为条件。

如果您认为读取的样本将是H.264编码流中的“预测帧”(又称为P帧),那么这种幼稚的方法就不好了。在此之前丢弃任何前面的“帧内编码图片帧”(I帧或关键帧)将导致视频乱码。

因此,我的问题是,在恢复接收器写入器中的样本写入之前,是否可以将I帧(以某种方式)引入接收器写入器中?

MFSampleExtension_CleanPoint属性执行操作似乎无济于事。我可以手动创建IMFSample(通过MFCreateSample),但是以正确的H.264格式获取它可能很棘手。

有任何想法吗?还是对在编码过程中丢弃帧的其他方法有何想法?

最佳答案

我认为,如果不重新录制视频,这是不可能的! P帧和I帧之间的参考位于h264比特流中,而不位于容器(MP4)中。您只能安全地跳过其他框架未引用的框架:


GOP的最后一个P帧(在下一个I帧之前)
B帧


通常,这些框架不被引用,但是可以被引用!这取决于用于创建h264流的编码器设置

关于c++ - 如何使用Media Foundation从MP4视频中丢弃任意帧?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22204623/

10-10 21:50