如何在客户端使用HTML5 / Javascript和控制器上的C#代码在MVC中将录制的视频作为blob发布/上传
本文关键字:MVC 的视频 上传 发布 blob 代码 客户端 HTML5 Javascript 控制器 | 更新日期: 2023-09-27 18:32:47
我正在构建一个视频监控应用程序,其要求是将录制的视频源保存到服务器,以便以后可以提供给观众。我正在使用 MediaRecorder API 来执行此操作,并且由于连续流最终会形成一个非常大的文件,难以一次发布,因此我计划将流 blob 切成多个块并定期发布。现在,记录事件通过html页面中的切换开关触发,然后Javascript接管。
这是我到目前为止的代码:
.HTML:
一些代码...
<div class="onoffswitch">
<input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" id="switch1">
<label class="onoffswitch-label" for="switch1" onclick="toggleVideoFeed();">
<span class="onoffswitch-inner"></span>
<span class="onoffswitch-switch"></span>
</label>
</div>
一些代码...
JavaScript:
var mediaRecorder;
var pushInterval = 6000;
var id, counter = 0;
// var formData;
function toggleVideoFeed() {
var element = document.getElementById("switch1");
element.onchange = (function (onchange) {
return function (evt) {
// reference to event to pass argument properly
evt = evt || event;
// if an existing event already existed then execute it.
if (onchange) {
onchange(evt);
}
if (evt.target.checked) {
startRecord();
} else {
stopRecord();
};
}
})(element.onchange);
}
var dataAvailable = function (e) {
var formData = new FormData();
var fileName = "blob" + counter + ".mp4";
console.log("data size: ", e.data.size);
var encodeData = new Blob([e.data], { type: 'multipart/form-data' });
formData.append("blob", encodeData, fileName);
var request = new XMLHttpRequest();
request.open("POST", "/Device/Upload", false);
request.send(formData);
counter++;
}
function startRecord() {
navigator.getUserMedia = (navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia);
if (navigator.getUserMedia) {
navigator.getUserMedia(
// constraints
{
video: true,
audio: false
},
// successCallback
function (stream) {
mediaRecorder = new MediaRecorder(stream);
mediaRecorder.start();
mediaRecorder.ondataavailable = dataAvailable;
// setInterval(function () { mediaRecorder.requestData() }, 10000);
},
// errorCallback
function (err) {
console.log("The following error occured: " + err);
}
);
} else {
console.log("getUserMedia not supported");
}
}
function stopRecord() {
mediaRecorder.stop();
}
控制器-C#
[HttpPost]
public JsonResult Upload(HttpPostedFileBase blob)
{
string fileName = blob.FileName;
int i = Request.Files.Count;
blob.SaveAs(@"C:'Users'priya_000'Desktop'Videos'" + fileName);
return Json("success: " + i + fileName);
}
问题所在:
当我尝试在服务器端获取收到的.mp4文件时,我可以只播放第一个文件 blob0 和其余文件,尽管它们显示的大小与第一个文件相似(每个 4 MB(不包含任何视频数据。我在另一端收到的数据是否有可能损坏/乱码?还是我的代码有问题。请帮助大家 - 自过去 10 天以来一直在尝试解决这个问题,但不知道如何弄清楚。
mp4文件有一个标题,放在文件的开头。标头包含用于初始化解码器的信息,没有它,则无法播放文件。尝试连接文件(第一个和第二个(,看看是否播放整个文件。如果是,则问题是缺少标头。如果没有,请将这两个文件发送给我,以便我可以检查它们并查看其中到底存储了什么。
AFAIK无法指示MediaRecorder将标头附加到每个视频斑点。您必须手动执行此操作。
PS. 抱歉回复晚了。
您可以使用Muaz Khan的RecordRTC,并使用MVC部分录制视频并将其保存到服务器。