# uni.getVideoInfo(options)

获取视频详细信息

# getVideoInfo 兼容性

Web 微信小程序 Android iOS HarmonyOS HarmonyOS(Vapor)
4.0 4.41 4.18 4.25 4.61 5.0

# 参数

名称 类型 必填 默认值 兼容性 描述
options GetVideoInfoOptions -
-
名称 类型 必备 默认值 兼容性 描述
src string.VideoURIString -
视频文件路径,可以是临时文件路径也可以是永久文件路径
success (callback: GetVideoInfoSuccess) => void -
接口调用成功的回调函数
fail (callback: GetVideoInfoFail) => void -
接口调用失败的回调函数
complete (callback: any) => void -
接口调用结束的回调函数(调用成功、失败都会执行)

# GetVideoInfoSuccess 的属性值

名称 类型 必备 默认值 兼容性 描述
orientation string -
画面方向
合法值 兼容性 描述
up
-
-
down
-
-
left
-
-
right
-
-
up-mirrored
-
-
down-mirrored
-
-
left-mirrored
-
-
right-mirrored
-
-
type string -
视频格式
duration number -
视频长度
size number -
视频大小,单位 kB
height number -
视频的长,单位 px
width number -
视频的宽,单位 px
fps number -
视频帧率
bitrate number -
视频码率,单位 kbps
thumbTempFilePath string -
视频缩略图临时文件路径
byteSize number -
视频文件的字节大小

# GetVideoInfoFail 的属性值

名称 类型 必备 默认值 兼容性 描述
errCode number -
-
错误码
合法值 兼容性 描述
1101001
-
用户取消
1101002
-
urls至少包含一张图片地址
1101003
-
文件不存在
1101004
-
图片加载失败
1101005
-
未获取权限
1101006
-
图片或视频保存失败
1101007
-
图片裁剪失败
1101008
-
拍照或录像失败
1101009
-
图片压缩失败
1101010
-
其他错误
errSubject string -
-
统一错误主题(模块)名称
data any -
-
错误信息中包含的数据
cause Error -
-
源错误信息,可以包含多个错误,详见SourceError
errMsg string -
-

# 参见

# 示例

示例为hello uni-app x alpha分支,与最新HBuilderX Alpha版同步。与最新正式版同步的master分支示例另见

扫码体验(手机浏览器跳转到App直达页)

示例

<template>
  <!-- #ifdef APP -->
  <scroll-view style="flex:1">
  <!-- #endif -->
    <page-head :title="title"></page-head>
    <view class="uni-padding-wrap">
      <view class="uni-title">
        <text class="uni-subtitle-text">获取本地绝对路径视频信息</text>
      </view>
      <video class="video" :src="absoluteVideoPath" :controls="true" :poster="absoluteCoverImagePath"></video>
      <text class="margin-top-10">{{absoluteVideoInfo}}</text>
      <view class="uni-btn-v">
        <button type="primary" @click="chooseVideo">拍摄视频或从相册中选择视频</button>
      </view>
    </view>
    <!-- #ifndef MP -->
    <view class="uni-padding-wrap">
      <view class="uni-title">
        <text class="uni-subtitle-text">获取本地相对路径视频信息</text>
      </view>
      <video class="video" :src="relativeVideoPath" :controls="true" :poster="relativeCoverImagePath"></video>
      <text class="margin-top-10">{{relativeVideoInfo}}</text>
    </view>
    <!-- #endif -->
  <!-- #ifdef APP -->
  </scroll-view>
  <!-- #endif -->
</template>

<script setup lang="uts">
  type TestStateType = {
    videoInfoForTest: UTSJSONObject | null
  }

  const title = ref("getVideoInfo")
  const relativeVideoPath = ref("/static/test-video/10second-demo.mp4")
  const relativeVideoInfo = ref("")
  const relativeCoverImagePath = ref("")
  const absoluteVideoPath = ref("")
  const absoluteVideoInfo = ref("")
  const absoluteCoverImagePath = ref("")
  // 自动化测试
  const testState = reactive({
    videoInfoForTest: null as UTSJSONObject | null
  } as TestStateType)
  const needLoadOnReady = ref(true)

  // #ifdef APP-ANDROID
  onLoad((event : OnLoadOptions)=>{
    needLoadOnReady.value = (event["is_debug"] ?? "1") == "1";
  })
  // #endif

  onReady(() => {
    // #ifndef MP
    if(!needLoadOnReady.value) return;
    uni.getVideoInfo({
      src: relativeVideoPath.value,
      success: (res) => {
        console.log("getVideoInfo success", JSON.stringify(res));
        relativeVideoInfo.value = `视频画面方向: ${res.orientation}\n视频格式: ${res.type}\n视频长度: ${res.duration}s\n视频大小: ${res.size}KB\n视频宽度: ${res.width}\n视频高度: ${res.height}\n视频帧率: ${res.fps}fps\n视频码率: ${res.bitrate}kbps`;
        // #ifdef APP-ANDROID || APP-IOS
        relativeVideoInfo.value = relativeVideoInfo.value + `\n视频字节大小: ${res.byteSize}B\n视频首帧图片路径: ${res.thumbTempFilePath}`
        if(res.thumbTempFilePath != null) {
        relativeCoverImagePath.value = res.thumbTempFilePath!;
        }
        // #endif

      },
      fail: (err) => {
        uni.showModal({
          title: "获取视频信息失败",
          content: JSON.stringify(err),
          showCancel: false
        });
      }
    });
    // #endif
  })

  const chooseVideo = () => {
    uni.chooseVideo({
      compressed: false,
      success: (res) => {
        absoluteVideoPath.value = res.tempFilePath;
        uni.getVideoInfo({
          src: res.tempFilePath,
          success: (_res) => {
            console.log("getVideoInfo success", JSON.stringify(_res));
            absoluteVideoInfo.value = `视频画面方向: ${_res.orientation}\n视频格式: ${_res.type}\n视频长度: ${_res.duration}s\n视频大小: ${_res.size}KB\n视频宽度: ${_res.width}\n视频高度: ${_res.height}\n视频帧率: ${_res.fps}fps\n视频码率: ${_res.bitrate}kbps`;
            // #ifdef APP-ANDROID || APP-IOS
            absoluteVideoInfo.value = absoluteVideoInfo.value + `\n视频字节大小: ${_res.byteSize}B\n视频首帧图片路径: ${_res.thumbTempFilePath}`
            if(_res.thumbTempFilePath != null) {
            absoluteCoverImagePath.value = _res.thumbTempFilePath!
            }
            // #endif
          },
          fail: (err) => {
            uni.showModal({
              title: "获取视频信息失败",
              content: JSON.stringify(err),
              showCancel: false
            });
          }
        });
      }
    });
  }

  const testGetVideoInfo = () => {
    uni.getVideoInfo({
      src: '/static/test-video/10second-demo.mp4',
      success: (res) => {
        testState.videoInfoForTest = {
          "orientation": res.orientation,
          "type": res.type,
          "duration": Math.trunc(res.duration),
          "size": res.size,
          "width": res.width,
          "height": res.height,
          "fps": res.fps,
          "bitrate": res.bitrate
        };
      },
      fail: (_) => {
        testState.videoInfoForTest = null;
      }
    });
  }
  defineExpose({
    testState,
    testGetVideoInfo
  })
</script>

<style>
  .video {
    width: 100%;
  }

  .margin-top-10 {
    margin-top: 10px;
  }
</style>

# 通用类型

# GeneralCallbackResult

名称 类型 必备 默认值 兼容性 描述
errMsg string -
错误信息

# Tips

  • 从HBuilderX4.61版起,GetVideoInfoSuccess中的duration、size精度统一调整为小数点后3位数