Flutter视频录制与上传插件ziggeo的使用
Flutter视频录制与上传插件ziggeo的使用
Index
为什么选择Ziggeo的Flutter SDK?
Ziggeo是一款获奖且强大的白标媒体SaaS。它允许你快速开始创建支持视频、音频和图像的应用,方式简单且可靠。
Ziggeo的Flutter SDK利用API为你提供一个可以添加到项目的原生库。只需添加到项目中,并让你的应用进化成更多东西,一些包含视频的东西!
此库还提供了直接访问Ziggeo API的功能,如果你想要自己做更多的事情,也可以这样做。
它适合谁?
- 是否需要一个可以无缝集成到现有应用中的视频库?
- 是否想要一些简单易用的东西?
- 是否需要同时支持iOS和Android?
- 是否需要一些高端视频应用提供的强大功能?
- 是否希望为你的客户提供良好的视频体验?
如果上述任何一项是“是”,那么你来对地方了,因为这个SDK就是为你准备的!
前置条件
下载
你将需要下载SDK的ZIP文件或将其作为git仓库拉取到自己的项目中。
依赖项
在编译时,请确保使用最新的构建工具和SDK版本。
安装
标准步骤是在项目中添加并开始使用Ziggeo的Flutter SDK。
演示
此仓库有一个示例目录,你可以通过它了解如何使用。
代码
本节将向你介绍将我们的视频库集成到应用中最常见的方法。
初始化
final String appToken = "YOUR_APP_TOKEN_HERE";
Ziggeo ziggeo = new Ziggeo(appToken);
- 你可以在登录Ziggeo账号后获取appToken,在应用的概述页面中查看。
录制器
Ziggeo支持不同的媒体格式,并提供多种录制器选项供你选择。
- 视频摄像机录制器
- 屏幕录制器
- 音频录制器
每个录制器将在其各自的章节中展示。
视频(摄像机)录制器
你可以将其设置为全屏模式或嵌入模式。全屏录制器适用于当你希望录制器占据整个屏幕时。
嵌入录制器适用于当你希望录制器成为应用的一部分时。例如,如果你的应用中有一个头像,并希望它成为一个快速视频。
ziggeo.startCameraRecorder();
- 查看配置部分以了解如何配置录制器,而不是使用默认设置。
屏幕录制器
通过以下操作,你将创建一个用于屏幕录制的前台服务。
ziggeo.startScreenRecorder();
音频录制器
音频录制器可以通过两种方式添加:全屏录制器和嵌入式音频录制器。
全屏音频录制器适用于当你希望录制器占据整个屏幕时。
嵌入式音频录制器适用于当你希望录制器成为应用的一部分时。例如,如果你想让播放器在给予其他元素更高关注的同时存在。
创建全屏音频录制器
ziggeo.startAudioRecorder();
创建嵌入式音频录制器
- 目前不支持嵌入式音频录制器。
播放器
捕获不同类型媒体时,期望支持相同的回放。因此,Ziggeo提供了一个播放器,用于播放你在应用中捕获和使用的不同类型的媒体。
Ziggeo提供以下播放器:
- 视频播放器
- 音频播放器
每个播放器将在其各自的章节中展示。
视频播放器
播放器可以用来播放本地视频、来自其他服务的视频以及当然来自Ziggeo服务器的视频。
就像录制器一样,播放器也可以实现为全屏或嵌入式视频播放器。
创建全屏视频播放器
标准播放
ziggeo.startPlayerFromToken(List<String> videoTokens);
从第三方源播放
ziggeo.startPlayerFromPath(List<String> videoPaths);
创建嵌入式视频播放器
- 目前不支持嵌入式视频播放器。
音频播放器
播放器可以用来播放本地音频、来自其他服务的音频以及当然来自Ziggeo服务器的音频。
就像视频播放器一样,音频播放器也可以实现为全屏或嵌入式音频播放器。
创建全屏音频播放器
标准播放
ziggeo.startAudioPlayer(List<String> audioTokens);
从第三方源播放
ziggeo.startAudioPlayer(List<String> path);
创建嵌入式音频播放器
- 目前不支持嵌入式音频播放器。
二维码扫描器
二维码扫描器使你的代码可以从捕获的二维码中检索数据变得简单。
ziggeo.startQrScanner();
配置
每个嵌入(播放器和录制器)都有默认配置,通常你还可以根据需要进行一些更改。
本节将向你展示各种可用选项。
主题
- 主题目前不支持
录制器配置
我们的录制器使用辅助类定义录制器元素的不同属性。所以我们总是首先定义它。录制器配置对于音频和视频录制器都是通用的。
var recorderConfig = new RecorderConfig();
设置最大持续时间
录制的持续时间始终设置为无限长,这意味着你的视频或音频录制没有长度限制。该值为0。
如果你将其设置为30000,这相当于30秒的录制时间,超过该时间后录制将自动停止。
- 当设置时,此时间还将用于右上角的经过时间指示器。
- 注意:持续时间以毫秒为单位。
recorderConfig.maxDuration = 0;
设置倒计时时间
当相机捕获开始时,人们可能还没有准备好,或者可能需要调整设备才能准备好录制。默认情况下,我们的录制器提供3秒的倒计时。
- 注意:如果你将其设置为0,那么录制者可能需要旋转手机、切换摄像头或调整位置,我们建议将其保持在2-5秒之间。
- 注意:延迟以秒为单位。
recorderConfig.startDelay = 3;
自动开始录制
默认情况下,录制器会显示一个开始录制过程的选项。这对于大多数用例来说通常是首选方式。在某些情况下,你可能更喜欢录制器在加载到应用中时就开始。在这种情况下,你可以将其设置为true。
- 注意:你可能还想看看
startDelay()
。
recorderConfig.shouldAutoStartRecording = false;
设置首选摄像头
此选项允许你选择用于录制的摄像头。默认情况下使用后置摄像头,但你可以通过此选项更改它。
- 注意:你可以选择
facingFront
或facingBack
recorderConfig.facing = RecorderConfig.facingBack;
设置录制质量
设置你想要用于视频录制的质量。通常质量越高越好,但在某些特定情况下,质量不是那么重要时,你可以使用此选项更改它。
默认质量为qualityHigh
。
- 注意:你可以选择
qualityHigh
、qualityMedium
和qualityLow
。
recorderConfig.videoQuality = RecorderConfig.qualityHigh;
禁止在录制过程中切换摄像头
默认情况下,我们允许在录制器中切换摄像头。有时这可能不合适,如果这样的话,你可以通过将此设置为true来禁止这种能力。
recorderConfig.shouldDisableCameraSwitch = false;
立即提交视频
默认情况下,所有视频都会立即发送到我们的服务器。这允许它们被处理并通过你设置的所有工作流程。 在某些情况下,你可能希望显示一个按钮来确认视频在发送之前,或其他你喜欢的任何操作,在这种情况下,你可以延迟此操作。
- 注意:你可能也对
shouldConfirmStopRecording
感兴趣。
recorderConfig.shouldSendImmediately = true;
显示停止对话框
在某些情况下,你可能希望在录制停止后能够确认。你可以使用shouldConfirmStopRecording
部分的recorderConfig
做到这一点。
recorderConfig.shouldConfirmStopRecording = true;
- 确认对话框是自动生成的。目前不可能创建自定义对话框。
设置额外参数
这可以用来指定效果配置文件、视频配置文件、自定义数据、标签等。
recorderConfig.extraArgs = map;
额外参数示例
处理自定义数据
自定义数据通过额外参数设置,表示为JSON对象的字符串。这个自定义数据可以是你想要附加到正在录制或上传的媒体上的任何内容。
var args = new Map<String, dynamic>();
args["data"] = "{\"key\":\"value\"}";
recorderConfig.extraArgs = args;
应用效果配置文件
如果你想在录制或上传的每个视频上添加你的logo或应用某些效果,你将想要使用效果配置文件。它们可以通过指定效果配置文件令牌或键来使用。
- 注意:如果你使用的是效果配置文件键,请在名称前面添加下划线(即使名称中已经有下划线),因为第一个下划线会被移除以匹配你指定的键。
var args = new Map<String, dynamic>();
args["effect_profile"] = "1234567890";
recorderConfig.extraArgs = args;
设置视频配置文件
视频配置文件允许你以各种感兴趣的分辨率创建视频。例如,如果你想上传一个1080p的视频,并希望它的SD格式版本也可用,这是实现的方法。
你可以通过添加视频配置文件令牌或视频配置文件键来添加视频配置文件。
- 注意:如果你使用的是视频配置文件键,请在名称前面添加下划线(即使名称中已经有下划线),因为第一个下划线会被移除以匹配你指定的键。
var args = new Map<String, dynamic>();
args["video_profile"] = "1234567890";
recorderConfig.extraArgs = args;
- 所有录制器都使用上述描述的相同录制器配置类。
事件/回调
回调允许你知道何时发生某些事情。它们会在某些事件发生时触发,例如错误发生时。这样你可以设计你的应用以精细细节,并为你的客户提供极佳的体验。
我们已将可用的事件分为几个不同的类别。
在做这些之前,你需要注册一个回调,这在recorderConfig
中完成。如果你不确定它是如何创建的,请检查上面专门为此设置的部分。
注册回调
recorderConfig.eventsListener = new RecorderEventsListener(...)
全局回调
全局回调发生在播放器和录制器上。它通常不依赖于你使用的嵌入方法,但是每个回调都有附加的详细信息。
错误
哦,出问题了!现在轮到你采取行动了。
当某个错误发生时,将调用以下回调。它还会为你提供可抛出的参数。
onError: (exception) => {}
加载
当嵌入(播放器,录制器)首次加载时。
onLoaded: () => {}
录制器回调
本节中的回调仅针对录制器。这意味着它们不会为播放器嵌入而触发。
回调按其应在代码中出现的顺序列出。
- 注意:某些回调可能不会被调用。例如,如果视频已上传但未录制,则录制特定回调永远不会触发。
权限已授予
当有人同意我们的系统使用摄像头、麦克风和文件存储时,此事件将被触发。
onAccessGranted: () => {}
权限未授予
某些权限未授予,因此我们无法做太多事情。
- 注意:
permissions
参数将分享未授予的权限列表。
onAccessForbidden: (permissions) => {}
摄像头可用
有时你可能想知道是否有可用的摄像头。当至少有一个摄像头可用时,此回调将被触发。
onHasCamera: () => {}
摄像头不可用
大多数时候,移动设备都会有摄像头,但有些情况摄像头可能被断开连接或不可用。在这种情况下,此事件将被触发。
onNoCamera: () => {}
麦克风可用
大多数设备都会有麦克风。然而,麦克风可能不可用,甚至完全断开连接。一旦找到任何麦克风,此事件将被触发。
onHasMicrophone: () => {}
麦克风不可用
在大多数情况下,上述事件将被触发。在某些特定情况下,麦克风可能不可用,在这种情况下,此事件将被触发。
onNoMicrophone: () => {}
准备好录制
在大多数情况下,一旦权限被授予,录制就可以开始了,因此此回调将被触发。这意味着摄像头已经准备好并且所有权限都已经授予。唯一剩下的就是开始录制。
onReadyToRecord: () => {}
计数倒计时
如果你想知道倒计时何时显示,这个事件将非常有用。它将在倒计时期间被触发,并在recordingStarted
事件之前被触发。
- 注意:
timeLeft
将为你提供屏幕上显示的秒数。
onCountdown: (time) => {}
录制已开始
一旦开始录制,此事件将被触发。这在你想知道视频是否正在录制而不是上传时很有用,因为上传事件将为所有事件触发。
它也可以在你使用嵌入式录制器时使用,以便停止所有其他活动并将更多注意力集中在捕捉上。
onRecordingStarted: () => {}
录制中
此事件在录制过程中被触发。这是一个连续更新的通知,将在整个录制过程中不断触发。
- 注意:
progress
参数将告诉你自录制开始以来过去了多少时间。
onRecordingProgress: (progress) => {}
录制已取消
想检测是否有人取消了录制吗?使用此事件来知道有人取消了录制并关闭了屏幕。
onCanceledByUser: () => {}
录制完成
当录制刚刚结束时,此事件将被触发。这将在用户点击停止按钮时发生,或者当达到持续时间或大小限制时。
onRecordingStopped: (path) => {}
手动提交
需要确保有人确认视频提交吗?使用此回调并在你的侧面上记录其操作。
- 注意:我们的代码只触发此事件。然后由你来使用此事件来捕获并保存某人确认视频的使用方式。这样做是为了给你最大的灵活性,你可以做什么和怎么做。
- 注意:只有当你将
shouldSendImmediately
设置为false时才会触发此事件。你可以在上面的Recorder Config
部分了解更多关于它的信息。
onManuallySubmitted: () => {}
上传开始
想知道上传何时开始吗?在这种情况下,你应该监听此事件。每次开始上传时,它都将被触发。
onUploadingStarted: (path) => {}
上传进度
你想知道上传的进度吗?此事件将随着上传的数据变化而被连续触发,允许你跟踪每个上传的进度。
onUploadProgress: (token, path, current, total) => {}
上传完成
想知道上传何时完成吗?那么你应该监听此事件。我们的SDK将在所有上传完成后触发它。
onUploaded: (token, path) => {}
媒体验证
你想知道刚刚上传的媒体是否可以被处理吗?在大多数情况下,这是真的,但在少数情况下,可能无法处理。
这利用了我们的快速检查算法,在将媒体发送到处理之前对其进行检查,以确保它可以实际被处理。这允许你在媒体有问题时做出反应,避免进入处理阶段。它还为你提供了一种跳过处理阶段的方式,因为一旦客户端代码验证通过,就可以做任何事情,即使与媒体无关。
onVerified: (token) => {}
处理中
虽然我们不提供媒体处理了多少的见解,但我们可以告诉你它进行了多长时间。此事件将在媒体处理的整个过程中被触发。
onProcessing: (token) => {}
处理完成
有兴趣知道媒体何时成功处理吗?监听此事件将允许你知道。一旦触发,媒体即可播放。
onProcessed: (token) => {}
播放器回调
媒体播放可用
想知道播放器何时可以播放视频吗?此事件将在媒体准备好播放时通知你。通过监听它,你可以避免监听进度事件,因为它将在媒体准备好播放时触发,无论它是否需要先进行处理,还是只是等待下载媒体。
onReadyToPlay: () => {}
播放开始
想要在播放开始时做出反应吗?此事件将在每次播放开始时被触发。
onPlaying: () => {}
播放暂停
想要在有人暂停视频时做出反应吗?当点击暂停按钮时,此事件将被触发。
- 注意:它也会在视频结束时触发。
onPaused: () => {}
播放结束
想要知道媒体播放何时结束吗?此事件将在播放达到媒体长度时被触发。
onEnded: () => {}
播放寻求
想要知道有人是否改变了播放点(寻求媒体)吗?此事件将在观看媒体的人将播放器的进度指示器移动到新位置时被触发。这将为向前和向后播放时触发。
- 注意:返回的值将是寻求操作设置的时间,从开始算起的毫秒数。
onSeek: (seekPos) => {}
传感器回调
- 传感器回调目前不可用
API
我们的API分为独特的部分。主要部分是视频。这处理整个视频和视频。
现在,由于每个视频可以有不同的流(子视频),我们也有关于每个流的API。
例如,删除一个视频将删除其所有的流。另一方面,当删除单个流时,其余的流和视频本身仍然可用。当然,除了那个流之外。
Ziggeo还有其他节点的API,不过客户端与服务器端SDK的API功能有所不同。客户端SDK调用安全地从应用程序调用,而服务器端SDK及其调用应仅在服务器端使用,然后传递给您的应用程序。
如果您有任何关于具体问题的疑问,请联系我们的支持团队。
请求取消
- 取消请求目前不可用
视频API
查找视频
一种基于查询查找视频并展示它们的方法。默认情况下,它返回50个,但它最多可以一次返回100个视频。分页控制也存在。
- 注意:对于每次调用,视频将按最新日期(默认)返回。
/**
* @param args - limit: 限制返回的视频数量。最多可以设置为100。
* - skip: 跳过前[n]个条目。
* - reverse: 反转视频返回的顺序。
* - states: 按状态过滤视频
* - tags: 过滤搜索结果以特定标签
*/
ziggeo.videos.index(Map<String, String> args);
获取视频信息
一种利用视频令牌或键获取特定视频信息的方法。
- 注意:键必须以下划线开头,无论它们是否已经在名称中。
/**
* @param videoTokenOrKey - 视频令牌或键。
*/
ziggeo.videos.get(String videoTokenOrKey);
获取视频URL
想要获取来自Ziggeo服务器的视频的直接URL吗?使用此方法检索相同的。
- 注意:键必须以下划线开头,无论它们是否已经在名称中。
/**
* @param videoTokenOrKey - 视频令牌或键。
*/
ziggeo.videos.getVideoUrl(String videoTokenOrKey);
获取海报图URL
如果你想要获取用于视频的图像/快照/海报的URL,可以通过以下方法获取。
- 注意:键必须以下划线开头,无论它们是否已经在名称中。
/**
* @param videoTokenOrKey - 视频令牌或键。
*/
ziggeo.videos.getImageUrl(String videoTokenOrKey);
下载视频
- 目前不可用
下载图像/快照
- 目前不可用
创建视频
如果你有不能立即删除的视频上传代码,但希望使用Ziggeo,你可以调用视频创建API。这样你的现有代码将用于在你的Ziggeo应用中创建一个新的视频。
- 注意:当设置键时,你不需要包含下划线前缀。即使你这样做,你也需要在其他调用中包含一个。
/**
* @param args - file: 要上传的视频文件
* - min_duration: 视频的最小持续时间
* - max_duration: 视频的最大持续时间
* - tags: 视频标签
* - key: 视频的唯一(可选)名称
* - volatile: 如果视频为空则自动删除
*/
ziggeo.videos.create(Map<String, String> args);
更新视频
/**
* @param videoTokenOrKey - 视频令牌或键。
* @param argsMap - min_duration: 视频的最小持续时间
* - max_duration: 视频的最大持续时间
* - tags: 视频标签
* - key: 视频的唯一(可选)名称
* - volatile: 如果视频为空则自动删除
* - expiration_days: 这个视频将在多少天后被删除
* @param callback - 接收操作结果的回调
*/
ziggeo.videos.update(String videoTokenOrKey, Map<String, String> args);
删除视频
使用视频令牌或键永久删除视频。
- 注意:键必须以下划线开头,无论它们是否已经在名称中。
/**
* @param videoTokenOrKey - 视频令牌或键。
*/
ziggeo.videos.destroy(String videoTokenOrKey);
视频流API
流是每个较高分类的子部分。在这种情况中,这些是视频的流。由于每个视频可以有不同数量的流,我们可能想对他们做些什么。
不同流的例子可能是:
- 你的原始流(我们得到的未经修改的数据)
- 默认流(处理原始流后的流)
- 不同的分辨率
- 应用了效果的流(例如带有logo)
- 上述变体
创建新的视频流
可以在新数据下创建空占位符。它接受应在哪个视频令牌或键下创建新流。
- 注意:键必须以下划线开头,无论它们是否已经在名称中。
/**
* @param videoTokenOrKey - 视频令牌或键。
*/
ziggeo.streams.create(String videoTokenOrKey, File file, Map<String, String> args);
附加图像
- 目前不可用
附加视频
- 目前不可用
下载视频流
- 目前不可用
下载图像
- 目前不可用
获取视频流信息
- 目前不可用
删除流
使用视频令牌或键和流令牌,你可以删除任何你想要的特定流。
- 注意:键必须以下划线开头,无论它们是否已经在名称中。
- 注意:你将需要一个认证令牌(默认)进行此请求。永远不要在应用中硬编码认证令牌,它应该始终从你的服务器检索为唯一值。详情请参阅我们的支持团队。
/**
* @param videoTokenOrKey - 视频令牌
* @param streamTokenOrKey - 要删除的流
*/
ziggeo.streams.destroy(String videoTokenOrKey, String streamTokenOrKey);
认证
我们的API使用专利待批的认证令牌系统。它允许你保护并微调某人可以做什么以及持续时间。
如果你在应用中启用了认证令牌,以下内容将需要。
- 注意:这向你展示了如何添加和利用认证令牌。在客户端,认证令牌不应创建或永久存储。理想情况下,你将在服务器端创建认证令牌,然后如果你决定,将该令牌传递给特定客户端,允许他们在一定时间内执行某些操作。硬编码永久认证令牌会使任何人找到并使用它,而不管你的预期工作流程,只需通过检查你的应用代码即可。
客户端和服务器端认证令牌在可以做什么方面具有同等地位。区别在于它们是如何创建的。
客户端认证
此部分帮助你设置要在发送到我们服务器的请求中使用的客户端认证令牌。客户端认证是在不首先到达我们服务器的情况下在你的服务器上创建的。这对于高速通信是最理想的。
ziggeo.setClientAuthToken(String authData)
服务器认证
以下将帮助你使用服务器端认证令牌。服务器端认证令牌也是在你的服务器上创建的,但是它们是通过将授予对象传递给我们的服务器创建的。我们的服务器然后会发送给你一个短令牌,你可以根据你指定的授予物在任何调用中使用它。
ziggeo.setServerAuthToken(String token);
编译和发布应用
所有标准的编译和发布步骤都适用。
有关Android的更多信息,请参见Flutter文档关于Android。 有关iOS的更多信息,请参见Flutter文档关于iOS。
更新信息
变更日志
如果你对我们变更日志感兴趣,可以在此README旁边的单独文件中找到它。它的名称为CHANGELOG.md。
示例代码
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:provider/provider.dart';
import 'package:provider/single_child_widget.dart';
import 'package:ziggeo_example/res/colors.dart';
import 'package:ziggeo_example/screens/drawer.dart';
import 'package:ziggeo_example/screens/splash.dart';
// import 'package:firebase_crashlytics/firebase_crashlytics.dart';
// import 'package:firebase_core/firebase_core.dart';
import 'localization.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// uncomment for release
// if(Platform.isAndroid){
// await Firebase.initializeApp();
// if (kDebugMode) {
// FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(false);
// }
// }
runApp(ZiggeoDemoApp());
}
class ZiggeoDemoApp extends StatefulWidget {
[@override](/user/override)
_ZiggeoDemoAppState createState() => _ZiggeoDemoAppState();
}
class _ZiggeoDemoAppState extends State<ZiggeoDemoApp> {
[@override](/user/override)
Widget build(BuildContext context) {
return MultiProvider(
child: MaterialApp(
home: SplashScreen(),
localizationsDelegates: [
const AppLocalizationsDelegate(),
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: [
const Locale('en'),
],
theme: ThemeData.light().copyWith(
textTheme: Theme.of(context).textTheme.apply(fontFamily: 'Quicksand'),
primaryTextTheme: Theme.of(context)
.textTheme
.apply(fontFamily: 'Quicksand', bodyColor: Colors.white),
accentTextTheme: Theme.of(context)
.textTheme
.apply(fontFamily: 'Quicksand', bodyColor: Colors.white),
primaryColor: Color(primary),
primaryColorDark: Color(primaryDark),
accentColor: Color(accent),
primaryColorLight: Color(primaryLight),
colorScheme: ColorScheme.light(
primary: Color(primary),
),
buttonTheme: ButtonThemeData(
buttonColor: Color(primary), textTheme: ButtonTextTheme.primary),
),
),
providers: <SingleChildWidget>[
ChangeNotifierProvider<DrawerState>(
create: (BuildContext context) => DrawerState(),
),
],
);
}
}
更多关于Flutter视频录制与上传插件ziggeo的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter视频录制与上传插件ziggeo的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中使用Ziggeo插件进行视频录制和上传,你需要按照以下步骤进行设置和实现。Ziggeo是一个强大的视频录制和上传平台,提供了Flutter插件来简化集成过程。
1. 添加依赖
首先,你需要在pubspec.yaml
文件中添加Ziggeo插件的依赖:
dependencies:
flutter:
sdk: flutter
ziggeo: ^1.0.0 # 请检查最新版本
然后运行flutter pub get
来安装依赖。
2. 获取Ziggeo API密钥
在Ziggeo开发者平台上注册并获取你的应用API密钥。你将需要这些密钥来配置Ziggeo SDK。
3. 初始化Ziggeo SDK
在你的Flutter应用中初始化Ziggeo SDK。通常,你可以在main.dart
文件中进行初始化:
import 'package:ziggeo/ziggeo.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 初始化Ziggeo SDK
Ziggeo ziggeo = Ziggeo("Your_App_Token");
await ziggeo.initialize();
runApp(MyApp());
}
4. 视频录制与上传
你可以使用Ziggeo提供的Widget来嵌入视频录制和上传功能。以下是一个简单的示例:
import 'package:flutter/material.dart';
import 'package:ziggeo/ziggeo.dart';
class VideoRecorderPage extends StatelessWidget {
final Ziggeo ziggeo = Ziggeo("Your_App_Token");
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Record Video'),
),
body: Center(
child: ZiggeoPlayer(
ziggeo: ziggeo,
videoToken: 'your_video_token', // 如果需要播放视频,可以指定视频token
onUploaded: (videoToken) {
print('Video uploaded with token: $videoToken');
// 你可以在这里处理上传成功后的逻辑
},
onError: (error) {
print('Error: $error');
// 处理错误
},
),
),
);
}
}