Vraptor + videos

Pessoal, to precisando incluir uma funcionalidade em uma aplicação feita no VRAPTOR4 que é um módulo onde o usuário faz upload de um vídeo e ai em um outra página aparecerá a lista de vídeos que o usuário fez upload, porém to perdido em como fazer uma tela que mostra uma imagem em miniatura do vídeo e que ao clicar o usuário caia em uma outra pagina ou modal onde o vídeo sera reproduzido.
Alguem ja fez algo parecido ? poderia dar um norte ?

vamos la

Video é uma parada BEM complicada, mas que podemos simplificar bastante.

Vou dar um exemplo: vc pode definir que vc aceita videos com container H264 e container mp4 com ate X mb de tamanho. para vc mostrar esse video é basicamente montar um tag video

aqui tem alguns exemplos:
http://www.w3schools.com/tags/tag_video.asp

a tag video do html5 é semelhante à tag de imagem, ou seja, se vc tiver um diretorio que possa servir arquivos estaticos ( sabe os seus css js imagens etc ? ) basta meter a url nessa tag q o video toca SE o browser suportar html5, etc. então resolvemos a questão do playback.

para mostrar uma imagem do video, vc tem a propriedade poster, que pode receber o endereço de uma imagem.

agora como vc gera essa imagem? nao tem erro se o camarada subir uma imagem pra vc. isso é uma mão na roda. senão vc precisa de um criterio para extrair um frame do video. e acredite, isso é uma DOR de cabeça… pq vc pode pegar um frame ruim que em nada tem haver com o video.

mas como pegar um frame do video?

e como vc vai servir o video?

como vc vai receber o video?

vamos la pequeno gafanhoto: vc pode servir o video como se fosse um arquivo estatico: isso é conhecido como progressive download. agora vc usar um container J2EE para isso é delicado ( eu não faria ). o ideal é vc ter um servidor web na frente como NGINX que vai servir os seus arquivos estaticos ( digamos q vc crie um host static.suapagina.com que mapeia um diretorio qualquer, e faça proxy do app.suapagina.com para a porta 8080, etc ).

feito isso, como vc recebe? via post, faz um formulario e vc vai receber como um MULTIPART/FORM-DATA. Boa sorte pra lidar com esse tipo de arquivo. alias video pode ser bem grande e timeouts é algo possivel. uma coisa q vc pode fazer se o arquivo for gigante é considerar pegar o inputstream e parsear os bytes de forma a entender o request HTTP e escrever em disco enquanto vc recebe. se for um video pequeno, digamos alguns Megas, talvez nao seja preciso.

recebeu o arquivo? salva em um diretorio que vc pode “servir”.

agora que a porca torce o rabo: como pegar um frame? SE vc precisa disso, esteja preparado para usar uma ferramenta externa como o ffmpeg ou um pequeno programa em C usando a libavcodec/libavformat. Java nao vai te dar isso de cara, por uma série de razões. Talvez tenha algum projeto capaz de entender como um mp4/h264 armazena os frames, decodificar e salvar em jpg, eu desconheço.

e agora que a porca torce o rabo++ : o que fazer se o video não toca? nem todo o mp4 toca em uma tag video. vc tem requisitos minimos. alias nada garante que vc pode exigir o container mp4. talvez vc tenha que transcodificar o video do formato origem para um formato destino. Ai meu amigo… boa sorte. isso não é facil de fazer, vc talvez tenha que usar ffmpeg ou mencoder e vai ter que estudar codecs, containers e tudo sobre video. nem sempre é possivel converter e pode ficar muito ruim ( por conta do erro acumulado ). se vc precisa transcodificar, o correto é tentar usar um formato RAW que geralmente é GIGANTE.

isso q não falamos em resolução, qualidade, frames por segundo, orientação, etc.

uma sugestão se vc nao quer ou não pode servir o video como um arquivo estatico é fazer streaming. existem alguns streaming servers como Wowza, Red5 e Flash Media Server.

se vc nao pode usar html5, vai ter q apelar para Flash e isso não é trivial ( veja o Open Source Media Framework ).

por fim, vc sempre pode tentar enviar o video para o Youtube ( ou Vimeo ) e tentar enfiar o embed dele em um modal. de fato dependendo do que vc quer fazer pode ser uma otima opção pois video gasta banda. isso é algo que vai rodar internamente ou externamente? é mais sistema interno ou é um site que tera videos?

acredite, esse assunto é longo e daria muitas e muitas paginas. perceba que estamos falando alem de vc usar java e vraptor, alem do container web, vc talvez tenha que usar um javascript customizado e/ou um player flash, talvez tenha q ter um servidor web ou servidor de streaming, talvez tenha que transcodificar, etc.

isso q nao falamos na segurança. talvez vc tenha que usar HTTP streaming. talvez tenha que usar RTMP.

isso q nao falamos em geolocalização, que as vezes vc nao pode servir um conteudo fora de determinados paises ( indico MaxMind para isso )

pesquise sobre o que eu falei e boa sorte.

Muito obrigado peczenyj, deu uma norteada já rs.
Vou fazer agora uma lição de casa baseado no que vc escreveu.