You need to enable JavaScript to run this app.
导航
慢直播云端录制最佳实践
最近更新时间:2024.08.19 17:04:45首次发布时间:2024.08.19 17:04:45
适用场景

流数据实时上云,异步上云

SDK地址:https://www.volcengine.com/docs/6521/156285

实时上云

慢直播有两种方式实现实时录像上云,按照录制时间长短、对录制可靠性要求程度,结合业务情况选择合适的方式即可,可参考下文【两种方式差异对比】

短时间录制

相关API以及SDK接口

API作用API文档地址SDK接口

启动录像

https://www.volcengine.com/docs/6521/176057

streamStartRecord

停止录像https://www.volcengine.com/docs/6521/176058streamStopRecord
查询录像https://www.volcengine.com/docs/6521/176059getStreamRecord

使用步骤

  1. 调用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用于后续停止和查询。

  1. 完成录制后根据ID调用streamStopRecord停止录像

  2. 根据ID调用getStreamRecord查询录像

长时间录制

相关API以及SDK接口

API作用API文档地址SDK接口
编辑录像计划,配置录像上云通道https://www.volcengine.com/docs/6521/1103994updateRecordPlan
获取云端录像播放地址https://www.volcengine.com/docs/6521/1169962playCloudRecord

使用步骤

预先创建资源

在调用API之前,需要预先创建以下资源:

  1. 录制模板;创建录制模板,地址:https://console.volcengine.com/AIoTVideo/Template?tab=2

  1. 录像计划

创建录像计划,地址:https://console.volcengine.com/AIoTVideo/RecordPlan/RecordCreate

创建好录制模板和录像计划后,即可复用,不用重复创建,如果不同场景录制的需求不同,可以创建多个录像模板和录像计划

API调用

  1. 录像;录像计划创建完成后,只需要调用updateRecordPlan将要录制的通道添加进去,录制结束,移除对应的通道即可。

  2. 播放;第二种方式录制的视频不会直接返回播放地址,需要调用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里的录像是完整的,如果中间有碎片时间,播放的时候会自动跳过。

两种方式差异对比

录制方式优势劣势

短时间录制

  1. 使用相对方便,更灵活

  2. 即时性好,发起录制之后,后台会立刻自动拉起视频流开始录制,从发起到开始录制延迟低(小于1秒)

  1. 可靠性相对较差;录制过程中如果流断开(网络问题、设备问题),此种方式不会自动拉流

长时间录制

  1. 可靠性相对更好;录制过程中如果流断开,后台会自动拉流继续录制

  2. 提供转封装切片、上云时间等特性

  1. 使用相对繁琐

  2. 即时性相对较差,发起录制后(即将通道添加到录像计划)到真正录制中间存在时间差(小于3秒)


异步上云

录像保存在NVR,通过异步API将录像上传到云端

相关API以及SDK接口

API作用API文档地址SDK接口
发起录像上传https://www.volcengine.com/docs/6521/1123385localMediaDownload
查询录像上传暂缺getLocalDownload

使用步骤

  1. 调用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);
    }
}
  1. 根据返回的ID调用getLocalDownload轮询录像上传状态,状态为success表示上传成功,error表示上传失败。url为可播放的地址,subtitleURL表示带水印的播放地址。

  2. 也可以配置回调地址,通过回调监控录像上传状态,避免轮询,参考https://www.volcengine.com/docs/6521/124201中的本地录像下载事件。