本文为您介绍如何使用 Flutter 上传 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,待用户同意隐私权限后,调用 |
debugLogLevel | bool? | false | 设置 Debug 级别。在调试阶段,建议启用此设置;在线上环境中,请将其设置为 |
enableLocalLogPrint | bool? | false | 是否打印 Native 日志。在调试阶段,建议启用此设置;在线上环境中,请将其设置为 |
enableLogCallback | bool? | false | 是否启用日志回调,与 |
当 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 | 否 | 文件前缀,路径字符串,支持多级路径,如 |
FileTitle | 否 | 文件名称。如您没有设置,SDK 会自动生成 32 位字符串作为文件名称。 |
FileExtension | 是 | 文件后缀。最终完整路径中必须包含 |
注意
具体的字符规则,请见文件命名通用字符规则。
您可参考以下示例代码设置云端存储路径。
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? | 媒资信息,包含码率、格式、长度、宽高等。示例如下:
说明 媒资信息详情请参见确认上传中的 |
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);