You need to enable JavaScript to run this app.
导航
上传素材
最近更新时间:2025.04.23 11:15:22首次发布时间:2025.04.23 11:15:22
我的收藏
有用
有用
无用
无用

本文为您介绍如何使用 Flutter 上传 SDK 以简单便捷的方式将素材上传至视频点播服务。上传 SDK 支持上传字幕、封面图、预告片、音频等素材。

前提条件

基础功能

初始化 SDK

参考以下代码初始化 SDK。您可根据实际情况自主选择是否接入 SDK 的日志上报功能。强烈建议您启用该功能模块,若您无需使用日志上报或不希望隐私数据被采集,请在初始化前时将 openAppLog 指定为 false

说明

初始化前 SDK 不会采集用户个人信息。

EnvOptions options = EnvOptions(
  appID: '123456',
  appChannel: 'appChannel',
  appVersion: '1.0.0',
  appName: "FlutterUploadDemo",
  openAppLog: true,
  autoStartAppLog: true,
  debugLogLevel: true,
  enableLocalLogPrint: true,
  enableLogCallback: true,
);

await initEnv(options);

详细的参数说明如下表所示。

参数

类型

默认值

说明

appID

String

App ID,必填。从火山引擎控制台应用管理获取。

appChannel

String?

null

APP 渠道号,必填。该值需要您根据实际业务情况自定义,例如:小米应用商店 (xiaomi)、华为应用市场 (huawei) 等。

appVersion

String?

null

App 版本号,必填。该值需要您根据实际业务情况自定义,使用 BuildConfig.VERSION_NAME,合法版本号应包含大于等于 2 个分隔符,例如 "1.3.2" 。

appName

String?

null

App 英文名,必填。从火山引擎控制台应用管理获取。

openAppLog

bool?

true

是否初始化 AppLog。

autoStartAppLog

bool?

true

启用 AppLog(此设置仅适用于 Android 端)。建议在用户同意隐私权限之前将其设置为 false,待用户同意隐私权限后,调用 await Env.startAppLog(); 以开启 AppLog 上报功能

debugLogLevel

bool?

false

设置 Debug 级别。在调试阶段,建议启用此设置;在线上环境中,请将其设置为 false

enableLocalLogPrint

bool?

false

是否打印 Native 日志。在调试阶段,建议启用此设置;在线上环境中,请将其设置为 false

enableLogCallback

bool?

false

是否启用日志回调,与 setLogCallback(void Function(String?, int?) callback) 接口配合使用。

日志回调

enableLogCallback 处于启用状态时,可调用 setLogCallback 实现日志回调。

import 'package:volc_bd_file_upload/core/upload.dart';

// msg: 日志内容。 level: 0 - 6 ,值越大日志级别越高
await setLogCallback((msg, level) {
  print('log callback------------>: $msg, $level');
});

创建实例

实现创建实例的示例代码如下:

import 'package:volc_bd_file_upload/bd_file_upload.dart';

MaterialUploaderOptions options = MaterialUploaderOptions(
  accessKey: "your accessKey",
  secretKey: "your secretKey",
  sessionToken: "your sessionToken",
  serviceID: "your serviceID",
  filePaths: filePath,// 只支持单个文件,因此List长度必须为1。
  };
  
BDMaterialUploader uploader = await initMaterialUploader(options);

设置待上传文件

仅支持上传单个文件,因此列表长度必须为 1。

MaterialUploaderOptions options = MaterialUploaderOptions(
...
filePaths: ["filePath1"],
}

设置鉴权参数

您需要在应用服务端通过视频点播服务端 SDK 签发临时上传 Token,下发给客户端,再设置给 SDK。鉴权参数说明详见客户端上传。示例代码如下:

MaterialUploaderOptions options = MaterialUploaderOptions(
  accessKey: "your accessKey",
  secretKey: "your secretKey",
  sessionToken: "your token",
  ...
}

设置空间

实现设置空间的代码示例如下所示。空间相关说明请参考空间管理

MaterialUploaderOptions options = MaterialUploaderOptions(
   ...
   serviceID: "your service ID",
}

设置云端存储路径

文件上传完成后的云端存储路径形式如下:

StoreUri = {{BucketName}}/{{FilePrefix}}{{FileTitle}}{{FileExtension}}

以下为一个完整的云端存储路径示例。

ASmapleBucketName/path/to/foo/bar/test.mp4

参数说明如下表所示。

参数

是否必选

说明

BucketName

N/A

存储桶名称,您无需设置。

FilePrefix

文件前缀,路径字符串,支持多级路径,如 path/to/foo/bar/ 。文件前缀必须以 / 结尾,否则会上传失败。

FileTitle

文件名称。如您没有设置,SDK 会自动生成 32 位字符串作为文件名称。

FileExtension

文件后缀。最终完整路径中必须包含 FileExtension ,否则会上传失败。文件后缀需以 . 开头,如 .mp4.mp3

注意

具体的字符规则,请见文件命名通用字符规则

您可参考以下示例代码设置云端存储路径。

MaterialUploaderOptions options = MaterialUploaderOptions(
    ...
    // 例 1,云端的存储路径:tos-pathxxx/volc/test.mp4
    fileName: "volc/test.mp4",
    //  例 2,云端的存储路径:tos-pathxxx/test.mp4
    // fileName: "test.mp4",
);

设置素材信息

设置素材信息接口的代码示例如下所示。

MaterialUploaderOptions options = MaterialUploaderOptions(
    ...
    title: "title",
    tags: "tags",
    description: "description",
    format: formatStr,
);

BDMaterialUploader uploader = await initMaterialUploader(options);

await uploader.setFileType(fileType);

await uploader.setCategory(category);

详细的参数说明如下表所示。

参数

类型

描述

FileType

String

文件类型,必填。可选值为 media、image、object。

Title

String

标题。

Tags

String

多个标签可用逗号隔开。

Description

String

描述信息。

Category

String

素材分类。当上传类型为素材时,可以指定素材的分类信息,必填。可选值为 video、audio、image、dynamic_img、subtitle、font。分别对应:视频、音频、图片、动图、字幕、字体。

Format

String

格式。若传入 Format 的话,以您传入参数为准,否则以系统识别出的 Format 为准。若遇到特殊文件无法识别,Format 可能为空。

FileType 取值和 Category 对应关系如下表所示。

FileType 取值

对应 Category 取值

media

video、audio

image

image、dynamic_img

object

subtitle、font

上传控制

上传控制支持的操作有开始上传、暂停上传和终止上传。

  • 开始上传:SDK 内部在执行此函数的时候,会新建线程,不会阻塞。实现开始上传的代码示例如下所示。

    uploader.start();
    
  • 暂停上传:实现暂停上传的代码示例如下所示。

    uploader.stop();
    
  • 终止上传:终止上传,并释放底层上传对象,释放后不能够继续进行上传。实现终止上传的代码示例如下所示。

    uploader.close()
    

注意

上传完成后,请调用 close() ,否则会内存泄漏。

设置回调

await uploader.setListener(
  MaterialUploaderInfoCallback(
    // 素材上传成功回调
    onUploadSuccess: (uploadInfo) async {
      print(
        '--- [MaterialUploaderInfoCallback] onUploadSuccess: ${jsonEncode(uploadInfo)}',
      );
      await uploader.close();
    },
    // 素材上传失败回调
    onUploadFail: (errorCode, errorMsg, uploadInfo) {
      print(
        '--- [MaterialUploaderInfoCallback] onUploadFail: $errorCode, $errorMsg, ${jsonEncode(uploadInfo)}',
      );
    },
    // 素材上传进度回调:[0,100]
    onUpdateProgress: (progress) {
      print(
        '--- [MaterialUploaderInfoCallback] onUpdateProgress: $progress',
      );
    },
  ),
);

回调中 errorCode 为错误码,errorMsg 为错误日志,详情请见上传 SDK 错误码
回调中 uploadInfo 类型为 BDMaterialUploadInfo,具体说明如下表所示:

参数

类型

说明

vid

String?

视频 ID,即视频点播服务为音视频类型资源生成的 Vid。

mid

String?

素材 ID,即视频点播服务为素材类型资源生成的 Mid。

mCoverUri

String?

封面 URI。

oid

String?

TOS 存储 key。

videoMetaInfo

String?

媒资信息,包含码率、格式、长度、宽高等。示例如下:

{"Bitrate":463419,"Duration":39.726999999999997,"FileType":"video","Format":"MP4","Height":360,"Md5":"53f62abe3c29d0654b3405af77060","Size":2301285,"StoreUri":"tos-vod-cn-v-309be6ba73b04/cd404e7bef654554b638422***7c0c40","Width":640}

说明

媒资信息详情请参见确认上传中的 SourceInfo 参数。

callbackArgs

String?

透传服务端回调信息。

进阶功能

断点续传

调用 setDiskResumeOption 开启断点续传功能。开启断点续传后,用户在您的应用中上传文件时,如果发生强制退出应用等情况导致上传中断,下次上传同一个文件时,上传 SDK 会自动获取断点,并从断点处继续上传,从而节省上传时间。若为 Android 端,您还需额外设置断点续传文件的存放目录(有两种设置存放目录的方式,二选一即可)。示例代码如下:

// Android 端需要额外设置resumeConfigDir的值传入断点续传文件存放目录,注意不能以 "/" 结尾
MaterialUploaderOptions options = MaterialUploaderOptions(
   ...
   resumeConfigDir: diskResumeFilePath,
};
// 除了上述方式设置断点续传文件存放目录,你还可以使用下面这行代码进行设置(2选1即可)
await uploader.setSDKConfigDirForAndroid(diskResumeFilePath);


// 开启断点续传,1 开启,0关闭,默认关闭
await uploader.setDiskResumeOption(1);

自定义上传配置

MaterialUploaderOptions options = MaterialUploaderOptions(
   ...
   // 接入方自定义参数,如 "testkey=testValue" 
   serverParameter: "testkey=testValue",
   // 分片上传设置分片大小,单位为 byte,默认值为 512 * 1024
   sliceSize: 512 * 512,
   // 开启并行上传的线程数,默认值为 1
   socketNum: 1,
   // 单个分片传输超时,单位为 s,默认值为 40
   rwTimeout: 40,
   // 总建连超时,单位为 s,默认值为 70
   maxFailTime: 70,
   //  系统 socket 单次读写超时,单位为 s,默认值为 10
   tranTimeout: 10,
   // 分片重试次数,默认值为 2
   sliceRetryCount: 2,
   // 文件级别的重试次数,默认值为 3
   fileRetryCount:3,
};

BDMaterialUploader uploader = await initMaterialUploader(options);

// 单次 TCP 建连超时,单位为 ms,默认值为 5000
await uploader.setTcpOpenTimeOutMs(5000);

// 复用连接的超时时间,防止老连接质量变差,导致的上传速度变慢,单位为 s,默认值为 6
await uploader.setAliveMaxFailTime(6);