QML Video组件读取metaData.resolution返回undefined如何解决
问题原因
- QML
Video组件的元数据解析是异步过程:Component.onCompleted触发时仅代表QML组件实例化完成,此时视频源文件还在加载、元数据还未完成解析,所以读取metaData.resolution会返回undefined - 额外说明:你代码中
anchors.left: parent.Left存在属性大小写错误,正确写法为anchors.left: parent.left,该错误不影响元数据读取但会触发属性不存在警告,建议同步修正
修复方案
方案1:监听resolution属性变更信号
元数据解析完成后分辨率属性会自动触发变更信号,此时读取即可,适配性最高:
Video { id: videoList anchors.left: parent.left // 修正属性大小写错误 width: 110 height: 80 autoLoad: true muted: true volume: 0.4 fillMode: Image.PreserveAspectCrop source: "file://" + root.files[modelData] // 分辨率解析完成后自动触发 onResolutionChanged: { if (videoList.metaData.resolution) { print("Size: " + videoList.metaData.resolution) // seek逻辑建议挪到此处执行,避免资源未加载就调用seek报错 videoList.seek(1000) } } }
方案2:监听媒体加载状态
如果需要同时读取多个元数据字段,可以等媒体资源完全加载后统一读取:
Video { id: videoList anchors.left: parent.left width: 110 height: 80 autoLoad: true muted: true volume: 0.4 fillMode: Image.PreserveAspectCrop source: "file://" + root.files[modelData] onStatusChanged: { // 媒体资源加载完成,元数据已全部解析完毕 if (status === MediaPlayer.Loaded) { print("Size: " + videoList.metaData.resolution) videoList.seek(1000) // 可同步读取其他元数据,比如时长、码率等 print("Duration: " + videoList.duration) } } }
补充注意事项
- 必须保持
autoLoad为true,如果设为false需要手动调用load()方法才会触发资源加载和元数据解析 - 部分特殊编码的视频文件元数据块存储在文件尾部,需要加载到对应位置才会解析出分辨率,上述两种监听方案都可以兼容该场景
内容的提问来源于stack exchange,提问作者user17312099
相关产品推荐
相关产品推荐

