我在 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相关的参数,都不行