mp4 - 从特定位置开始 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 文件?
解决方案
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 事件中收到的所有片段
推荐阅读
- asp.net-core-mvc - Rotativa.AspNetCore 分页符半行进入下一页
- google-cloud-platform - 日期分区或日期分片
- python - 在旧 SBC 上运行的 Flask 中 webapp 的 DB 选择
- android - 如何从 Jacoco 报告中的 Parcelable 中排除自动生成的方法?
- json - 如何在打字稿中对json对象进行排序
- javascript - 如何修复此 json 电子邮件模式
- xpath - 如何停止特定标签?
- python - 计算 scikit-survival 中系数的置信区间
- c# - 如何在 codedUI 中的任何项目类中获取当前测试方法名称?
- vb.net - 在 DataGridView 返回单元格索引上的右 clic 是在哪里创建了右 clic?