【发布时间】:2014-03-05 17:16:45
【问题描述】:
我目前正在尝试实现一种算法,该算法可以在编码到另一个 MP4 时快速丢弃 MP4 视频中不需要的帧(使用 Media Foundation)。
编码部分似乎还不错——“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 格式可能会很棘手。
有什么想法吗?或者对在编码期间丢帧的其他方法有什么想法?
【问题讨论】:
标签: c++ video ms-media-foundation