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