Windows phone 8.1 Windows Phone 8.1媒体基金会H264最大分辨率 我试图用MediaFoundation库和Sink编写器在Windows Phone 8.1中编码一个视频。

Windows phone 8.1 Windows Phone 8.1媒体基金会H264最大分辨率 我试图用MediaFoundation库和Sink编写器在Windows Phone 8.1中编码一个视频。,windows-phone-8.1,h.264,ms-media-foundation,Windows Phone 8.1,H.264,Ms Media Foundation,我可以通过将媒体输出的MFVideoFormat_H264设置为MF_mtu_SUBTYPE,并使用720p和480p等分辨率来实现这一点 但是当我将分辨率更改为1920x1080(或1920x1088)时,我得到了一个不正确的参数错误。所以我猜H.264编解码器的最大分辨率是1280x720 我试着把编解码器改成HVEC或MPEG2等等。。。但是没有运气 这是我设置输出类型并将其添加到流中的cpp代码: // Setup the output video type ComPtr<

我可以通过将媒体输出的
MFVideoFormat_H264
设置为
MF_mtu_SUBTYPE
,并使用720p和480p等分辨率来实现这一点

但是当我将分辨率更改为1920x1080(或1920x1088)时,我得到了一个
不正确的参数
错误。所以我猜H.264编解码器的最大分辨率是1280x720

我试着把编解码器改成HVEC或MPEG2等等。。。但是没有运气

这是我设置输出类型并将其添加到流中的cpp代码:

// Setup the output video type   

ComPtr<IMFMediaType> spvideoTypeOut;
CHK(MFCreateMediaType(&spvideoTypeOut));
CHK(spvideoTypeOut->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video));

GUID _vformat =  MFVideoFormat_H264;

CHK(spvideoTypeOut->SetGUID(MF_MT_SUBTYPE, _vformat));
CHK(spvideoTypeOut->SetUINT32(MF_MT_AVG_BITRATE, _bitrate));
CHK(spvideoTypeOut->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive));
CHK(MFSetAttributeSize(spvideoTypeOut.Get(), MF_MT_FRAME_SIZE, _width, _height));
CHK(MFSetAttributeRatio(spvideoTypeOut.Get(), MF_MT_FRAME_RATE, framerate, 1));
CHK(MFSetAttributeRatio(spvideoTypeOut.Get(), MF_MT_PIXEL_ASPECT_RATIO, ASPECT_NUM, ASPECT_DENOM));

CHK(_spSinkWriter->AddStream(spvideoTypeOut.Get(), &_streamIndex));
//设置输出视频类型
ComPtr-spvideoTypeOut;
CHK(MFCreateMediaType(&spvideoTypeOut));
CHK(spvideoTypeOut->SetGUID(MF_MT_MAJOR_TYPE,MFMediaType_Video));
GUID _vformat=MFVideoFormat_H264;
CHK(spvideoTypeOut->SetGUID(MF_MT_子类型,_vformat));
CHK(spvideoTypeOut->SetUINT32(MF_MT_平均比特率,_比特率));
CHK(spvideoTypeOut->SetUINT32(MF_MT_INTERLACE_MODE,MFVideoInterlace_Progressive));
CHK(MFSetAttributeSize(spvideoTypeOut.Get(),MF_MT_FRAME_SIZE,_width,_height));
CHK(MFSetAttributeRatio(spvideoTypeOut.Get(),MF_mtu_FRAME_RATE,framerate,1));
CHK(MFSetAttributeRatio(spvideoTypeOut.Get(),MF_MT_PIXEL_ASPECT_RATIO,ASPECT_NUM,ASPECT_DENOM));
CHK(_spSinkWriter->AddStream(spvideoTypeOut.Get(),&_streamIndex));
这是我设置输入类型的地方:

// Setup the input video type   

    ComPtr<IMFMediaType> spvideoTypeIn;
    CHK(MFCreateMediaType(&spvideoTypeIn));
    CHK(spvideoTypeIn->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video));
    CHK(spvideoTypeIn->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_RGB32));
    CHK(spvideoTypeIn->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive));
    CHK(MFSetAttributeSize(spvideoTypeIn.Get(), MF_MT_FRAME_SIZE, _width, _height));
    CHK(MFSetAttributeRatio(spvideoTypeIn.Get(), MF_MT_FRAME_RATE, framerate, 1));
    CHK(MFSetAttributeRatio(spvideoTypeIn.Get(), MF_MT_PIXEL_ASPECT_RATIO, ASPECT_NUM, ASPECT_DENOM));

    CHK(_spSinkWriter->SetInputMediaType(_streamIndex, spvideoTypeIn.Get(), nullptr));

    CHK(_spSinkWriter->BeginWriting());
//设置输入视频类型
ComPtr-spvideoTypeIn;
CHK(MFCreateMediaType(&spvideoTypeIn));
CHK(spvideoTypeIn->SetGUID(MF_MT_MAJOR_TYPE,MFMediaType_Video));
CHK(spvideoTypeIn->SetGUID(MF_MT_子类型,MFVideoFormat_RGB32));
CHK(spvideoTypeIn->SetUINT32(MF_MT_INTERLACE_MODE,MFVideoInterlace_Progressive));
CHK(MFSetAttributeSize(spvideoTypeIn.Get(),MF_MT_FRAME_SIZE,_width,_height));
CHK(MFSetAttributeRatio(spvideoTypeIn.Get(),MF_mtu_FRAME_RATE,framerate,1));
CHK(MFSetAttributeRatio(spvideoTypeIn.Get(),MF_MT_PIXEL_ASPECT_RATIO,ASPECT_NUM,ASPECT_DENOM));
CHK(_spSinkWriter->SetInputMediaType(_streamIndex,spvideoTypeIn.Get(),nullptr));
CHK(_spSinkWriter->BeginWriting());
要向sink writer添加示例,我正在使用此函数,这就是发生异常的地方:

void PictureWriter::AddFrame(const Platform::Array<uint8>^ videoFrameBuffer, int imageWidth, int imageHeight)
{
    // Create a media sample   
    ComPtr<IMFSample> spSample;
    CHK(MFCreateSample(&spSample));
    CHK(spSample->SetSampleDuration(_duration));
    CHK(spSample->SetSampleTime(_hnsSampleTime));

    _hnsSampleTime += _duration;

    // Add a media buffer
    ComPtr<IMFMediaBuffer> spBuffer;
    CHK(MFCreateMemoryBuffer(_bufferLength, &spBuffer));
    CHK(spBuffer->SetCurrentLength(_bufferLength));
    CHK(spSample->AddBuffer(spBuffer.Get()));

    // Copy the picture into the buffer
    unsigned char *pbBuffer = nullptr;
    CHK(spBuffer->Lock(&pbBuffer, nullptr, nullptr));
    BYTE* buffer = (BYTE*)videoFrameBuffer->begin() + 4 * imageWidth * (imageHeight - 1);
    CHK(MFCopyImage(pbBuffer + 4 * _width * (_height - imageHeight),
        4 * _width, buffer, -4 * imageWidth, 4 * imageWidth, imageHeight));

CHK(spBuffer->Unlock());

    // Write the media sample   
    CHK(_spSinkWriter->WriteSample(_streamIndex, spSample.Get()));
}
void PictureWriter::AddFrame(常量平台::数组^videoFrameBuffer,int-imageWidth,int-imageHeight)
{
//创建媒体示例
ComPtr-spSample;
CHK(MFCreateSample(&spSample));
CHK(spSample->SetSampleDuration(_duration));
CHK(spSample->SetSampleTime(hnsSampleTime));
_hnsSampleTime+=\u持续时间;
//添加媒体缓冲区
ComPtr-spBuffer;
CHK(MFCreateMemoryBuffer(_bufferLength,&spBuffer));
CHK(spBuffer->SetCurrentLength(_bufferLength));
CHK(spSample->AddBuffer(spBuffer.Get());
//将图片复制到缓冲区中
无符号字符*pbBuffer=nullptr;
CHK(spBuffer->Lock(&pbBuffer,nullptr,nullptr));
字节*缓冲区=(字节*)视频帧缓冲区->开始()+4*图像宽度*(图像高度-1);
CHK(MFCopyImage(pbBuffer+4*_宽度*(_高度-图像高度),
4*_宽度,缓冲区,-4*图像宽度,4*图像宽度,图像高度);
CHK(spBuffer->Unlock());
//编写媒体示例
CHK(_spSinkWriter->WriteSample(_streamIndex,spSample.Get());
}
你认为我为什么会遇到异常,我如何解决这个问题


谢谢。

通过搜索每个分辨率的默认比特率找到了解决方案

1080p以5.0 Mbps的比特率工作

1600x900以2.5 Mbps的比特率工作


720p的比特率为1.25 Mbps…

如何在接收器写入程序的AddStream中设置媒体类型?您是否尝试过在其中指定高调?我添加了与此问题相关的所有代码。不,我不知道怎么做。你可以尝试添加:spvideoTypeOut->SetUINT32(MF\u MT\u MPEG2\u PROFILE,eavench264 vprofile\u High);今晚我一定会试试,然后通知你。Codecapi.h中的eAVEncH264VProfile枚举是否正确?是: