#javascript #html #node.js #video
Вопрос:
Мой веб-проект, используя node.js / HTML / JavaScript, имеет элемент видеоплеера, и я хочу, чтобы пользователь мог нажать кнопку для воспроизведения файла MP4 на веб-странице. Как бы я это сделал?
Вот пример кода, который у меня есть, где у меня есть элемент видео, и я могу позволить пользователю перемещаться по своим файлам. Должен ли видеофайл пользователя быть загружен на мой сервер? Я хочу, чтобы они просто воспроизводили видео в своем браузере, которое они уже сохранили на своем компьютере.
Поскольку другие видео уже находятся в каталоге файлов моего проекта, я video.src = ...
меняюсь между ними. Поэтому я надеюсь придумать что-то подобное для воспроизведения собственных видео пользователя.
<input type="file" id="myFile" multiple size="50" onchange="myFunction()">
<p id="demo"></p>
<video id="video" playsinline style=" -moz-transform: scaleX(0);
-o-transform: scaleX(0);
-webkit-transform: scaleX(0);
transform: scaleX(0);
display: none;
">
</video>
<script>
function myFunction(){
var x = document.getElementById("myFile");
var txt = "";
if ('files' in x) {
if (x.files.length == 0) {
txt = "Select one or more files.";
} else {
for (var i = 0; i < x.files.length; i ) {
txt = "<br><strong>" (i 1) ". file</strong><br>";
var file = x.files[i];
if ('name' in file) {
txt = "name: " file.name "<br>";
}
if ('size' in file) {
txt = "size: " file.size " bytes <br>";
}
}
}
}
else {
if (x.value == "") {
txt = "Select one or more files.";
} else {
txt = "The files property is not supported by your browser!";
txt = "<br>The path of the selected file: " x.value; // If the browser does not support the files property, it will return the path of the selected file instead.
}
}
document.getElementById("demo").innerHTML = txt;
}
</script>
Последняя попытка
Вот соответствующий код в моем обработчике сейчас, после некоторых изменений. Это позволяет мне выбрать файл с всплывающим графическим интерфейсом Windows после того, как я нажму на элемент ввода, что хорошо. Но видео часть не работает:
document.getElementById("upload_video").addEventListener("change", function() {
var file = this;
console.log('Selected file: ' file);
var objectURL = URL.createObjectURL(file);
//document.getElementById("video").src = objectURL;
if (isVideo(file) == false) { //just checks extension name for e.g. .mp4, .avi, etc
alert("Error - not a video file.");
return;
}
video.src = objectURL;
});
Текущая ошибка, которую я получаю с этим кодом при выборе допустимого файла mp4:
(console.log) Selected file: [object HTMLInputElement]
Uncaught TypeError: Failed to execute 'createObjectURL' on 'URL': Overload resolution failed.
at HTMLInputElement.<anonymous>
Как мне это исправить?
Ответ №1:
Нет необходимости загружать видео в любом месте. Вы все еще можете установить video.src
; чтобы получить значение для него, используйте URL.createObjectURL
метод и передайте ему файл. Итак, предполагая, что у вас уже есть определенная file
переменная (например, в вашем myFunction
):
var objectURL = URL.createObjectURL(file);
document.getElementById("video").src = objectURL;
Для экономии памяти, особенно при работе с видео, вы должны вызвать URL.revokeObjectURL
objectURL
ее, как только она больше не понадобится (например, при выборе другого видео).
Комментарии:
1. До сих пор я пытался это сделать, и
document.getElementById("upload_video").addEventListener("change", function() { var file = this.value; console.log('Selected file: ' file); var objectURL = URL.createObjectURL(file);
тогда я бы попробовалvideo.src = objectURL;
. Тем не менее, я получаю журнал ошибка:Selected file: C:fakepathvid_exercise_sample_3.mp4
, иUncaught TypeError: Failed to execute 'createObjectURL' on 'URL': Overload resolution failed. at HTMLInputElement.<anonymous>
какие-либо идеи?2. @JDS
value
СвойствомHTMLInputElement
дляtype="file"
будет просто имя файла. Вам нужно выбрать реальныйFile
объект изfiles
свойства, точно так же, как вы делали в своем исходном коде. (У вас естьmultiple
атрибут, поэтому вы можете воспроизводить несколько видео, которые вам придется обрабатывать с помощью большего количества кода.)3. Эй, спасибо за совет. Я собираюсь обновить свой вопрос с помощью кода, который я пытаюсь, не могли бы вы взглянуть? Я думаю, что это должно быть близко.
4. @JDS Ах, хорошо, просто переоденься
var file = this;
var file = this.files[0];
, и тебе должно быть хорошо.5. О, чувак, теперь у меня все работает! Спасибо вам за продолжение, очень признателен! =D
Ответ №2:
<video width="400" controls>
<source src="random.mp4" type="video/mp4">
<source src="random.ogg" type="video/ogg">
Your browser does not support HTML video.
</video>
Комментарии:
1. Этот код не распространяется на необходимость воспроизведения определенного видео, выбранного пользователем
<input type="file">
, как описано в вопросе.2. Извините, но это не отвечает на мой вопрос.
3. Извините за мою ошибку