Transmita seus vídeos no YouTube 24 horas por dia

Recentemente, como hobby, estou filmando palestras de um psicólogo familiar em vídeo. Montei e publico as imagens no meu site. Há um mês, tive a ideia de organizar uma transmissão ininterrupta dessas palestras no YouTube 24/7. Uma espécie de "canal" temático dedicado ao crescimento pessoal.

Como fazer uma transmissão normal, eu sei. Mas como fazer uma transmissão de arquivos de vídeo? Que ela andava 24/7, era flexível, o mais autônoma possível e, ao mesmo tempo, não dependia do meu computador doméstico. Era isso que eu tinha que descobrir.



Demorou vários dias para encontrar uma solução. Estudei muitos fóruns e vários manuais sem os quais minha transmissão simplesmente não teria terminado. E agora, quando a brincadeira é um sucesso, sinto a necessidade de compartilhar minha decisão. Então este artigo apareceu.

Em resumo, a solução final foi a seguinte: VPS + ffmeg + bash script . Abaixo, descrevo os passos dados e falo sobre as "armadilhas" que foram descobertas durante a transmissão.

Etapa 1 - de onde será a transmissão?


No início, era necessário determinar onde a transmissão será conduzida, onde será sua fonte. A primeira coisa que veio à mente foi de um computador doméstico . Colete vídeos em uma lista de reprodução e reproduza-os em qualquer player de vídeo. Em seguida, capture a imagem da tela e transmita-a para o YouTube. Mas quase imediatamente rejeitei esta opção. Para implementá-lo, é necessário manter o computador doméstico constantemente, e esse é o ruído dos refrigeradores, mesmo à noite, e o aumento do consumo de energia (+ 100-150 kWh por mês). E acontece que você não poderá usar o computador doméstico durante a transmissão. qualquer movimento do mouse será visível na transmissão.

Então comecei a olhar para os serviços em nuvem. Eu estava procurando por um serviço pronto para fazer o upload de seus vídeos ou, por exemplo, inserir links para vídeos do YouTube e tudo seria compactado em uma transmissão contínua. Mas não encontrei nada adequado. Talvez eu estivesse parecendo mal. A única coisa ± adequada para a funcionalidade é restream.io, um serviço que ajuda a transmitir simultaneamente em várias plataformas. Eles parecem capazes de enviar seus vídeos. Mas esse serviço foi criado para propósitos completamente diferentes e eles esperam que a transmissão dure apenas algumas horas. Penso que se através desse serviço fosse possível organizar uma transmissão 24 horas por dia, isso teria disparado em dezenas, ou até centenas de dólares por mês. Mas eu ainda queria organizar a transmissão gratuitamente ou com um investimento financeiro mínimo.

Ficou claro que você precisa transmitirum dispositivo separado ou mesmo um computador separado. Pensando em algo como o Raspberri Pi. E o que? Ele não tem mais frio. Gravei o vídeo em uma unidade flash USB, prendi um cabo Ethernet e o deixei em algum lugar isolado, transmitindo. Opção. Mas como eu não tinha o conselho nem a experiência com ele, também recusei essa opção.

No final, me deparei com uma discussão em que eles discutiram a criação de seu próprio servidortransmissões. Não era exatamente isso que eu estava procurando, mas peguei a idéia principal - você pode usar o servidor! Nessa discussão, eles sugeriram o uso de vários VPS + nginx + OBS. Tornou-se claro que esse bando poderia me atender. A única coisa que me confundiu foi que eu nunca administrei o servidor e me pareceu que meu servidor dedicado estava confuso e caro. Decidi descobrir quanto custaria alugar um servidor na configuração mínima e fiquei agradavelmente surpreendido.

imagem

Os preços estão em rublos bielorrussos e são apenas migalhas. Para entender, 8 rublos bielorrussos estão em torno de 3,5 dólares ou 240 rublos russos. Por um mês, usando um computador completo, ligado 24 horas por dia, 7 dias por semana e com acesso rápido à Internet. Por alguma razão, essa descoberta foi muito feliz para mim e, por vários dias, andei muito satisfeito como uma criança que descobriu foguetes espaciais :)

A propósito, aproveitei a oferta do primeiro site que o Google me deu a pedido de "aluguel VPS". Talvez haja ainda mais soluções orçamentárias, mas esse preço me convinha e eu não procurei mais.

Ao criar um servidor, você pode selecionar o sistema operacional no qual ele irá operar. Em qualquer um dos sistemas listados, você pode organizar a transmissão e fazer uma escolha com base em suas preferências e recursos financeiros (eles solicitam uma taxa adicional por um servidor com Windows). Eu escolhi o CentOS. Só porque eu costumava ter um pouco de experiência com ela.

imagem

Etapa 2 - configuração do servidor


A primeira coisa que você precisa depois de criar o servidor é conectar-se a ele via SSH. Inicialmente, usei o PuTTy, mas comecei a usar o Secure Shell App, que é executado no Google Chrome. Então acabou sendo mais conveniente para mim.

Então mudei o nome do host, configurei a sincronização de horário no servidor, atualizei o sistema, mexi com iptables ... e fiz várias coisas, mas não porque era necessário. Foi interessante configurar o servidor e funcionou para mim. Adoro quando acontece :)

Mas essas etapas precisam ser feitas:

  1. Conecte o repositório EPEL.
  2. Levante servidor FTP (eu escolhi vsftp).
  3. Instale o ffmpeg.

Não vou dar detalhes da equipe, esta instrução é bastante conceitual para transmitir um plano de ação geral. Se você tiver alguma dificuldade com alguma das etapas, elas são resolvidas rapidamente por uma consulta em um mecanismo de pesquisa como “CentOS connect EPEL” ou “CentOS FTP server installation”. E nos primeiros links, você encontra instruções detalhadas e passo a passo.

Então, como escrevi anteriormente, eu precisava de um monte de VPS + nginx + OBS. Pronto para VPS. Mas aqui nos pontos restantes as questões começaram a surgir. OBS é um programa de transmissão, Open Broadcaster Software. E só funciona com threads, ou seja, por exemplo, pega uma imagem de uma webcam e a transmite. Ou gravação de tela. Ou uma transmissão já em andamento é redirecionada para outro site. E eu não tenho um fluxo, só tenho um conjunto de arquivos de vídeo que preciso para fazer um fluxo.

Ele começou a cavar nessa direção e se deparou com ffmpeg. O FFmpeg é um conjunto de bibliotecas de código aberto gratuitas que permitem gravar, converter e transferir gravações digitais de áudio e vídeo em vários formatos.

E fiquei muito surpreso com o quanto o ffmpeg pode fazer. Se você quiser, ele retirará o som do vídeo. Se você quiser, ele cortará um fragmento do vídeo sem transcodificação. Se desejar, ele será convertido de um formato para outro. E muito, muito mais. Até o ponto em que você pode especificar um arquivo para ele, ele o converterá em um fluxo e o transferirá para o próprio YouTube. Tudo, a corrente está montada. Resta apenas refinar as nuances.

Etapa 3 - configuração da transmissão


Criamos uma transmissão no YouTube. Nesta fase, precisamos apenas de um link e uma chave de tradução. Na captura de tela abaixo, eles são destacados em vermelho.

imagem

Em seguida, carregue os arquivos de vídeo no servidor que planejamos transmitir. Na verdade, o FTP é necessário apenas para este estágio. Se você tiver outra maneira conveniente de enviar arquivos para o servidor, o servidor FTP poderá ficar de fora.

Nós transmitimos para o YouTube. Para começar a transmitir, você deve executar o ffmpeg com vários atributos. Aqui está o comando mais curto que recebi:

ffmpeg -re -i lecture1.mp4 -f flv rtmp://a.rtmp.youtube.com/live2/%_%

Descriptografia de Atributos
-re – , .

-i – , . , , -. , /usr/media/lecture1.mp4.

-f – . , ffmpeg « » mp4 flv.

, YouTube .. , , , .

Se você fez tudo corretamente, depois de executar este comando, o YouTube verá o fluxo transmitido. Para iniciar a transmissão, basta clicar no botão "Iniciar transmissão" no próprio YouTube.

Etapa 4 - adicione autonomia


Parabéns! Agora você sabe como começar a transmitir a partir de um arquivo de vídeo. Mas isso não é suficiente para transmissão contínua. É importante que, após a reprodução do primeiro vídeo, o próximo comece imediatamente e, quando todos os vídeos forem mostrados, a reprodução começará novamente.

Eu vim com a seguinte opção: crie um arquivo .sh no qual registrei um comando para cada arquivo de vídeo e, no final, indiquei um comando para reiniciar o mesmo script. Aconteceu uma espécie de recursão:

 1... (   lecture1.mp4)
 2... (   lecture2.mp4)
 3... (   lecture3.mp4)
bash start.sh

E sim, funcionou. Eu, satisfeito comigo, comecei uma transmissão de teste e fui dormir.

Uma surpresa desagradável me esperava de manhã. Aconteceu que a transmissão durou apenas alguns minutos e terminou quase imediatamente quando eu desliguei o computador. A investigação mostrou que os comandos lançados dessa maneira são executados enquanto o usuário está autorizado no servidor. Assim que eu desconectei, a execução dos comandos iniciados foi interrompida. Para impedir que isso aconteça, basta bashadicionar a equipe antes da equipe nohup. Isso permitirá que o processo em execução seja executado independentemente da sua presença.

A versão mínima final do script é assim:

ffmpeg -re -i lecture1.mp4 -f flv rtmp://a.rtmp.youtube.com/live2/%_%
ffmpeg -re -i lecture2.mp4 -f flv rtmp://a.rtmp.youtube.com/live2/%_%
ffmpeg -re -i lecture3.mp4 -f flv rtmp://a.rtmp.youtube.com/live2/%_%
nohup bash start.sh $

Onde start.sh é o arquivo no qual esse script é gravado. E esse arquivo deve estar localizado no mesmo diretório que os arquivos de vídeo.

Adicionar um cifrão no final permite iniciar o processo em segundo plano, para que você possa continuar usando o console sem interromper a transmissão.

Dos bônus, os seguintes pães resultaram:

  • Você pode alternar manualmente a reprodução de arquivos. Para fazer isso, você precisa "matar" o processo ffmpeg atualmente em execução. Depois disso, a reprodução do próximo arquivo da lista será iniciada automaticamente.
  • Novos vídeos podem ser adicionados à transmissão sem interromper a transmissão. Apenas envie o vídeo para o servidor, adicione o comando para executar este arquivo no script, salve-o. E é isso. Na próxima rodada de reprodução, o novo arquivo já será transmitido junto com os arquivos antigos.

Etapa 5 - configurar o ffmpeg


Sobre isso, em princípio, alguém poderia parar. Mas eu queria tornar a transmissão um pouco mais amigável para o público.

Suponha que uma pessoa foi à transmissão, começou a assistir, gostou e quis assistir a essa palestra desde o início, e a transmissão não inclui rebobinar. Para visualizar uma palestra desde o início, uma pessoa precisará ir ao meu site e obter um registro da palestra de seu interesse. E como entender o que a palestra lhe interessa? O site tem 16 palestras e toda semana há apenas mais. Penso que nem eu, que gravei e editei todas essas palestras, poderei determinar qual é a palestra de um fragmento aleatório. Portanto, é necessário que cada palestra seja de alguma forma designada.

A opção de adicionar legendas aos arquivos de vídeo de origem no programa de edição não me agradou. Era necessário ter certeza de que os arquivos originais foram usados. Para apoiar a transmissão exigida de mim o mínimo de movimentos corporais possível.

Descobriu-se que o ffmpeg também pode me ajudar com isso. Ele possui um atributo especial -vfque permite colocar texto em cima do vídeo. Para adicionar texto ao vídeo, você precisa adicionar o seguinte fragmento ao comando:

-vf drawtext="fontfile=OpenSans.ttf:text=' 13\:  .   ?':fontsize=26:fontcolor=white:borderw=1:bordercolor=black:x=40:y=670"

Decodificação de parâmetros
fontfile= – . . . .

text= – , , .

fontsize= – .

fontcolor= – .

borderw= – ( 1 ).

bordercolor= – .

x= y= – . 0;0 . , 1280720 .


Se parece com isso:

imagem

Etapa 6 - determinar a qualidade da transmissão


Tudo, a transmissão está pronta. Transmissões FFmpeg, arquivos reproduzidos, minha presença não é necessária para transmissão. Até todas as palestras são assinadas. Parece que é isso.

Mas outra nuance veio à tona - eu escolhi a configuração mínima do servidor e ela não gerou a transmissão. Configuração do servidor: 1 núcleo (como 2,2 GHz), 1 gigabyte de RAM, SSD de 25 GB. Havia RAM suficiente, mas o processador quase completamente carregou 100% (e às vezes até 102-103% :) Isso levou ao fato de que a transmissão congela uma vez a cada poucos segundos. Feio.

Você pode ter uma configuração mais cara com dois núcleos, o benefício é que, com as tecnologias em nuvem, a configuração do servidor é alterada pressionando alguns botões. Mas eu queria me encaixar no poder da configuração mínima. Comecei a estudar a documentação do ffmpeg e, sim, também existem configurações que permitem ajustar a carga no sistema.

A alta qualidade da imagem pode ser alcançada de duas maneiras: uma alta carga do processador ou um grande tráfego de saída. Acontece que quanto mais o processador suportar a carga, menor será a largura de banda que o canal precisará. Ou você não pode carregar muito o processador, mas precisará de um canal amplo com uma grande margem de tráfego. Se houver restrições no processador e no tamanho do canal / tráfego de saída, será necessário reduzir a qualidade da imagem para que a transmissão ocorra sem problemas.

Meu servidor possui um canal de 10 Mbps. Esta largura é reta com uma margem. Mas há um limite de tráfego - 1 TB por mês. Portanto, para atender às restrições de tráfego, meu fluxo de saída não deve exceder ~ 300 Kb por segundo, ou seja, a taxa de bits do fluxo de saída não deve exceder 2,5 Mbps. A propósito, o YouTube recomenda apenas transmitir em uma taxa de bits.

O Ffmpeg usa abordagens diferentes para regular a carga no sistema. Bem escrito sobre isso aqui . Acabei usando dois atributos: -crfe -preset.

Fator de taxa constante (CRF)- este é um coeficiente devido ao qual você pode ajustar a qualidade da imagem. O CRF pode variar de 0 a 51, onde 0 é a qualidade do arquivo de origem, 51 é a pior qualidade possível. É recomendável usar valores de 17 a 28, o padrão é 23. Com uma proporção de 17, o vídeo será visualmente idêntico ao original, mas tecnicamente não será. A documentação também afirma que o tamanho do vídeo final, dependendo do CRF especificado, muda exponencialmente, ou seja, aumentar o coeficiente em 6 pontos dobrará a taxa de bits do vídeo enviado.

Se você estiver usando o CRF, poderá escolher o "peso" da imagem enviada e, em seguida, usar as predefinições (-preset) para determinar quanto será carregado o processador. Os parâmetros para este atributo têm o seguinte:

  • ultrafast
  • superfast
  • veryfast
  • faster
  • fast
  • medium - valor padrão
  • slow
  • slower
  • veryslow

Quanto mais rápido o parâmetro for especificado, maior será a carga no processador.

Peguei primeiro a predefinição, que era basicamente "difícil" para o meu processador, e depois ajustei a carga com mais precisão usando CRF. No meu caso, a predefinição surgiu faste, para o crf, decidi pelo valor de 24.

Conclusão


Isso é tudo. O comando final para iniciar a transmissão, recebi o seguinte:

ffmpeg -re -i lecture1.mp4 -vf drawtext="fontfile=OpenSans.ttf:text=' 1\:   ':fontsize=26:fontcolor=white:borderw=1:bordercolor=black:x=40:y=670" -c:v libx264 -preset fast -crf 24 -g 3 -f flv rtmp://a.rtmp.youtube.com/live2/%_%

Aqui existem apenas dois momentos não descritos:

1) -c:v libx264- uma indicação de um codec específico para trabalhar com o arquivo de origem.
2) -g 3- uma indicação explícita do número de quadros-chave. Nesse caso, é indicado que cada terceiro quadro deve ser a chave. O valor padrão é 5 ou 8, mas o YouTube jura, pergunta pelo menos 3.

Que qualidade da transmissão acabou aqui ?

A carga do servidor foi a seguinte:

imagem

imagem

Com base nos dados de monitoramento, é claro que a carga do processador varia de 70% a 95% e a transmissão nunca parou em 100% em uma semana. Portanto, com essas configurações, o processador é suficiente.

Ao carregar um disco, posso dizer que ele quase não está carregado e um HDD comum deve ser suficiente para transmitir.

Mas a quantidade de tráfego de saída me incomoda. Acontece que meu fluxo de saída varia de 450 a 650 KB por segundo. Durante um mês, serão cerca de 1,8 terabytes. Pode ser necessário comprar tráfego ou ainda mudar para uma configuração de núcleo duplo porque Eu não gostaria de reduzir a qualidade da imagem.

***

Como resultado, direi que a configuração dessa transmissão do zero leva cerca de uma a duas horas. Além disso, na maioria das vezes é necessário o upload do vídeo para o servidor.

Como ferramenta de marketing, o lançamento de uma transmissão desse tipo não deu resultado. Talvez se você encerrar as visualizações para que os algoritmos do YouTube capturem essa transmissão e a mostrem ativamente nas recomendações, algo funcione. No meu caso, durante 16 dias de transmissão contínua, foi assistida 58 vezes.

Está bem. A transmissão se encaixa harmoniosamente na página principal do meu site. Foi um tipo de oportunidade para se decidir rapidamente sobre o palestrante e as próprias palestras.

E um momento. É importante que a transmissão não viole os direitos autorais de outras pessoas, caso contrário, será bloqueada. Estou calmo para a minha transmissão. Selecionei especialmente inserções musicais com uso gratuito, e o autor do conteúdo fica em um computador vizinho e não é contra mim usar seu conteúdo :)

Mas se você tem um rádio tocando em segundo plano em algum lugar no fundo, ou você usou sua faixa favorita durante a edição ou gravou um vídeo de um videoclipe, série ou filme popular, sua transmissão está em risco. Também é importante que a transmissão carregue pelo menos uma carga semântica mínima, caso contrário, poderá ser bloqueada como spam.

***

Isso é tudo para mim. Espero que este manual sirva bem a alguém. Bem, se você tem algo a acrescentar - escreva, terei prazer em ler adições e esclarecimentos ao artigo.

All Articles