首页 > 解决方案 > 从特定位置开始 HLS 录制/从 hls.js 获取当前片段数据

问题描述

我正在使用hls.js项目查看 hls 内容我需要实现“录制”功能 - 一旦用户单击“开始录制”按钮,一旦用户单击,从该位置开始的所有片段都会聚合到临时缓冲区中'Stop Recording',这些片段与前置的 init 片段一起保存到 mp4 文件中。

到目前为止,我能够监听 BUFFER_APPENDING 事件并将新段推送到临时数组中

hls.on(Hls.Events.BUFFER_APPENDING,  (event, data) => {
        if (this.state.recording) {
            this.dataStream[data.type].push(data.data);
            console.log("recording " + data.type + " data, " + data.data.length + " bytes  ...")
        }
    });

但是这些是被添加到缓存缓冲区的更新的段,实际记录的数据从实际的“开始记录”时间向前移动了大约 30s-60s

我检查了 FRAG_CHANGED 事件,这似乎是当前播放的片段 - hls.js 事件

hls.on(Hls.Events.FRAG_CHANGED, (event, data) => {
        console.log("HLS Player Frag Changed")
        console.log("Data = " + inspect(data))
    })

我怎样才能真正获得当前播放的视频片段数组来聚合它,然后用它来构建 mp4 文件?

标签: mp4http-live-streaminghls.js

解决方案


this.dataStream = [];
this.fragments = []
...
hls.on(Hls.Events.FRAG_CHANGED, (event, data) => {
           console.log("HLS Player Frag Changed")
           //console.log("Data = " + inspect(data))
           if (this.state.recording) {
               let recdata = this.fragments[data.frag.sn]
               let dataToRecord = [...recdata.data1,...recdata.data2]
               this.dataStream.push(dataToRecord);
               console.log("recording video data sn(" + data.frag.sn+ ") " + dataToRecord.length + " bytes  ...")
           }
       })
hls.on(Hls.Events.FRAG_PARSING_DATA, (event, data) => {
            console.log("HLS Player Frag Parsing Data")
            //console.log("Data = " + inspect(data))
            this.fragments[data.frag.sn]=data
            console.log("saved sn(" + data.frag.sn + ") - fragment")
        })

但可能存在内存问题,因为我正在存储在 FRAG_PARSING_DATA 事件中收到的所有片段


推荐阅读