Tocar arquivo de vídeo local (disco rígido) com tag de vídeo HTML5?

91

Eu quero alcançar o seguinte.

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

A intenção é que o usuário possa selecionar um arquivo em seu disco rígido.

E o motivo para não fazer upload são os custos de transmissão e a cota de armazenamento. Não haverá motivo para salvar o arquivo.

É possível?

Chris
fonte
Definitivamente não funcionará com uma entrada de arquivo. Pode funcionar com HTML5 ondrop, mas não acho que você pode aproveitar isso para um upload de arquivo. Sua melhor aposta provavelmente seria fazer uma extensão do Chrome.
Brian Nickel

Respostas:

245

É possível reproduzir um arquivo de vídeo local.

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

Quando um arquivo é selecionado por meio do inputelemento:

  1. evento 'alterar' é disparado
  2. Obtenha o primeiro objeto File da input.files FileList
  3. Faça um URL de objeto que aponte para o objeto Arquivo
  4. Defina o URL do objeto para a video.srcpropriedade
  5. Encoste-se e observe :)

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

Dimitar Bonev
fonte
Isso funciona para mim no Chrome em um Mac. Não funciona com safari 6.1
Patrick Cullen
1
Parece que existem problemas conhecidos com o safari: stackoverflow.com/questions/19088400/… e bugs.webkit.org/show_bug.cgi?id=101671
Patrick Cullen
Excelente solução, também funciona no Chrome para Windows.
JT Taylor
Alguém fez o trabalho de inserir e retirar partes apropriadas de vídeo de modo a não matar a memória do navegador para vídeos grandes?
Eric Bloch de
Não foi possível visualizar os arquivos .mov ou .avi
Colocou
11

Isso só será possível se o arquivo HTML também for carregado com o file protocolo do disco rígido do usuário local.

Se a página HTML for servida por HTTP de um servidor, você não pode acessar nenhum arquivo local especificando-os em um srcatributo com ofile:// protocolo, pois isso significaria que você poderia acessar qualquer arquivo no computador do usuário sem que o usuário soubesse qual seria um enorme risco de segurança.

Como Dimitar Bonev disse, você pode acessar um arquivo se o usuário selecioná-lo usando um seletor de arquivos por conta própria. Sem essa etapa, é proibido por todos os navegadores por boas razões. Assim, embora sua resposta possa ser útil para muitas pessoas, ela afrouxa o requisito do código da pergunta original.

Holger Just
fonte
A solução de Dimitrov Bonev mostra que essa solução está incorreta - você pode acessar arquivos locais por meio de input type = file.
JT Taylor
1
Bem, a solução dele só funciona se você permitir que o usuário selecione o arquivo primeiro. Você ainda não pode nomear o caminho para o arquivo no código-fonte HTML (como declarado na pergunta) e acessá-lo dessa forma. Portanto, sua solução é tecnicamente para outra questão.
Holger apenas
O vlc player também pode reproduzir qualquer arquivo no computador, mas também há um risco de segurança. Ele pode baixar arquivos de nosso disco rígido para seus servidores sem que percebamos se eles querem, não é? Então, por que não há risco de segurança? Na pior das hipóteses, o usuário pode aceitar manualmente se permitir que o navegador reproduza o arquivo. Porque existem situações em que o usuário confia 100% na página, pois são os usuários que trabalham na mesma empresa como criadores da web.
Dariux
6

Tive esse problema há um tempo. O site não pôde acessar o arquivo de vídeo no PC local devido às configurações de segurança (compreensível, na verdade). A ÚNICA maneira de contornar isso foi rodar um servidor da web no PC local (server2Go) e todas as referências ao arquivo de vídeo da web foram para o 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-->

Não é uma solução ideal, mas funcionou para mim.

jcoshea
fonte
2
Se você copiar o arquivo para um local de cache e definir o caminho da fonte de vídeo para ele, ele será reproduzido. Copie o arquivo para context.getExternalCacheDir (). GetAbsolutePath (). Funciona para mim.
Derek Wade
também pode ser feito com qualquer servidor web no computador de usuários como apache ou mongoose
Dariux