遇到以下问题:从客户端使用 websocket 我一点一点地将视频驱动到服务器:
mediaRecorder.ondataavailable = function (e) {
if (ws && ws.readyState === WebSocket.OPEN && e.data && e.data.size > 0) {
ws.send(e.data);
}
else {
//...
}
}
mediaRecorder.start(100);
在循环的服务器上,我获取这些部分并将它们写入文件。
while (true)
{
buffer = new ArraySegment<byte>(new byte[500000]);
result = await socket.ReceiveAsync(buffer, CancellationToken.None);
if (socket.State == WebSocketState.CloseReceived)
{
bw.Close();
fs.Close();
break;
}
if (Encoding.UTF8.GetString(buffer.Array, 0, result.Count) == "start record")
{
writeStatus = "start record";
fullPath = $"{context.Server.MapPath("~")}{fileName}.{fileExt}";
fs = new FileStream(fullPath, FileMode.Append, FileAccess.Write);
bw = new BinaryWriter(fs);
continue;
}
if (Encoding.UTF8.GetString(buffer.Array, 0, result.Count) == "stop record")
{
bw.Close();
fs.Close();
writeStatus = "none";
continue;
}
if (writeStatus == "start record")
{
bw.Write(buffer.Array, 0, result.Count);
pos += result.Count;
}
}
问题是每次重新加载页面时,我都需要将视频写入同一文件。据我了解,仅添加到文件末尾不是一种选择,因为在这种情况下,播放录制的视频文件时不会播放所有添加的字节。请告诉我,如何继续在同一文件中录制视频?
如果不经过"视频加入"过程,这可能是不可能的。我假设来自浏览器的流的开头包含一个需要位于文件开头的标头。
没有简单的算法或内置的.Net Framework工具可以提供帮助。最好尝试使用外部库或工具(如 FFmpeg(,请参阅使用 C# 联接多个.wmv文件
视频文件是组合视频和音频流的"容器"格式。您会发现多个录制会话只是包含视频和音频的多个"视频文件容器"。如果您跟踪"视频文件容器"的开头位置,则可以将该数据作为要连接的单独文件提供给 FFmpeg。如果视频或音频流来自同一浏览器并具有相同的分辨率,则无需重新压缩它们,您应该能够简单地"复制"它们。