phone ocultos lumia instalar explorar desde descargar como archivos actualizar actualizacion windows-phone-8.1 h.264 ms-media-foundation

ocultos - Resolución máxima de Windows Phone 8.1 Media Foundation H264



windows 10 mobile actualizacion (1)

Encontré la solución buscando tasas de bits predeterminadas para cada resolución,

1080p funciona con una tasa de bits de 5.0 Mbps,

1600x900 funciona con una tasa de bits de 2.5 Mbps,

720p funciona con una tasa de bits de 1.25 Mbps ...

Intento codificar un video en Windows Phone 8.1 usando la biblioteca de Media Foundation y el escritor de sink.

Pude lograr esto estableciendo MFVideoFormat_H264 como MF_MT_SUBTYPE para mi salida de medios y usando resoluciones como 720p y 480p.

Pero cuando cambio la resolución a 1920x1080 (o 1920x1088) obtengo un error de Incorrect Parameter . así que supongo que mi resolución máxima para el códec H.264 es 1280x720.

Intenté cambiar el códec a HVEC o MPEG2, etc. ... pero no tuve suerte.

Este es el código cpp donde configuro el tipo de salida y lo agrego a la transmisión:

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

Y aquí es donde configuro el tipo de entrada:

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

Para agregar muestras al escritor de receptor, estoy usando esta función, y aquí es donde ocurre la excepción:

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

¿Por qué crees que recibo la excepción y cómo puedo solucionar esto?

Gracias.