windows-phone-8.1 - Windows Phone 8.1 Media Foundation H264 最大分辨率

标签 windows-phone-8.1 h.264 ms-media-foundation

我正在尝试使用 Media Foundation 库和接收器编写器在 Windows Phone 8.1 中对视频进行编码。

我已经能够通过将媒体输出的 MFVideoFormat_H264 设置为 MF_MT_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));

这是我设置输入类型的地方:

// 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());

为了向接收器编写器添加示例,我正在使用此函数,这是发生异常的地方:

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()));
}

您认为我为什么会得到异常,我该如何解决这个问题?

谢谢。

最佳答案

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

1080p 以 5.0 Mbps 的比特率工作,

1600x900 以 2.5 Mbps 的比特率工作,

720p 以 1.25 Mbps 的比特率工作...

关于windows-phone-8.1 - Windows Phone 8.1 Media Foundation H264 最大分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43261831/

相关文章:

cordova - 推送通知WP8.1 "Invalid channel URL"

objective-c - iOS 中的 H.264 编码器和解码器

video - 如何正确估计mp4 H.264视频大小?

c++ - 如何使用 Microsoft Media Foundation 的 Sink Writer 播放音频

h.264 - 解码 H264 流始终返回 MF_E_TRANSFORM_NEED_MORE_INPUT

vb.net - 不要将文字作为本地化参数传递

c# - 为运行时应用程序创建 SIlverlight 包装器类

c# - 将 .xml 文件读入 XmlDocument

compression - H.264 或视频编码器通常如何计算两帧的残差图像?

c# - 将 H.264 帧复用到 MP4 时,Media Foundation IMFSinkWriter::Finalize() 方法在 Windows 7 下失败