【问题标题】:0xC00D4A44 MF_E_SINK_NO_SAMPLES_PROCESSED with MPEG 4 sink0xC00D4A44 MF_E_SINK_NO_SAMPLES_PROCESSED 与 MPEG 4 接收器
【发布时间】:2017-03-25 16:43:35
【问题描述】:

我想不出为什么会得到这个 HRESULT。

我在媒体基金会有一个管道。通过源解析器加载文件。我正在使用媒体会话。

这是我的一般管道:

Source Reader -> Decoder -> Color Converter (to RGB24) -> Custom MFT -> Color Converter (To YUY2) -> H264 Encoder -> Mpeg 4 Sink

在我的自定义 MFT 中,我对帧进行了一些编辑。 MFT 的任务之一是过滤样本并丢弃不需要的样本。

此管道用于修剪视频并输出 MP4 文件。

例如,如果用户想要从 10 秒标记中修剪 3 秒,我的 MFT 将读取未压缩的采样时间并通过要求更多采样来丢弃它。如果样本在范围内,它将被传递到下一个颜色转换器。我的 MFT 处理 RGB24 中的帧,因此是初始颜色转换器的原因。第二个颜色转换器为 H264 编码器转换颜色空间。我正在使用 High Profile Level 4.1 编码器。

管道已正确设置。所有的帧都被传递到接收器,我有一个 MPEG4 接收器的包装器。我看到 BeginFinalize 和 EndFinalize 被调用。

但是在我的一些修剪操作中,EndFinalize 吐出了 MF_E_SINK_NO_SAMPLES_PROCESSED。我认为这是随机的。这通常发生在选择不接近开头的范围时。

这可能是由于采样时间。我正在重新设置采样时间和持续时间。

例如,如果调整后的帧持续时间为 50 毫秒(由用户选择),我将获取第一个可接受的样本(假设为 1500 毫秒)并将其变基为 0。下一个将在我的 MFT 中为 1550 毫秒,然后设置为50ms 以此类推。因此帧时间以 50 毫秒为增量设置。

这种方法正确吗?可能是接收器没有接收到足够的样本来写入标头并最终确定文件吗?

如前所述,它在某些情况下有效,但在大多数情况下都失败了。我在 Windows 10 上运行我的代码。

【问题讨论】:

    标签: video-processing ms-media-foundation mpeg-4


    【解决方案1】:

    我尝试使用 IMFMediaSession/IMFtopology 实现相同的任务,但遇到了与您相同的问题。我认为 IMFMediaSession 要么修改您的 MFT 之外的时间戳,要么期望它们不会被您的 MFT 修改。 因此,为了完成这项工作,我采用了 IMFSourceReader->IMFSinkWriter 方法。 通过这种方式,我可以修改从阅读器读取的样本的时间图,并仅将那些落在给定范围内的样本传递给编写器。 此外,您可以查看旧的 MFCopy 示例。它完全按照您的描述进行文件修剪。你可以从这里下载:https://sourceforge.net/projects/mfnode/

    【讨论】:

    • 不幸的是,我不能使用 SinkWriter,因为我有一个通用管道,我已经开发了多个定制的接收器。但是我发现了一个有趣的案例。在我的媒体会话包装器中,我检查源是否可搜索。如果为真,我要求会话从用户选择的时间开始。我注释掉了代码并让它始终从 0 开始。问题已经消失了……不知道为什么这很重要
    • 仅供参考,自定义媒体接收器也可以与接收器写入器一起使用。
    • 哦,你是对的。我的错。我完全想过把整个事情都放下来,让水槽作家的方式变得更快。我实际上可能会尝试一下,看看会发生什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2015-03-02
    • 1970-01-01
    相关资源
    最近更新 更多