Minha busca de oito anos para digitalizar 45 fitas de vídeo. Parte 2

A primeira parte descreve uma difícil busca para digitalizar vídeos antigos de família e dividi-los em cenas separadas . Depois de processar todos os clipes, eu queria tornar sua visualização online tão conveniente quanto no YouTube. Como essas são memórias pessoais da família, não podem ser postadas no próprio YouTube. Precisamos de uma hospedagem mais privada que seja conveniente e segura.



Etapa 3. Publicação



ClipBucket, um clone de código aberto do YouTube que pode ser instalado em seu próprio servidor



Minha primeira tentativa foi o ClipBucket , que se autodenomina um clone de código aberto do YouTube que você pode instalar em seu servidor.







Surpreendentemente, ClipBucket não tem instruções de instalação. Graças a uma terceira tutorial partido, I automatizado o processo de instalação usando Ansible , uma ferramenta de gerenciamento de configuração do servidor.



Parte da dificuldade era que os scripts de instalação do ClipBucket estavam completamente corrompidos. Naquela época, eu trabalhava no Google e sob os termos do contrato não tinha o direito de contribuir com o clone de código aberto do YouTube, mas postei um relatório de bug do qual era fácil fazer as correções necessárias. Meses se passaram e eles ainda não entendiam qual era o problema. Em vez disso, eles adicionaram mais e mais bugs a cada versão.



O ClipBucket trabalhou em um modelo de consultoria - eles lançaram seu código gratuitamente e cobraram uma taxa para ajudar na implantação. Aos poucos, percebi que uma empresa que ganha dinheiro com suporte pago provavelmente não está muito interessada em que os clientes instalem o produto eles mesmos.



MediaGoblin, uma alternativa mais moderna



Após meses de frustração com o ClipBucket, analisei as opções disponíveis e encontrei o MediaGoblin .





O MediaGoblin  é uma plataforma independente de compartilhamento de mídia



. O MediaGoblin tem muitas vantagens. Ao contrário do ClipBucket em PHP desagradável, MediaGoblin é escrito em Python, que é a linguagem na qual tenho muita experiência em codificação. uma interface de linha de comando que facilita a automação dos downloads de vídeo. Mais importante ainda, o MediaGoblin vem em uma imagem Docker que elimina quaisquer problemas de instalação.



Docker é uma tecnologia que cria um ambiente independente para um aplicativo executado em qualquer lugar. Eu uso o Docker em muitos dos meus projetos .


Dificuldade incrível de re-dockerizing MediaGoblin



Presumi que implantar a imagem docker MediaGoblin seria trivial. Bem, não foi bem assim que funcionou.



A imagem final não tinha duas funções necessárias:



  • Autenticação
    • O MediaGoblin cria um portal de mídia público por padrão e eu precisava de uma maneira de restringir o acesso não autorizado.
  • Transcodificação


Bem, não há problema. A imagem do Docker é de código aberto , portanto, você mesmo pode reconstruí-la .



Infelizmente, a imagem Docker não é mais construída a partir do repositório atual do MediaGoblin . Tentei sincronizá-lo com a versão da última compilação bem-sucedida, mas também não funcionou. Embora eu tenha usado exatamente o mesmo código, as dependências externas do MediaGoblin mudaram, quebrando a compilação. Depois de dezenas de horas, executei o processo de construção de 10-15 minutos do MediaGoblin repetidamente até que finalmente funcionou.



Alguns meses depois, aconteceu a mesma coisa. No total, nos últimos dois anos, a cadeia de dependências do MediaGoblin quebrou minha construção várias vezes, e a última vez que isso aconteceu foi quando eu estava escrevendo este artigo. Acabei publicando meu próprio fork do MediaGoblin, com dependências codificadas e versões de biblioteca explícitas. Em outras palavras, em vez de alegar duvidosamente que o MediaGoblin funciona com qualquer versão do aipo > = 3.0, instalei uma dependência específica do aipo 4.2.1 porque testei o MediaGoblin com essa versão. Parece que o produto precisa de um mecanismo de construção reproduzível , mas ainda não fiz isso.



De qualquer forma, depois de muitas horas de luta, finalmente consegui construir e configurar o MediaGoblin em uma imagem Docker. Lá já era fácil pular a transcodificação desnecessária e colocar o Nginx para autenticação .



Etapa 4. Hospedagem



Como o MediaGoblin estava executando o Docker em minha máquina local, a próxima etapa foi implantar em um servidor em nuvem para que a família pudesse assistir ao vídeo.



MediaGoblin e problema de armazenamento de vídeo



Existem muitas plataformas que pegam uma imagem Docker e a hospedam em um URL público. O problema é que além do aplicativo em si, 33 GB de arquivos de vídeo tiveram que ser publicados. Foi possível codificá-los em uma imagem docker, mas acabou sendo complicado e feio. Alterar uma linha de configuração exigiria a reimplantação de 33 GB de dados.



Quando usei o ClipBucket, resolvi o problema com o gcsfuse  , um utilitário que permite ao sistema operacional fazer upload de diretórios para o Google Cloud como caminhos normais do sistema de arquivos. Publiquei os arquivos de vídeo no Google Cloud e usei gcsfuse para mostrá-los como arquivos locais no ClipBucket.



A diferença era que o ClipBucket era executado em uma VM real, enquanto o MediaGoblin era executado em um contêiner do Docker. Aqui, montar arquivos de armazenamento em nuvem acabou sendo muito mais difícil. Passei dezenas de horas resolvendo todos os problemas e escrevi um post inteiro sobre isso .





A integração inicial do MediaGoblin com o armazenamento do Google Cloud, de que falei em 2018.



Depois de várias semanas ajustando todos os componentes, tudo funcionou. Sem fazer nenhuma alteração no código do MediaGoblin, eu o forço enganosamente a ler e gravar arquivos de mídia no armazenamento em nuvem do Google.



O único problema é que o MediaGoblin ficou obscenamente lento. Demorou 20 segundos para carregar miniaturas de vídeo na página inicial. Se você pular para frente enquanto assiste a um vídeo, o MediaGoblin fará uma pausa infinita de 10 segundos antes de retomar a reprodução.



O principal problema era que os vídeos e as fotos chegavam ao usuário de uma maneira longa e indireta. Eles tiveram que ir do armazenamento em nuvem do Google por meio do gcsfuse para o MediaGoblin, Nginx - e só então eles entraram no navegador do usuário. O principal gargalo era o gcsfuse, que não é otimizado para desempenho rápido. Os desenvolvedores alertam sobre grandes atrasos no trabalho do utilitário diretamente na página principal do projeto:





Avisos de desempenho na documentação do gcsfuse



Idealmente, o navegador deve buscar arquivos diretamente do Google Cloud, ignorando todas as camadas intermediárias. Como posso fazer isso sem mergulhar na base de código MediaGoblin e adicionar uma lógica de integração complexa do Google Cloud?



Nginx sub_filter truque



Felizmente, encontrei uma solução simples, embora um pouco feia. Eu adicionei o seguinte filtro à configuração default.conf no Nginx :



sub_filter "/mgoblin_media/media_entries/" "https://storage.googleapis.com/MY-GCS-BUCKET/media_entries/";
sub_filter_once off;


Na minha instalação, o Nginx funcionou como um proxy entre o MediaGoblin e o usuário final. A diretiva acima diz ao Nginx para pesquisar e substituir todas as respostas HTML do MediaGoblin antes de passá-las para o usuário final. Nginx substitui todos os caminhos relativos aos arquivos de mídia MediaGoblin por URLs do Google Cloud Storage.



Por exemplo, MediaGoblin gera HTML como este:



<video width="720" height="480" controls autoplay>
  <source
    src="/mgoblin_media/media_entries/16/Michael-riding-a-bike.mp4"
    type="video/mp4">
</video>


Nginx muda a resposta:



<video width="720" height="480" controls autoplay>
  <source
    src="https://storage.googleapis.com/MY-GCS-BUCKET/media_entries/16/Michael-riding-a-bike.mp4"
    type="video/mp4">
</video>


Agora tudo está funcionando como esperado: o





Nginx reescreve as respostas do MediaGoblin para que os clientes possam solicitar arquivos de mídia diretamente do armazenamento em nuvem do Google.



A melhor parte da minha solução é que ela não exige nenhuma alteração no código do MediaGoblin. A diretiva de duas linhas do Nginx integra perfeitamente o MediaGoblin e o Google Cloud, embora esses serviços não saibam absolutamente nada um sobre o outro.



Observação : esta solução requer que os arquivos no Google Cloud Storage possam ser lidos por todos. Para mitigar o risco de acesso não autorizado, eu uso um nome de intervalo aleatório longo (por exemplo mediagoblin-39dpduhfz1wstbprmyk5ak29) e verifico se a política de controle de acesso do intervalo não permite que usuários não autorizados exibam o conteúdo do diretório.


Produto final



Nesse ponto, eu tinha uma solução completa e funcional. O MediaGoblin rodou alegremente em seu próprio contêiner na plataforma de nuvem do Google, então não precisava ser corrigido ou atualizado com frequência. Tudo em meu processo era automatizado e reproduzível, permitindo edições ou reversões fáceis.



Minha família adorou como foi fácil assistir ao vídeo. Com o hack do Nginx acima, o processamento de vídeo agora é tão rápido quanto o YouTube.



A tela de visualização é semelhante a esta:





Conteúdo do diretório de vídeos da família pela



etiqueta em destaque Clicar na miniatura exibe a seguinte tela:





Visualizando um único clipe no servidor de mídia



Após muitos anos de trabalho, fiquei extremamente satisfeito em dar aos meus parentes a oportunidade de assistir aos nossos vídeos na mesma interface amigável do YouTube, como eu queria originalmente.



Bônus: redução de custo para menos de $ 1 por mês



Você não assiste a vídeos caseiros com frequência, apenas a cada poucos meses. Minha família gerava coletivamente cerca de 20 horas de tráfego em um ano, mas o servidor funcionava 24 horas por dia. Paguei $ 15 mensais por um servidor que ficava inoperante 99,7% do tempo.



No final de 2018, o Google lançou o produto Cloud Run . O recurso matador foi o lançamento de contêineres Docker tão rapidamente que o aplicativo poderia responder às solicitações HTTP. Ou seja, o servidor poderia permanecer em modo de espera - e iniciar apenas quando alguém quisesse acessá-lo. Para aplicativos lançados com pouca frequência como o meu, os custos caíram de US $ 15 por mês para alguns centavos por ano.



Por motivos que não consigo mais me lembrar, o Cloud Run não funcionou com minha imagem MediaGoblin. Mas com o advento do Cloud Run, lembrei-me que Herokuoferece um serviço semelhante gratuitamente e suas ferramentas são muito mais convenientes que as do Google.



Com um servidor de aplicativos gratuito, sua única despesa é o armazenamento de dados. O armazenamento regional padrão do Google custa 2,3 centavos / GB. O arquivo de vídeo tem 33 GB, então eu pago apenas 77 centavos por mês.





O custo desta solução é de apenas $ 0,77 por mês



Dicas para quem procura experimentar



Obviamente, o processo demorou muito para mim. Mas espero que este artigo ajude você a economizar 80-90% de seus esforços para digitalizar e publicar vídeos caseiros. Em uma seção separada, você pode encontrar um guia passo a passo detalhado de todo o processo, mas aqui estão algumas dicas gerais:



  • Salve o máximo de metadados possível durante a fase de digitalização e edição.
    • .
    • , .
    • , .
  • .
    • .
    • EverPresent ( , ).
  • , HDD.
  • - , .
    • , , . .
    • (, , ), , .
    • . , .
      • ?
      • ?
      • ?
  • .
    • , .
    • “best of” , .
  • , .
    • , . .
    • , . , .
  • .
    • , , .
    • , , .
  • .
  • .
    •  — .
    •  — . , Slow Snow The National, .



All Articles