Воспроизвести локальный (жесткий диск) видеофайл с тегом HTML5 video?

89

Я хочу добиться следующего.

<video src="file:///Users/username/folder/video.webm">
</video>

Смысл в том, что пользователь сможет выбрать файл со своего жесткого диска.

Причиной отказа от загрузки, конечно же, является стоимость передачи и квота хранения. Не будет причин для сохранения файла.

Является ли это возможным?

Крис
источник
Это точно не будет работать с файловым вводом. Он может работать с HTML5 ondrop, но я не думаю, что вы можете использовать это для загрузки файлов. Лучше всего, вероятно, сделать расширение Chrome.
Брайан Никель

Ответы:

241

Возможно воспроизведение локального видеофайла.

<input type="file" accept="video/*"/>
<video controls autoplay></video>

Когда файл выбран с помощью inputэлемента:

  1. событие 'change' запущено
  2. Получить первый объект File из input.files FileList
  3. Создайте URL-адрес объекта, который указывает на объект File
  4. Установите URL-адрес объекта в video.srcсвойство
  5. Откиньтесь и смотрите :)

http://jsfiddle.net/dsbonev/cCCZ2/embedded/result,js,html,css/

Димитар Бонев
источник
Это работает для меня в Chrome на Mac. Не работает с Safari 6.1
Патрик Каллен
1
Похоже, есть известные проблемы с сафари: stackoverflow.com/questions/19088400/… и bugs.webkit.org/show_bug.cgi?id=101671
Патрик Каллен
Отличное решение, также работает в Chrome для Windows.
JT Taylor
Кто-нибудь проделал работу по постраничному вводу и выводу соответствующих фрагментов видео, чтобы не забивать память браузера для больших видео?
Эрик Блох
Невозможно просмотреть файлы .mov или .avi.
Задал
11

Это будет возможно только в том случае, если файл HTML также будет загружен с fileпротоколом с жесткого диска локального пользователя.

Если HTML-страница обслуживается HTTP с сервера, вы не можете получить доступ к каким-либо локальным файлам, указав их в srcатрибуте с file://протоколом, так как это будет означать, что вы можете получить доступ к любому файлу на компьютере пользователя без ведома пользователя, который будет огромный риск безопасности.

Как сказал Димитар Бонев, вы можете получить доступ к файлу, если пользователь сам выберет его, используя селектор файлов. Без этого шага это запрещено всеми браузерами по уважительным причинам. Таким образом, хотя его ответ может оказаться полезным для многих, он ослабляет требования кода в исходном вопросе.

Хольгер Джаст
источник
Решение Димитрова Бонева показывает, что это решение неверно - вы можете получить доступ к локальным файлам через input type = file.
JT Taylor
1
Что ж, его решение работает, только если вы позволите пользователю сначала выбрать файл. Вы по-прежнему не можете указать путь к файлу в источнике HTML (как указано в вопросе) и получить к нему доступ таким образом. Таким образом, его решение технически касается другого вопроса.
Holger Just
vlc player также может воспроизводить любой файл на компьютере, но это также представляет угрозу безопасности. Он может загружать файлы с нашего жесткого диска на их серверы без нашего ведома, если они этого хотят, не так ли? Так почему же тогда нет угрозы безопасности? В худшем случае пользователю может быть разрешено принять его вручную, если он разрешит браузеру воспроизводить файл. Потому что бывают ситуации, когда пользователь на 100% доверяет странице, потому что именно пользователи работают в той же компании, что и веб-создатели.
Darius.V
6

Пробежался к этой проблеме некоторое время назад. Веб-сайт не мог получить доступ к видеофайлу на локальном ПК из-за настроек безопасности (что действительно понятно). ТОЛЬКО способ, которым я мог обойти это, заключался в запуске веб-сервера на локальном ПК (server2Go), и все ссылки на видеофайл из Интернета были на localhost / video.mp4

<div id="videoDiv">
     <video id="video" src="http://127.0.0.1:4001/videos/<?php $videoFileName?>" width="70%" controls>
    </div>
<!--End videoDiv-->

Не идеальное решение, но сработало для меня.

jcoshea
источник
2
Если вы скопируете файл в место кэша и зададите путь к источнику видео, он будет воспроизводиться. Скопируйте файл в context.getExternalCacheDir (). GetAbsolutePath (). Работает для меня.
Дерек Уэйд
также может работать с любым веб-сервером на компьютере пользователя, таким как apache или mongoose
Darius. V