RecordRTC分片上传webm后如何用PHP在服务端合并blobs为完整视频
问题根因
只有第一个分片可播放是WebM格式的正常特性:RecordRTC生成的WebM分片仅第一片包含完整的视频头元数据(编码参数、轨道信息等),后续分片仅包含裸媒体流片段,缺少头信息所以无法单独解码播放。
解决方案
方案1:直接二进制拼接(快速实现)
同一个录制会话的所有分片按上传顺序做二进制拼接,生成的文件大多数现代播放器(Chrome、VLC等)可直接播放。
Linux服务端可直接执行命令:
cat blob1.webm blob2.webm blob3.webm > full_video.webm
Node.js服务端参考代码:
const fs = require('fs'); const writeStream = fs.createWriteStream('full_video.webm'); // 必须严格按分片生成顺序写入 const sliceOrder = ['blob1.webm', 'blob2.webm', 'blob3.webm']; sliceOrder.forEach(path => writeStream.write(fs.readFileSync(path))); writeStream.end();
该方案兼容性一般,部分老旧播放器可能无法识别。
方案2:FFmpeg转封装(高兼容,推荐)
通过FFmpeg做无损转封装修复文件索引,可生成标准WebM格式文件,全平台可播放,且不会损失画质、处理速度极快。
- 先创建分片列表文件
filelist.txt,按顺序写入所有分片路径:
file 'blob1.webm' file 'blob2.webm' file 'blob3.webm'
- 执行FFmpeg合并命令:
ffmpeg -f concat -safe 0 -i filelist.txt -c copy full_video.webm
注意事项
- 分片必须严格按生成/上传顺序拼接,顺序错误会导致视频花屏、无法播放
- 不可跨不同录制会话混用分片,每个会话的头信息唯一,混用会导致解码失败
内容的提问来源于stack exchange,提问作者Luca Pennisi
相关产品推荐
相关产品推荐

