You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

垂直方向H.264视频流解码显示异常问题求助

解决垂直(走廊模式)IP摄像机RTSP流MFT解码+DX9显示损坏问题

我遇到过不少类似的垂直监控摄像机流解码渲染问题,结合你的场景——SDP解析出的SPS确认帧尺寸是1080×1920,但用Microsoft H.264 MFT解码器+DX9显示损坏,普通水平流正常——这里有几个针对性的排查和解决步骤:

1. 检查SPS旋转标记并配置MFT旋转属性

很多垂直摄像机不会直接修改帧的存储尺寸,而是通过H.264 SPS的VUI扩展中的display_orientation_flag标记旋转角度(通常是顺时针90度)。默认情况下,Microsoft H.264 MFT可能会忽略这个旋转信息,导致解码输出的帧方向与预期不符,进而引发渲染损坏。

解决方法:手动为MFT设置旋转属性,强制输出正确方向的帧:

// 假设已初始化并获取了H.264 MFT解码器实例pMFT
PROPVARIANT varRotation;
PropVariantInit(&varRotation);
// 对应走廊模式的垂直方向,设置顺时针90度旋转
varRotation.lVal = MFVideoRotationFormat_90;
hr = pMFT->SetAttribute(MF_MT_VIDEO_ROTATION, varRotation);
PropVariantClear(&varRotation);

注意:部分旧版本的MFT可能不支持此属性,可通过MFTGetAttributeInfo提前检查是否支持。

2. 强制MFT使用正确的输出媒体类型

有时候MFT会自动选择适配水平显示的输出类型(比如强制将1080×1920转为1920×1080),导致后续渲染尺寸不匹配。可以手动指定输出媒体类型,锁定垂直帧尺寸:

IMFMediaType* pOutputType = nullptr;
MFCreateMediaType(&pOutputType);
// 设置视频主类型和子类型(NV12是MFT常用的YUV格式)
pOutputType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
pOutputType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_NV12);
// 明确设置垂直帧尺寸:宽1080,高1920
pOutputType->SetUINT32(MF_MT_FRAME_WIDTH, 1080);
pOutputType->SetUINT32(MF_MT_FRAME_HEIGHT, 1920);
// 应用输出类型到MFT
hr = pMFT->SetOutputType(0, pOutputType, 0);
pOutputType->Release();

3. 调整DX9渲染的顶点/纹理适配

如果MFT已经输出了正确的1080×1920垂直帧,问题可能出在DX9渲染环节:

  • 纹理创建:确保创建的D3D纹理尺寸与输出帧一致(1080宽×1920高),不要强行拉伸为水平尺寸;
  • 顶点缓冲区:修改渲染顶点的UV坐标或世界矩阵,适配垂直帧的显示。例如,使用D3DXMatrixRotationZ旋转世界矩阵90度,或者调整纹理坐标的映射顺序;
  • 渲染状态:关闭不必要的拉伸滤镜,避免垂直帧被错误缩放。

4. 排查RTP流打包异常

少数垂直摄像机的RTP打包逻辑会与水平帧不同(比如切片排列顺序、行存储方向),导致MFT解码时出现帧损坏。可以用Wireshark抓取水平流和垂直流的RTP包,对比切片的NALU结构和打包顺序,若发现异常,需在接收RTP流后重新整理NALU切片再送入MFT。


内容的提问来源于stack exchange,提问作者Gary G.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:55:51