我目前正在尝试实施一种算法,该编码可以在编码到另一个MP4时使用Media Foundation快速丢弃不需要的帧(使用Media Foundation)。
编码部分似乎并不坏 - “Source Reader plus Sink Writer”方法很好而且快速。你基本上只需要创建一个IMFSourceReader和一个IMFSinkWriter,在writer,yada,yada,yada和just loop:source。ReadSample(& sample) - >上设置源本机媒体类型。作家WriteSample。(安培;样品)。 WriteSample()调用可以取决于它们是否“!2 b丢弃”。
如果您认为读取的样本将是“预测帧”,即H.264编码流中的P帧,那么天真的方法就不好了。在此之前丢弃任何先前的“帧内编码图像帧”(I帧或关键帧)将导致视频乱码。
所以,我的问题是,是否有可能在恢复水槽写入器中的样本写入之前将I帧(不知何故)引入接收器编写器?
使用MFSampleExtension_CleanPoint属性执行某些操作似乎没有帮助。我可以手动创建一个IMFSample(通过MFCreateSample),但是以正确的H.264格式获取它可能会很棘手。
有什么想法吗?或者想一想在编码期间丢帧的其他方法吗?
答案 0 :(得分:2)
我认为如果不重新录制视频,这是不可能的! P帧和I帧之间的参考位于h264比特流中,而不在容器(MP4)中。您只能安全地跳过未从其他帧引用的帧:
Normaly这些框架没有被引用,但它们可以!这取决于用于创建h264流的编码器设置