流数据实时上云,异步上云
SDK地址:https://www.volcengine.com/docs/6521/156285
慢直播有两种方式实现实时录像上云,按照录制时间长短、对录制可靠性要求程度,结合业务情况选择合适的方式即可,可参考下文【两种方式差异对比】
API作用 | API文档地址 | SDK接口 |
---|---|---|
https://www.volcengine.com/docs/6521/176057 | streamStartRecord | |
停止录像 | https://www.volcengine.com/docs/6521/176058 | streamStopRecord |
查询录像 | https://www.volcengine.com/docs/6521/176059 | getStreamRecord |
streamStartRecord
启动录像;设置autoPull为true,会自动拉取流ID对应的视频流,上云录制并存储public void testStartStreamRecord() { StreamStartRecordRequest streamStartRecordRequest = new StreamStartRecordRequest(); streamStartRecordRequest.setStreamID("ee9a49ea-916c-4c2f-aced-333e409414df"); streamStartRecordRequest.setRecordTime(100); streamStartRecordRequest.setTimeout(10); streamStartRecordRequest.setExpire(0); streamStartRecordRequest.setAutoPull(true); try { IDResponse idResponse = videoAIoTService.streamStartRecord(streamStartRecordRequest); System.out.println(JSON.toJSONString(idResponse)); } catch (Exception e) { e.printStackTrace(); } }
返回的ID用于后续停止和查询。
完成录制后根据ID调用streamStopRecord
停止录像
根据ID调用getStreamRecord
查询录像
API作用 | API文档地址 | SDK接口 |
---|---|---|
编辑录像计划,配置录像上云通道 | https://www.volcengine.com/docs/6521/1103994 | updateRecordPlan |
获取云端录像播放地址 | https://www.volcengine.com/docs/6521/1169962 | playCloudRecord |
预先创建资源
在调用API之前,需要预先创建以下资源:
创建录像计划,地址:https://console.volcengine.com/AIoTVideo/RecordPlan/RecordCreate
创建好录制模板和录像计划后,即可复用,不用重复创建,如果不同场景录制的需求不同,可以创建多个录像模板和录像计划
API调用
录像;录像计划创建完成后,只需要调用updateRecordPlan
将要录制的通道添加进去,录制结束,移除对应的通道即可。
播放;第二种方式录制的视频不会直接返回播放地址,需要调用playCloudRecord
根据流ID,上云时间段获取。
public void testPlayCloudRecord() throws Exception { setTest(); PlayCloudRecordRequest playCloudRecordRequest = new PlayCloudRecordRequest(); //streamID playCloudRecordRequest.setStreamID("0f144bd6-6be1-4a11-9b1a-4b0f36b82277"); //播放录像开始时间 playCloudRecordRequest.setStartTime(System.currentTimeMillis() / 1000 - 3600); //播放录像结束时间 playCloudRecordRequest.setEndTime(System.currentTimeMillis() / 1000); playCloudRecordRequest.setStreamingIndex(2); //token过期时间 playCloudRecordRequest.setTokenValid(1200); PlayCloudResponse playCloudResponse = videoAIoTService.playCloudRecord(playCloudRecordRequest); System.out.println(JSON.toJSONString(playCloudResponse)); }
关于录像开始时间和结束时间,不需要保证startTime和endTime里的录像是完整的,如果中间有碎片时间,播放的时候会自动跳过。
录制方式 | 优势 | 劣势 |
---|---|---|
短时间录制 |
|
|
长时间录制 |
|
|
录像保存在NVR,通过异步API将录像上传到云端
API作用 | API文档地址 | SDK接口 |
---|---|---|
发起录像上传 | https://www.volcengine.com/docs/6521/1123385 | localMediaDownload |
查询录像上传 | 暂缺 | getLocalDownload |
localMediaDownload
发起录像上传;public void testLocalMediaDownload() { LocalMediaDownloadRequest localMediaDownloadRequest = new LocalMediaDownloadRequest(); localMediaDownloadRequest.setSpaceID("7c09b921-a07c-4fd2-b59f-e0fce9a072a0\n"); localMediaDownloadRequest.setChannelID("34020035991320467670"); localMediaDownloadRequest.setDeviceID("34020095991320293742"); localMediaDownloadRequest.setStartTime(1660719434); localMediaDownloadRequest.setEndTime(1660719534); localMediaDownloadRequest.setVersion("2"); LocalMediaDownloadRequest.Mps mps = new LocalMediaDownloadRequest.Mps(); LocalMediaDownloadRequest.M3U8Option m3u8 = new LocalMediaDownloadRequest.M3U8Option(); m3u8.setToMp4(true); mps.setM3U8Option(m3u8); LocalMediaDownloadRequest.Subtitle subt = new LocalMediaDownloadRequest.Subtitle(); subt.setSubtitleSrc(""); LocalMediaDownloadRequest.Font font = new LocalMediaDownloadRequest.Font(); font.setFontSize(2); font.setAlignment(""); font.setPrimaryColor(""); subt.setFont(font); LocalMediaDownloadRequest.SubtitleItem item = new LocalMediaDownloadRequest.SubtitleItem(); item.setContent("哈哈哈"); item.setEnd(9000); item.setStart(5000); LocalMediaDownloadRequest.SubtitleItem item1 = new LocalMediaDownloadRequest.SubtitleItem(); item.setContent("哈哈哈"); item.setEnd(9000); item.setStart(5000); List<LocalMediaDownloadRequest.SubtitleItem> list1 = new ArrayList<LocalMediaDownloadRequest.SubtitleItem>(); list1.add(item); //list1.add(item1); subt.setSubtitleList(list1); mps.setSubtitle(subt); localMediaDownloadRequest.setMediaProcess(mps); try { LocalMediaDownloadResponse download = videoAIoTService.localMediaDownload(localMediaDownloadRequest); System.out.printf(JSON.toJSONString(download)); } catch (Exception e) { throw new RuntimeException(e); } }
根据返回的ID调用getLocalDownload
轮询录像上传状态,状态为success表示上传成功,error表示上传失败。url为可播放的地址,subtitleURL表示带水印的播放地址。
也可以配置回调地址,通过回调监控录像上传状态,避免轮询,参考https://www.volcengine.com/docs/6521/124201中的本地录像下载
事件。