sábado, 12 de setembro de 2015

Transmitir conteúdo para TV por wifi - NetWorkMedia NWM - DLNA

Bom pessoal,

Resolvi escrever este post por alguns motivos:
Vi que muita gente tem o mesmo problema que eu e nenhuma das soluções que procurei na internet não foram satisfatórias.
Tive alguns problemas que outras pessoas não tiveram, ou tiveram e não postaram.
Tentei por 3 dias assitir o primeiro capitulo de Mr Robot e não conseguia.
Queria ter internet e assistir  filmes e videos ao mesmo.
Não queria ter que ligar cabos (hdmi) no pc/notebook e  TV.
Queria começar a assistir Mr Robot.

Informação básica: Estou partindo do principio que você já saiba configurar sua TV e sua rede. Se não sabe fazer isso, procure no Google como fazer e por favor não poste no comentários coisas do tipo: Tenho uma LG Modelo  XyZ pica das galaxias como faço para configurar? Sério, eu não vou responder! Isso depende de cada modelo, então estou mantendo o artigo o mais genérico possível.

Não, não vou colocar Screenshots!

Começando:

Problema: Miracast e Widi não funcionam: Bom, eu tentei por alguns dias fazer essas tecnologias funcionarem sem sucesso. Cada uma tem uma particularidade diferente, requisitos de hardware e blabla que me fizeram desistir.

Então, optei pela tecnologia  DLNA (http://www.techtudo.com.br/dicas-e-tutoriais/noticia/2014/07/como-transmitir-conteudo-do-computador-pela-tv-wi-fi.html) que como vocês podem ver no link é bem simples e fácil se configurar. Porém, esbarrei em alguns algumas coisas:

Meu roteador wifi está localizado no quarto e a TV na sala, os prédios aqui na Polônia, os mais antigos, as paredes são bem grossas, mesmo a distancia sendo pequena o sinal  não é muito muito bom para transmissão de vídeo em Full HD por exemplo.  Mas antes de descobrir isso, segui os passos do link acima, e constantemente  em partes aleatórias do filme a conexão era interrompida, além disso, usando o Streaming microsoft as legendas não são carregadas, mesmo que possuam o mesmo nome do arquivo, como de costume.
Procurei então outros softwares que desempenhassem a mesma função e acabei encontrando o PS Media Server http://www.ps3mediaserver.org/, ele tem muita opções de codecs e as legendas são carregadas! \o/.
Porém, durante a exibição, por varias vezes o filme ficando coma mensagem de loading, logo fui investigar  a causa e descobri que o software faz encoding on-the-fly do conteúdo que é  enviado para TV e isso requer bastante processamento e memoria.

Procurei uma forma  de utilizar encodes mais leves inicialmente, sem sucesso nas opções fornecidas pelo software, então resolvi desabilitar completamente o encoding, BINGO!
A tela de loading parou de aparecer durante o filme(demora um pouco pra carregar em alguns casos), porém, a rede voltou a cair durante a exibição.


Conclusão: Minha rede Wifi não está  suportando a transmissão de vídeo e meu acesso a internet simultaneamente. Lembre-se, no meu caso eu tenho paredes grossas entre o quarto e a sala, pode ser que pra você isso não seja um problema.
Solução:  Criei uma rede separada somente para videos/musicas e afins em casa na qual chamei de NetWorkMedia (NWM). Qual a vantagem?

Você tem sua internet independente.
Sua TV e equipamentos não tem acesso a internet diretamente,  assim fica menos provável alguém explorar alguma vulnerabilidade nos equipamentos.
Você pode conectar seu amigos na sua NWM sem ter passar a senha da sua rede Wifi pessoal. Eles podem usar notebook e celulares para enviar videos e musicas aos seus equipamentos.
Você tem uma rede dedicada para transmissão de videos e musica sem interferir na sua Wifi Pessoal.
Você pode usar seu computador  como ponte  de acesso a internet, ou seja, seus  equipamentos não ficam ligados diretamente na internet quando você não está em casa por exemplo e o melhor de tudo, SEM FIOS, sem cabos HDMI espalhados pela casa.
O notebook/pc não precisa ficar perto da televisão pois o cabo é pequeno e por ai vai.

Problema: Sua tv não tem acesso  direto a internet:
Solução: Como disse anteriormente você pode usar um computador qualquer  para fazer esta “ponte” entre seus equipamentos e a internet.

Para as minhas necessidades eu fiz a configuração para acesso a radio www.di.fm e  para transmissão de videos do youtube.  No caso do youtube você pode pode fazer de duas maneiras:

1- Baixar o vídeo e fazer a transmissão off-line.
2- Usar um plugin para o PMS que faz a transmissão on-the-fly do conteúdo.

Então até este momento temos:
Uma rede  de 300 megas  wifi para  videos/musicas e afins. Pelos meus cálculos uma taxa de transferência de cerca de 60 megas  é suficiente para assistir filmes em Full HD e 4K sem problemas.
Isolada da internet  ou não. ( Depende de como você vai querer usar)
Acesso rápido é fácil para visitantes.
Baixo custo ( no meu caso)  aushuashuasha
0 Cabos!!!!!! Eu realmente odeio cabos!

Vamos as configurações: (Receita de bolo) 
Rede:
Rede Pessoal:
1 roteador/AP  802.11n
Acesso a internet
1 placa wifi 802.11n do notebook ou PC – Pode ser uma Ethernet. 100/1000

Configuração:
Roteador IP: 192.168.0.1
Notebook IP(wifi pessoal): 192.168.0.100 => Recomendo que o IP seja fixo para facilitar as coisas.
Mascara de rede: 255.255.255.0
Default Gateway: 192.168.0.1
DNS: 8.8.8.8  e 8.8.4.4 => DNS do google, use o que achar melhor.

NetWorkMedia(NWM)
1 Roteador 802.11n - Sem internet
1 Dongle USB Wifi 802.11n
1 Smart TV com Wifi ou Ethernet (Lógico!)

Configuração
Roteador: 192.168.1.1 -> ATENÇÃO! O IP/REDE precisa obrigatoriamente  ser diferente da rede pessoal!!!!
NoteBook IP(NWM – dongle usb): 192.168.1.100 -> Mesma recomendação
Mascara de Rede: 255.255.255.0
Default Gateway: 192.168.1.1
DNS -> Não é necessário, não temos internet aqui.
Smar TV -> Você deixar sua Smart TV fazer as configurações sozinhas  ou configura-la na mesma faixa de ip da NWM, por exemplo 192.168.1.101.

Bata tudo no liquidificador e leve ao forno por 2 horas. Uahsuahsuahushas


Softwares e versões:

Para TV: Verifique se a TV tem suporte DLNA, se não tiver compre uma! Aushausuahs

Para o notebook:  PS Media Server 1.90.1 - http://www.ps3mediaserver.org/
Plugin: PMSEncoder 2.0.0 -  https://github.com/chocolateboy/pmsencoder
youtube-dl  - https://yt-dl.org/downloads/2015.09.09/youtube-dl.exe
RTMP Dump 2.4  -> Não vamos utilizar neste artigo, mas é bom você baixar.

Faça a instalação PMS
Faça a o download do psmenconder (JAR) e o coloque dentro do diretório plugins criado na instalação do PMS.

Após este processo, crie o arquivo WEB.conf em  C:\ProgramData\PMS\
Este arquivo contem a configuração para as minhas rádio favorita e um link para um vídeo do youtube. Você deve seguir exatamente o mesmo modelo para adicionar novos videos. Neste link você tem mais detalhes: https://code.google.com/p/ps3mediaserver/issues/attachmentText?id=294&aid=5613783387044830644&name=web.conf&token=51e35537a9ee8f2b0e265857c2c91ccf

Segue o meu WEB.conf

# audio streams
audiostream.Web,Radio=DiFM-Goa-Psy Trance,http://pub6.di.fm:80/di_goapsy_aac?b9ee7b9f36ecd5124c92c723
audiostream.Web,Radio=DiFM-Vocal Trance,http://pub7.di.fm:80/di_vocaltrance_aac?b9ee7b9f36ecd5124c92c723
audiostream.Web,Radio=DiFM-Progressive Psy,http://pub4.di.fm:80/di_progressivepsy_aac?b9ee7b9f36ecd5124c92c723
audiostream.Web,Radio=DiFM-Lounge,http://pub5.di.fm:80/di_lounge_aac?b9ee7b9f36ecd5124c92c723
audiostream.Web,Radio=DiFM-Hard Dance,http://pub8.di.fm:80/di_harddance_aac?b9ee7b9f36ecd5124c92c723
audiostream.Web,Radio=DiFM-Hard Techno,http://pub8.di.fm:80/di_hardtechno_aac?b9ee7b9f36ecd5124c92c723
audiostream.Web,Radio=DiFM-House,http://pub7.di.fm:80/di_house_aac?b9ee7b9f36ecd5124c92c723
audiostream.Web,Radio=DiFM-Epic Trance,http://pub6.di.fm:80/di_epictrance_aac?b9ee7b9f36ecd5124c92c723
audiostream.Web,Radio=DiFM-Electro House,http://pub7.di.fm:80/di_electrohouse_aac?b9ee7b9f36ecd5124c92c723
audiostream.Web,Radio=DiFM-Drumstep,http://pub8.di.fm:80/di_drumstep_aac?b9ee7b9f36ecd5124c92c723
audiostream.Web,Radio=DiFM-Dark PsyTrance,http://pub6.di.fm:80/di_darkpsytrance_aac?b9ee7b9f36ecd5124c92c723
audiostream.Web,Radio=DiFM-Classic Trance,http://pub4.di.fm:80/di_classictrance_aac?b9ee7b9f36ecd5124c92c723
audiostream.Web,Radio=DiFM-Classic Vocal Trance,http://pub7.di.fm:80/di_classicvocaltrance_aac?b9ee7b9f36ecd5124c92c723
audiostream.Web,Radio=DiFM-Chillout Dreams,http://pub5.di.fm:80/di_chilloutdreams_aac?b9ee7b9f36ecd5124c92c723
audiostream.Web,Radio=DiFM-Chillout,http://pub8.di.fm:80/di_chillout_aac?b9ee7b9f36ecd5124c92c723
audiostream.Web,Radio=DiFM-Chill & Tropical House,http://pub6.di.fm:80/di_chillntropicalhouse_aac?b9ee7b9f36ecd5124c92c723

# youtube
videostream.Web,Youtube,https://www.youtube.com/watch?v=YqeW9_5kURI,https://www.youtube.com/watch?v=YqeW9_5kURI


Depois deste passo, você precisa  adicionar essas linhas no arquivo PMS.conf  que fica no mesmo diretório do WEB.conf:

youtube-dl.path = C:\\ProgramData\\PMS\\youtube-dl.exe
pmsencoder.script.directory = C:\\ProgramData\\PMS\\scripts

Obs: Sim, são duas barras, eu não digitei errado!

Agora, faça o download do youtube-dl e o coloque em C:\ProgramData\PMS\

Crie o diretório scripts  dentro de C:\ProgramData\PMS\ e dentro dele crie o arquivo youtube.groovy com o seguinte conteúdo:

script {
    profile ('YouTube-DL') {
        pattern {
            match { YOUTUBE_DL_PATH }
            protocol([ 'http', 'https' ])
            match { isYouTubeDLCompatible(YOUTUBE_DL_PATH, uri) }
        }

        action {
           // if (YOUTUBE_DL_MAX_QUALITY) {
            //    downloader = YOUTUBE_DL_PATH + [ '--max-quality', YOUTUBE_DL_MAX_QUALITY, '--quiet', '-o', 'DOWNLOADER_OUT', 'URI' ]
            //} else {
                downloader = YOUTUBE_DL_PATH + [ '--quiet', '-o', 'DOWNLOADER_OUT', 'URI' ]
            //}
        }
    }

    // fall back to the native handler if youtube-dl is not installed/enabled
    profile ('YouTube') {
        pattern {
            // extract the resource's video_id from the URI of the standard YouTube page
            match uri: '^https?://(?:\\w+\\.)?youtube(-nocookie)?\\.com/watch\\?v=(?<youtube_video_id>[^&]+)'
        }

        // Now, with $video_id defined, call the builtin YouTube handler.
        // Note: the parentheses are required for a no-arg method call
        action {
            youtube()
        }
    }
}
Note que algumas linhas da função action foram comentada. Fiz isso pois o youtube-dl não tem mais suporte  ao parâmetro --max-quality. Segue o link para o arquivo original: https://github.com/chocolateboy/pmsencoder/blob/master/src/main/resources/scripts/youtube.groovy

Agora vamos configurar  o PS3 Media Service:

Inicie o PMS
Vá até a aba Configuração Geral:
Na opção: Forçar IP do servidor, coloque o IP que foi escolhido para o dongle wifi da NWM, no meu caso 192.168.1.100.

Na opção Largura de Banda Máxima  em Mb/s,  eu  deixei como 0, sem limite, como esta é uma rede dedicada para isso, não faz sentido por limitações.

Marque a opção prevenir modo de suspensão enquanto faz stream.

Verifique se em Sistema de plugins o  PMSEncoder apareceu. Caso não tenha aparecido, você fez algo errado, reveja a instalação do começo.   
Na aba Navegação / Definições de Partilha

Demarque a opção Esconder Pasta  #Transcode#
Este diretório é criado automaticamente pelo PSM, como o PSM tem vários plugin para exibição de videos, ele  tenta criar uma transmissão para cada tipo de encoding (jogada genial do devel) então caso o seu vídeo não seja suportado pelo encoder default, você pode entrar nesta pasta e tentar reproduzir seu  vídeo/musica usando outros encoders.
Em Pastas partilhadas, coloque o diretório onde estão seus filmes e blabla.
Na aba Definições de transcoding:
Clique em Definições comuns de transcoding

Na opção: Saltar transcode para as seguintes extensões -> Coloque as extensões que na qual você não queira que o PSM  use encoder para envio, como disse no inicio ele faz isso on-the-fly, e como agora nos temos uma rede bem rápida não há necessidade disso, no meu caso as extesões que coloquei foram: mkv,avi
Trick: Em alguns casos algumas TV dizem não ter suporte a mkv ou Avi, neste caso tente apenas alterar a extensão entre estes dois tipos.

Na opção: Motores de ficheiro de vídeo ->  No meu caso coloquei como Padrão o VLC Vídeo ( caso você não tenha o VLC atualizado, atualize!). O VLC é capaz de reproduzir uma grande variedade de tipos de encodes, portanto, desabilitei os demais. Porém, caso o vlc não execute algum conteúdo, basta habilitar os outros e testar. Para  coloca-lo como padrão, use as setas no canto inferior esquerdo, a tomada habilita ou desabilita o player.

Motores de Streaming  de vídeo WEB.
Selecione PMSEncoder  como Default, e desabilite os outros, mesmo eles como padrão o PSM tentar executa-lo com o VLC e não funciona. Ou você pode deixar habilitado e ir no diretório #Transcode#  ja mencionado e encontrar o arquivo referente a reprodução(ID do youtube + [nome do encoder]) usando o PSMEncode, não acho uma boa ideia caso você tenha uma lista de videos grande, pois neste diretório  ficam todas as reproduções  para todos os encoders, então quando acabar um vídeo ele automaticamente passa para o próximo e toda vez que ele não consegue reproduzir, aparece uma pergunta se deseja ir para o próximo. Logo, se você quer reproduzir muito videos do youtube, desabilite os outros encoders, assim você não terá essa interrupção pois apenas a reprodução para o PMSEncoder será criada.

Motores de streaming  de áudio WEB.
Para que a Difm funcione, deixe como padrão FFmpeg Web Áudio e desabilite o VLC.

UPDATE:
Acabei de testar com arquivos mp4 e mesmo configurando para que não haja enconding para estar extensão,  o infeliz do PSM insiste em fazer isso, ou seja, problemas com travamento.
Solução: Apenas renomeie de .mp4 para ,avi, assim o encoding não será executado.

Pronto! Clique em Guardar no topo do tela e clique em Reiniciar Servidor.
Agora na na sua TV e seja feliz!
Obs: Quando o programa é fechado, algumas dessas configurações podem se perder ou eu fiz alguma merda, então confira tudo quando for usar o PSM novamente.

Segurança:
Utilize uma senha forte tanto na Rede particular  quanto na NWM. Por mais que a NWM esteja fora da internet, alguém pode entrar caso você utilize uma senha fraca.
Recomendações:
Use WP2+AES em ambas as redes.
Desabilite o WPS em ambas as redes.
Deixe o  pc/notebook com firewall habilitado, libere apenas a porta usada pelo PSM (5001)
Na sua rede particular crie um filtro de MAC no roteador e cadastre somente os dispositivos que você conhece.


Conclusão:
Já assisti todas os episódios disponíveis de Mr. Robot.
Não tenho mais problemas com loading e encoding.
Quando desligo ou desconecto meu notebook, a NWM fica isolada da internet.
Não tenho milhões de cabos  ligados na TV.
Foi chato e demorado pra caralho fazer isso, devidor a falta ou a má documentação, mas ao mesmo tempo bem gratificante ver tudo funcionando no final.

Próximos desafios para melhorar a NWM:
Integração com Popcorntime.
Streaming da área de trabalho.
Ligação da TV com a HomeTheather sem cabos. Não fiz porque não comprei o HomeTheater ainda! Uahsaushauhsa
Tem alguma sugestão? Call me! @crashbrz ou #dclabs @ freenode