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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:36:01