[Resolvido] Multimidia - JMF, JNI, DSJ, VLCJ, OpenCV, JavaCV, JNA

Galera, pesquisei bastante e bastante sobre desenvolvimento de aplicações que utilizam multimidia e muita gente como eu tem problema com a JMF. Já sei que está obsoleta. Em alguns lugares, inclusive aqui já vi um cara recomendando toda hora hora DSJ, só que pelo que eu vi ele é apenas para windows :frowning: . Vi o entanglement falar sobre OpenCV que usa C e C++ e outras pessoas me falaram também sobre JNI. O que eu queria é perguntar para quem souber e puder me responder aqui mais sobre OpenCV, JNI, se são multiplataformas, o que eu tenho que aprender antes. Para uma aplicação multiplataforma, que utiliza webcam, audio, video, e quem sabe mais tarde com reconhecimento de formas na webcam, tipo rosto, mão, etc. E se eles também são frameworks? Tem a documentação boa? etc.

No caso de processamento de vídeo, esqueça o Java.
Opção multiplataforma para captura de vídeo quase não existem.

O que você tem é opções portáveis (que podem ser compiladas em várias plataformas).

Inicialmente, a biblioteca para fazer a interface gráfica em sí pode ser o QT:
http://qt.nokia.com/

O próprio QT contém classes para abrir imagens de uma webcam.
http://doc.qt.nokia.com/4.7-snapshot/phonon-module.html

A OpenCV é uma biblioteca com enfoque em visão computacional. O ideal dela é permitir que você processe imagens, aplique filtros, identifique padrões, etc…
Ela também tem um suporte a webcams, mas não ao audio.

Finalmente, existe como alternativa a OpenNI, que é uma biblioteca com ênfase em prover interface natural (identificação do esqueleto, identificação de gestos, etc). Atualmente os dispositivos da PrimeSense (inclusive o Kinect) tem drivers para ela.
Se quiser usá-la em conjunto com a OpenCV, estou desenvolvendo uma pequena lib que facilita a integração:

Tudo isso em C++.

Só para vc saber: JNI não tem nada a ver com isso.

É a sigla de Java Native Interface, uma forma de interoperar Java com C++.

Ou seja, ou vc faz código C++ portável, ou sua aplicação com JNI também não será multiplataforma.

[quote=ViniGodoy]No caso de processamento de vídeo, esqueça o Java.
Opção multiplataforma para captura de vídeo quase não existem.

O que você tem é opções portáveis (que podem ser compiladas em várias plataformas).

Inicialmente, a biblioteca para fazer a interface gráfica em sí pode ser o QT:
http://qt.nokia.com/

O próprio QT contém classes para abrir imagens de uma webcam.
http://doc.qt.nokia.com/4.7-snapshot/phonon-module.html

A OpenCV é uma biblioteca com enfoque em visão computacional. O ideal dela é permitir que você processe imagens, aplique filtros, identifique padrões, etc…
Ela também tem um suporte a webcams, mas não ao audio.

Finalmente, existe como alternativa a OpenNI, que é uma biblioteca com ênfase em prover interface natural (identificação do esqueleto, identificação de gestos, etc). Atualmente os dispositivos da PrimeSense (inclusive o Kinect) tem drivers para ela.
Se quiser usá-la em conjunto com a OpenCV, estou desenvolvendo uma pequena lib que facilita a integração:

Tudo isso em C++.[/quote]

Opa opa. Já deu uma esclarecida legal. E o que você acha do Flex para esse tipo de aplicação?

[quote=ViniGodoy]Só para vc saber: JNI não tem nada a ver com isso.

É a sigla de Java Native Interface, uma forma de interoperar Java com C++.

Ou seja, ou vc faz código C++ portável, ou sua aplicação com JNI também não será multiplataforma.[/quote]

E para streaming RTP o que recomendaria?

Por que a aplicação com JNI não seria multiplataforma, se ela interopera Java com C++? Porque o código de C++ para um sistema no JNI ficaria diferente no JNI com outro sistema?

Nunca usei. Mas não se ouve falar muito em flex e processamento de imagens.

Só para deixar claro. Detectar gestos, rostos, etc. não é uma tarefa trivial e ainda é campo de pesquisa em informática.
Você pode fazer um mestrado e até um doutorado sobre esses assuntos (eu mesmo, estou fazendo).

http://research.edm.uhasselt.be/~jori/page/index.php?n=CS.Jrtplib

Todo código JNI roda fora da VM, portanto, não é multiplataforma. O máximo que vc pode ter é um código portável.
Isto é, a parte C++ do código teria que ser compilada em cada plataforma que você desejasse usar, e distribuída junto com sua aplicação.

Manter um código em JNI não é fácil. Se você já vai se dar ao trabalho de portar sua aplicação, será mais fácil escreve-la diretamente em C++.
Até porque, como estamos falando em processamento de vídeo, é bom ter controle sobre a gerência de memória, ou então, corre-se o risco do gargabe collector rodar no meio da aplicação e gerar pequenos glitches.

[quote=lucas_guj][quote=ViniGodoy]Só para vc saber: JNI não tem nada a ver com isso.

É a sigla de Java Native Interface, uma forma de interoperar Java com C++.

Ou seja, ou vc faz código C++ portável, ou sua aplicação com JNI também não será multiplataforma.[/quote]

E para streaming RTP o que recomendaria?

Por que a aplicação com JNI não seria multiplataforma, se ela interopera Java com C++? Porque o código de C++ para um sistema no JNI ficaria diferente no JNI com outro sistema?[/quote]

Olha, eu rocomendaria você dar uma olhada no javafx e no javascript. O javafx tem um bom suporte a h264 e pode suprir a sua necessidade de fazer streaming de vídeo.
Com javascript na minha opinião seria talvez um pouco obscuro. Eu o estou estudando agora com html5 para implementar uma solução semelhante. Você ficará surpreso que esse tipo de solução pode ser implementada com eles, mas no caso você vai precisar escrever os algoritmos de processamento de imagens, pois ainda não achei uma biblioteca pronta com eles. Html5 suporta aceleração de hardware e streaming de vídeo.

Sobre o flex até dá para implementar uma solução como essa, mas você vai morrer na mão da adobe, pois ela já não mais o mantem.

Eu to ligado, eu li seus posts e de outro usuário no tópico sobre kinnect e LIBRAS. E parabéns pela sua iniciativa.

Eu perguntei sobre Flex, porque conversando com um programador uma vez, ele me disse que fez uma solução assim para web com flex, java e red5, só que no meu caso, não seria a aplicação na web e sim desktop.

Agora consegui entender melhor o porque. E o que vocês achariam de insistir na JMF para começo já que é mais fácil e portável?
No caso com html5 e javascript seria um sistema rodando diretamente na web certo? E no momento queria desktop swing.

JMF é uma tecnologia que morreu com o win xp. Ele usa vídeo for windows( vfw). Essa api foi descontinuada nos novos windows. Ela nem mesmo possui aceleração de hardware.
Se você quer fazer desktop escreva em c++. Existe todo um suporte a multimídia e ferramentas para essa linguagem.

Usando javafx você faz para desktop também. Mas imagino que a parte de captura jfx não faça, apenas o preview do vídeo.

preview = streaming e reprodução de vídeo
captura = receber os quadros dos vídeos em uma área de memória.

[quote=juliocbq][quote=lucas_guj]

Agora consegui entender melhor o porque. E o que vocês achariam de insistir na JMF para começo já que é mais fácil e portável?
No caso com html5 e javascript seria um sistema rodando diretamente na web certo? E no momento queria desktop swing.
[/quote]

JMF é uma tecnologia que morreu com o win xp. Ele usa vídeo for windows( vfw). Essa api foi descontinuada nos novos windows. Ela nem mesmo possui aceleração de hardware.
Se você quer fazer desktop escreva em c++. Existe todo um suporte a multimídia e ferramentas para essa linguagem.

Usando javafx você faz para desktop também. Mas imagino que a parte de captura jfx não faça, apenas o preview do vídeo.

preview = streaming e reprodução de vídeo
captura = receber os quadros dos vídeos em uma área de memória.[/quote]

Os novos windows usam o que? Pelo menos no windows 7 o vfw ainda funciona com jmf. Obrigado pelas dicas. Eu já sabia que mais cedo ou mais tarde teria que aprender C++.

[quote=lucas_guj][quote=juliocbq][quote=lucas_guj]

Agora consegui entender melhor o porque. E o que vocês achariam de insistir na JMF para começo já que é mais fácil e portável?
No caso com html5 e javascript seria um sistema rodando diretamente na web certo? E no momento queria desktop swing.
[/quote]

JMF é uma tecnologia que morreu com o win xp. Ele usa vídeo for windows( vfw). Essa api foi descontinuada nos novos windows. Ela nem mesmo possui aceleração de hardware.
Se você quer fazer desktop escreva em c++. Existe todo um suporte a multimídia e ferramentas para essa linguagem.

Usando javafx você faz para desktop também. Mas imagino que a parte de captura jfx não faça, apenas o preview do vídeo.

preview = streaming e reprodução de vídeo
captura = receber os quadros dos vídeos em uma área de memória.[/quote]

Os novos windows usam o que? Pelo menos no windows 7 o vfw ainda funciona com jmf. Obrigado pelas dicas. Eu já sabia que mais cedo ou mais tarde teria que aprender C++.[/quote]
Funciona muito meia boca sem aceleração de hardware.

Usam um recurso do directshow chamado vmr9. Ele te permite desenhar um quadro de vídeo como textura em uma superfície 3d.

Você que provavelmente tem experiência com DSJ, o que acha de eu usá-lo?

Julio,

nesse tópico http://www.guj.com.br/java/145748-alternativa-ao-jmf/2 você indica o VLC como uma alternativa multiplataforma. O que você acha? Eu tenho o programa instalado aqui no meu pc. Porém ele também tem uma biblioteca para desenvolvimento java multimidia?

[quote=lucas_guj]Julio,

nesse tópico http://www.guj.com.br/java/145748-alternativa-ao-jmf/2 você indica o VLC como uma alternativa multiplataforma. O que você acha? Eu tenho o programa instalado aqui no meu pc. Porém ele também tem uma biblioteca para desenvolvimento java multimidia?[/quote]

A api do vlc pra java foi descontinuada.

A dsj é muito boa, mas precisa do directx por isso só vai funcionar em windows. Além de não ser free para projetos comerciais.
Quando se fala em recursos multimedia no final você acaba dependendo de hardware e não tem jeito de usar multiplataforma(de certa forma). O framework qt possui o phonon como o viny falou e vai rodar em win, mac e linux.

Acho ele a melhor opção no seu caso usando c++ mesmo.

http://doc.qt.nokia.com/4.7-snapshot/phonon-module.html

[quote=juliocbq]Acho ele a melhor opção no seu caso usando c++ mesmo.

http://doc.qt.nokia.com/4.7-snapshot/phonon-module.html[/quote]

… e voltamos a dica que dei lá no início… :lol:

[quote=juliocbq][quote=lucas_guj]Julio,

nesse tópico http://www.guj.com.br/java/145748-alternativa-ao-jmf/2 você indica o VLC como uma alternativa multiplataforma. O que você acha? Eu tenho o programa instalado aqui no meu pc. Porém ele também tem uma biblioteca para desenvolvimento java multimidia?[/quote]

A api do vlc pra java foi descontinuada.

A dsj é muito boa, mas precisa do directx por isso só vai funcionar em windows. Além de não ser free para projetos comerciais.
Quando se fala em recursos multimedia no final você acaba dependendo de hardware e não tem jeito de usar multiplataforma(de certa forma). O framework qt possui o phonon como o viny falou e vai rodar em win, mac e linux.

Acho ele a melhor opção no seu caso usando c++ mesmo.

http://doc.qt.nokia.com/4.7-snapshot/phonon-module.html[/quote]

*&#@$¨@#$ mas q saco. Já tinha até baixado o framework VLCJ. Tem certeza que foi descontinuado? Onde você viu essa informação? Entre usar uma API descontinuada JMF e vlcj acho que iria preferir usar vlcj. Mas o melhor mesmo é usar algo novo com suporte e bom. Vi lá no site que o vlcj usa JNA. Estou tentando não ter que aprender C++ agora e sim mais tarde.

Você pode tentar ver se isso aqui te atende:
http://code.google.com/p/javacv/

Embora, lembra daquele papo que o pessoal vive papagaiando por aqui de “programador não pode ser apegado a linguagem, tem que usar a ferramenta certa em cada situação”?
Bem, java nesse caso não é a ferramenta certa. Não é à toa que para processar vídeo e fazer games, tudo leva ao C++.

Lembro sim desse papo. Eu queria mesmo aproveitar o meu aprendizado e estudos em java para praticar em java e não outra linguagem entende? Mas se não tiver jeito, fazer o que, aprender outra linguagem vai ser o caminho. Agora eu fiquei com um pé atrás se o vlcj está realmente descontinuado. Veja nessa página:
http://caprica.github.com/vlcj/

Veja os NEWS:

News

27/05/2012 New pre-release snapshot version 2.2.0 integrates the new native log exposed by libvlc 2.1.x (available in vlc git).

20/05/2012 Released version 2.1.0, for use with libvlc 2.0.

28/01/2012 Moved to github.


São recentes. Não parece ter sido descontinuado. Se não foi vou tentar usá-lo. Caso foi. Vou recorrer ao C++ mesmo como vocês sugeriram. E esse JavaCV poderia explicar um pouco melhor para mim para que é e para que serve? E também você consegue explicar o termo “bindings” que eu acredito ser um termo técnico que eu não achei explicação. Traduzindo sei que fica ligação. Obrigado pela ajuda até agora.

Binding tem vários significados, mesmo em informática. Mas geralmente é um componente que associa uma coisa a outra.
No caso do contexto que estamos usando aqui, é um componente que associa a VM a um código nativo qualquer, ou seja, seus componentes JNI.

Não confundir com os bindings do Netbeans, que associam a interface gráfica ao banco de dados para fazer RAD.

Se você só quer estudar, use a API descontinuada mesmo.

A javacv, como o site diz, é uma API para java fornecendo integração para as bibliotecas OpenCV, FFmpeg, libdc1394, PGR FlyCapture, OpenKinect, videoInput, e ARToolKitPlus.
Praticamente tudo o que tem por aí de processamento de imagens.

Voltando a falar do QT, dê uma olhada:
http://labs.qt.nokia.com/2012/02/29/pimp-my-video-shader-effects-and-multimedia/

[quote]
Voltando a falar do QT, dê uma olhada:
http://labs.qt.nokia.com/2012/02/29/pimp-my-video-shader-effects-and-multimedia/[/quote]

Obrigado pela explicação. Mas você acha que a vlcj foi realmente descontinuada? Pelo site que te passei? Vou dar uma olhada no video que me passou depois, porque agora não vai dar. Talvez olhando o poder do QT eu fique com vontade de tentar aprender C++ depois para algo mais profissional. Quero saber se você acha ou tem certeza se a api vlcj foi realmente descontinuada. Agradeço a ajuda de vocês mas temos que averiguar as informações as vezes. Uma vez vi um tópico aqui que o professor do cara falou que o Eclipse tinha sido descontinuado. :shock: