视频时间戳计算为29.97

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

我想使用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。

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

事实上,它是一样的。

我下载了一个29.970 FPS的视频mp4文件(在“MP4 Sample Videos”下,下载水母-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)

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