29.97的视频时间戳计算

时间:2019-03-06 07:47:39

标签: ms-media-foundation

我想使用Media Foundation的IMFSinkWriter编写H264视频流。除了帧速率,一切都按预期工作。帧速率在MediaInfo工具中显示为:

Frame rate mode: Constant
Frame rate: 29.970 (29970/1000) FPS
Original frame rate: 29.970 (30000/1001) FPS

如何实现我的视频流的帧速率为29.970(30000/1001)FPS,而不是29.970(29970/1000)?

//in a loop
IMFSample* imfSample = getSample(); 

static constexpr int64_t k100NanoSec = 10000000;
int64_t time = k100NanoSec * sampleNum * 1001 / 300000;
int64_t nextTime = k100NanoSec * (sampleNum + 1) * 1001 / 300000;
int64_t duration = nextTime - time;

imfSample->SetSampleDuration(duration); 
imfSample->SetSampleTime(time); 

sampleNum++;

输入和输出的IMFMediaType为:

IMFMediaType* mediaType = nullptr;
MFCreateMediaType (&mediaType);
mediaType->SetGUID (MF_MT_MAJOR_TYPE, MFMediaType_Video);
mediaType->SetGUID (MF_MT_SUBTYPE, MFVideoFormat_H264);
mediaType->SetUINT32 (MF_MT_AVG_BITRATE, 12200000);
MFSetAttributeSize (mediaType, MF_MT_FRAME_SIZE, 1920, 1080);
MFSetAttributeRatio (mediaType, MF_MT_FRAME_RATE, 30000, 1001);
MFSetAttributeRatio (mediaType, MF_MT_PIXEL_ASPECT_RATIO, 1, 1);
mediaType->SetUINT32 (MF_MT_MPEG2_PROFILE, eAVEncH264VProfile_Base);

DWORD index;
writer->AddStream (mediaType, &index);
writer->SetInputMediaType (index, mediaType, nullptr); 

我仔细检查了所有返回值-我刚刚在这里删除了代码。索引值为0。

1 个答案:

答案 0 :(得分:0)

实际上,是相同的。

我以29.970 FPS的速度下载了视频mp4文件(在“ MP4示例视频”下,下载jellyfish-25-mbps-hd-hevc):

big-list-of-sample-videos-for-testers

我使用MediaFoundation通过视频媒体类型上的SourceReader和MFGetAttributeRatio来检查此文件。我得到30000/1001。

然后我将MediaInfo与该文件一起使用,我得到29970/1000。

所以我认为这只是MediaInfo决定显示这种帧速率的方式。

MediaInfo源代码可用,因此可以验证这一事实。

PS :非常感谢您提出这个问题。我在项目H264Dxva2Decoder中进行了错误的计算:

之前:llDuration = itTime-> dwOffset *(10000000 / dwTimeScale);

之后:llDuration =(LONGLONG)((itTime-> dwOffset /(double)dwTimeScale)* 10000000);

之前:结果为333600

之后:结果为333667(使用MFAverageTimePerFrameToFrameRate,获得30000/1001)