You need to enable JavaScript to run this app.
视频点播

视频点播

复制全文
Flutter 上传 SDK
上传素材
复制全文
上传素材

本文为您介绍如何使用 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 内部在执行此函数的时候,会新建线程,不会阻塞。实现开始上传的代码示例如下所示。

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

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

    await uploader.close()
    

注意

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

设置回调

await uploader.setListener(
  MaterialUploaderInfoCallback(
    // 素材上传成功回调,需要调用close() 方法以避免内存泄漏
    onUploadSuccess: (uploadInfo) async {
      print(
        '--- [MaterialUploaderInfoCallback] onUploadSuccess: ${jsonEncode(uploadInfo)}',
      );
      await uploader.close();
    },
    // 素材上传失败回调,调用 close() 方法以避免内存泄漏
    onUploadFail: (errorCode, errorMsg, uploadInfo) {
      print(
        '--- [MaterialUploaderInfoCallback] onUploadFail: $errorCode, $errorMsg, ${jsonEncode(uploadInfo)}',
      );
      await uploader.close();
    },
    // 素材上传进度回调:[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);
最近更新时间:2025.04.28 17:59:49
这个页面对您有帮助吗?
有用
有用
无用
无用