在 UWP 应用程序中使用 MediaPlayer 播放时,YUV420P 视频看起来有点发白

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

我在 C++ 中使用 ffmpeg API 将 h264 视频流转换为 yuv420p,然后我构建一个 MediaStreamSource 并使用 MediaPlayer 播放它。

一切看起来都很好。不过最近发现视频画面有点发白,分不清浅灰色和白色区域

网上查了很多资料,怀疑和color_range,color_space有关。但是我对ffmpeg不熟悉,尝试了这两个选项相关的各种参数,都没有效果。 MediaPlayer 似乎也没有与色彩空间相关的设置。

有人能帮帮我吗?非常感谢!

C#代码:

var videoProperties = VideoEncodingProperties.CreateUncompressed(MediaEncodingSubtypes.Iyuv, width, height);
var videoDescriptor = new VideoStreamDescriptor(videoProperties);
var mediaStreamSource = new MediaStreamSource(videoDescriptor);
mediaStreamSource.BufferTime = TimeSpan.Zero;
mediaStreamSource.CanSeek = false;
mediaStreamSource.IsLive = true;
mediaStreamSource.SampleRequested += MediaStreamSource_SampleRequested;
mediaSource = MediaSource.CreateFromMediaStreamSource(mediaStreamSource);

C++ 代码

// Initialize
m_pCodec = avcodec_find_decoder(AV_CODEC_ID_H264);
m_pCodecCtx = avcodec_alloc_context3(m_pCodec);
m_pCodecCtx->extradata = (uint8_t*)av_malloc(privatedatalen);
m_pCodecCtx->extradata_size = privatedatalen;
memcpy(m_pCodecCtx->extradata, privatedata, privatedatalen);
m_pCodecCtx->pix_fmt = AV_PIX_FMT_YUV420P;
//m_pCodecCtx->color_range = AVCOL_RANGE_JPEG;
//m_pCodecCtx->colorspace = AVCOL_SPC_BT2020_CL;

// Remove padding
for (int i = 0; i < pFrame->height; i++) {
    memcpy(data + pFrame->width * i, pFrame->data[0] + pFrame->linesize[0] * i, pFrame->width);
    if (i < pFrame->height / 2)
    {
        memcpy(data + pFrame->width * pFrame->height + pFrame->width * i / 2, pFrame->data[1] + pFrame->linesize[1] * i, pFrame->width / 2);
        memcpy(data + pFrame->width * pFrame->height * 5 / 4 + pFrame->width * i / 2, pFrame->data[2] + pFrame->linesize[2] * i, pFrame->width / 2);
    }
}

第一个解码的AVFrame:

姓名 价值 类型
宽度 998 int
身高 2160 int
格式 AV_PIX_FMT_YUVJ420P (12) int
关键帧 1 int
图片类型 AV_PICTURE_TYPE_I (1) AV图片类型
旗帜 0 int
颜色范围 AVCOL_RANGE_JPEG (2) AV色彩范围
color_primaries AVCOL_PRI_BT709 (1) AVColorPrimaries
颜色_trc AVCOL_TRC_BT709 (1) AVColorTransferCharacteristic
色彩空间 AVCOL_SPC_BT709 (1) AV色彩空间
色度_位置 AVCHROMA_LOC_LEFT (1) AVChromaLocation

我试了各种color_range和colorspace相关的参数,都不行

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