Windows Media Foundation:IMFSinkWriter WriteSample API未设置返回错误sampleduration的时间

问题描述 投票:0回答:1

我需要接收RTP流(H264)并将其导出到MP4文件。我们正在使用媒体基础将RTP流中接收的帧导出到mp4文件。因此,我们从RTP数据包中提取H264帧,并通过WriteSample API(设置采样时间,采样持续时间等)将其提供给接收器。这似乎可行,并且我可以播放mp4。但是,当我未设置采样持续时间(使用SetSampleDuration API)时,writeSample会引发错误(MF_E_NO_SAMPLE_DURATION)。在最初的几帧中不会引发该错误,而只会在一定的时间后(1.48秒后的帧)引发该错误问题:1.为什么需要SetSampleDuration?我假设如果我们为每个样本提供采样时间,则不需要样本持续时间。接收器编写器可以计算当前帧和最后一帧之间的差异作为采样持续时间2.为什么writeSample API的前几帧没有引发错误。WriteSample仅在特定时间(1.48秒后的帧)之后才引发错误。它特定于某些帧吗?3.当帧之间的持续时间不一致时,我们如何理想地设置采样持续时间。在我的情况下,平均fps为15,但2帧之间的时间不一致。 (以毫秒为单位的帧时间戳:0、83,133、200、283,333,400等)3.1要设置一帧的采样持续时间,请等待下一帧并从下一帧时间戳中减去当前帧时间戳。应用程序应推迟到下一帧可用3.2根据平均fps设置采样持续时间是可以的(即使帧之间的时间差并不均匀)。(注意:我尝试过3.2,它可以工作。我看不到任何问题。这可能是因为帧之间的时间差不是均匀的,但是变化不大。但是我不确定这是否可以。我应该寻求解决方法吗? 3.1)

windows media ms-media-foundation
1个回答
0
投票

您在这里有许多不同的问题。

关于设置时间戳记和持续时间,我建议检查documentation。它解释了时间戳如何与演示时间等相关。

要设置持续时间,您应该使用源流的采样率。如果以H264的正常90KHz速率采样,然后以15fps采样,则每个采样的持续时间为66ms。 Media Foundation样本使用100's of nano seconds的时间戳分辨率,因此IMFSample持续时间应为660000。您的RTP标头时间戳也应在15ps处具有6000的间隔(6000 x 15 = 90000)。

对于时间戳记,因为您将其保存到文件中,所以应该从0开始,并且每次获得的采样增量为660000的采样持续时间。

© www.soinside.com 2019 - 2024. All rights reserved.