Se você tem vários filmes, programas ou outros arquivos de vídeo locais e não consegue decidir qual assistir, pode fazer com que o Raspberry Pi escolha para você, com o toque de um botão. Para ser justo, existem maneiras mais fáceis de reproduzir um vídeo aleatório, seja de arquivos locais ou da web, mas elas não são tão divertidas quanto este projeto. Então pegue a pipoca e vamos começar a construir e codificar nosso próprio player de vídeo aleatório Raspberry Pi!
Hardware
Construir o circuito para este projeto é simples. Exigimos apenas três botões, conectados ao GPIO nos pinos 2,3,4 e cada um desses botões também precisa ser conectado ao GND, para isso podemos usar um único pino GND no Pi e um jumper fêmea para macho . Conectado ao trilho – de uma placa de ensaio significa que temos várias conexões GND que podem ser conectadas através dos dois fios jumper macho para macho. Consulte o diagrama no download deste projeto para obter mais informações. Quando o hardware for construído, conecte todos os acessórios necessários para o seu Pi e inicialize no desktop Raspbian.
Programas
Como na maioria dos projetos Pi, antes de fazer qualquer outra coisa, você precisará configurar seu Raspberry Pi com uma cópia atual do sistema operacional Raspbian. Se você não quiser usar um teclado e mouse dedicados, poderá criar um Raspberry Pi sem cabeça que você acessa de outro computador via VNC.
Antes de podermos escrever qualquer código Python, precisamos instalar duas bibliotecas que nos ajudarão a criar o projeto. Abra um Terminal e digite o seguinte, lembre-se de pressionar Enter no final de cada linha.
$ sudo pip3 instalar glob $ sudo pip3 instalar teclado
Falaremos mais sobre eles mais tarde. Por enquanto, abra o editor Python 3, encontrado no menu Programação e clique em Arquivo >> Novo para criar um novo arquivo em branco. Imediatamente clique em Arquivo >> Salvar na nova janela. Salve o código como VideoPlayer.py e lembre-se de salvar com frequência!
Então agora começamos a escrever o código, e nosso primeiro ato é importar as bibliotecas que precisamos. As três primeiras bibliotecas são usadas para detectar os pressionamentos de botão (GPIO Zero), impedir que o código seja executado uma vez e saia (pausa) e para escolher um vídeo aleatório (escolha).
from gpiozero import Buttonfrom signal import pausefrom random import choice
As três últimas importações são uma biblioteca que usaremos para listar o conteúdo de um diretório (glob), executar comandos de terminal (subprocesso) e a última é uma biblioteca para emular um teclado (keyboard).
importar teclado subprocesso de importação globi
Seguindo em frente, criamos três funções, blocos de código que podemos reutilizar posteriormente chamando seu nome. A primeira função é chamada “play_video” e primeiro cria uma lista (um objeto de armazenamento de dados) chamada “videos”.
def play_video():videos = []
Para preencher a lista com informações, especificamente uma lista de todos os vídeos que podemos reproduzir, usamos um loop for, que itera sobre cada arquivo em um diretório, desde que seja um arquivo de vídeo mp4. Para isso usamos “glob” para acessar o diretório “/media/pi/Videos” que na verdade é um pendrive chamado “Vídeos” cheio de arquivos mp4. Altere isso para corresponder ao nome do diretório escolhido cheio de vídeos. Toda vez que um mp4 é encontrado, ele é anexado à lista de “vídeos” que acabamos de criar.
para arquivo em glob.glob(“/media/pi/Videos/*.mp4”): videos.append(file)
Então agora vamos verificar se a lista foi preenchida com nomes de arquivos imprimindo o conteúdo da lista no shell do Python.
imprimir (vídeos)
Em seguida, devemos escolher um vídeo aleatório da lista e armazená-lo em uma variável chamada “chosen”, novamente imprimimos isso no shell do Python.
Em seguida, devemos escolher um vídeo aleatório da lista e armazená-lo em uma variável chamada “escolhido”, novamente imprimimos isso no shell Python escolhido = escolha(vídeos) print(escolhido) print(escolhido)
A última linha desta função usa a classe Popen da biblioteca de subprocessos para executar um comando como se estivéssemos sentados no terminal, e este comando é para abrir o media player omxplayer e depois reproduzir o vídeo escolhido.
subprocess.Popen([‘omxplayer’,(escolhido)])
A próxima função é chamada “stop_video” e, como você pode imaginar, ela interromperá o vídeo que está sendo reproduzido. Para isso utilizamos a biblioteca de teclados, especificamente a função “press_and_release” para simular o pressionamento da tecla “q”.
def stop_video(): keyboard.press_and_release(‘q’)
A última função é chamada de “pause_video” e emula pressionar a barra de espaço no teclado, que é como o omxplayer pausa o vídeo.
def pause_video(): keyboard.press_and_release(‘espaço’)
Com as funções criadas, precisamos informar ao nosso código onde nossos botões estão conectados. Temos três botões conectados, randomizer (play), stop e pause_button. Esses botões são conectados ao GPIO nos pinos 2, 3 e 4, respectivamente.
randomizador = Botão(2)parar = Botão(3)pause_button = Botão(4)
Ok, então vamos para a última parte, e esta é a parte que procura quando um botão é pressionado e reage de acordo. Mas primeiro nós envolvemos esta seção em um manipulador de exceção. Ele tentará executar o código, mas se o usuário pressionar CTRL + C, o código será encerrado. Então, para a seção try, nosso código primeiro imprimirá três linhas no shell, essas são as instruções para o usuário. Você notará “n” entre cada cor. Esta é a abreviação do Python para inserir uma nova linha entre cada uma das instruções.
try: print(“Pressione o botão VERDE para iniciar; AMARELO para pausar VERMELHO para parar”)
Nossos três botões estão esperando para serem pressionados e, usando a biblioteca GPIO Zero, chamamos a classe “when_pressed” para detectar quando cada um dos botões é pressionado. Quando isso acontece, a função correspondente é executada. Então, quando pressionamos o botão Green randomiser (reproduzir), ele escolherá aleatoriamente um vídeo do pendrive e o reproduzirá. Você notará que as funções não têm um () no final do nome da função. Isso ocorre porque, se o fizessem, o código seria executado automaticamente. Agora eles estão prontos para serem executados sob demanda.
randomiser.when_pressed = play_video stop.when_pressed = stop_video pause_button.when_pressed = pause_video
A última linha nesta seção é um simples pause(), e isso é usado para manter o código em execução, e não apenas sair depois de executar uma vez.
pausa()
Mas o que acontece se o usuário pressionar CTRL + C? Bem, isso é uma “Interrupção de Teclado” e se isso ocorrer, devemos simplesmente imprimir uma linha vazia e depois “Sair” na tela.
exceto KeyboardInterrupt: print(“nEXIT”)
Então agora salve seu código e abra um Terminal no diretório onde você salvou o código. Para usar o código, precisamos executá-lo com sudo (poderes de root), pois a biblioteca de teclado usada no projeto só pode ser usada como root/sudo.
Para executar o tipo de código:
$ sudo python3 VideoPlayer.py
Quando estiver pronto pressione o botão Verde para reproduzir o vídeo escolhido aleatoriamente, para pausar pressione Amarelo e para parar pressione Vermelho. Aproveite sua noite e não derrame a pipoca!
Você pode incorporar o projeto em uma caixa resistente, para que as mãozinhas não quebrem a eletrônica. Você também pode usar botões estilo arcade que são muito mais robustos e menos propensos a serem quebrados.
O Código Completo
Se você quiser apenas copiar e colar o conteúdo no arquivo VideoPlayer.py, aqui está:
from gpiozero import Buttonfrom signal import pausefrom random import choiceimport globimport subprocessimport keyboarddef play_video(): videos = [] for file in glob.glob(“/media/pi/Videos/*.mp4”): videos.append(file)print( videos)escolhido = escolha(vídeos) print(escolhido) print(escolhido)subprocesso.Popen([‘omxplayer’,(escolhido)]) def stop_video()keyboard.press_and_release(‘q’)def pause_video()keyboard.press_and_release( ‘espaço’)randomiser – Button(2)stop = Button(3)pause_button = Button(4)try:print(“Pressione o botão VERDE para iniciarnYELLOW para pausarRED para parar”)randomiser.when_pressed = play_videostop.when_pressed = stop_videopause_button.when_pressed = pause_video pause() exceto KeyboardInterrupt: print(“nEXIT”) Biblioteca e privacidade do teclado
Neste projeto, usamos a biblioteca Keyboard Python para emular um teclado usando apenas os botões que controlavam a reprodução, pausa e interrupção da reprodução de vídeo. A biblioteca Keyboard é bastante poderosa e pode ser usada para pressionar qualquer tecla, então podemos automatizar vários pressionamentos de tecla com um único botão (útil para sair do vim.) A biblioteca também pode ser usada para escrever texto na tela, em um maneira semelhante à cena “siga o coelho branco” de Neo em Matrix. Mas a função mais perigosa dessa biblioteca é que ela pode ser usada para gravar cada pressionamento de tecla na máquina de destino.
Essas teclas pressionadas podem ser gravadas em uma lista, salvas em um arquivo e usadas para fins nefastos. Então vamos ser claros crianças, adultos. Gravar as teclas pressionadas de um usuário, sem o seu consentimento, é ilegal e pode causar muitos problemas com a escola/trabalho/autoridades. Então não faça isso! Com isso dito, ele pode ser usado como uma ferramenta poderosa ao depurar como um usuário interage com seu código, portanto, para testes de software (sob consentimento do público em geral e testadores internos), você pode ver quais teclas eles estavam pressionando antes do código trancou / ficou termonuclear!
A biblioteca Keyboard funciona com Linux e Windows e é muito divertido brincar com ela. Para ler um pouco mais sobre essa biblioteca, acesse esta postagem do blog https://bigl.es/tuesday-tooling-record-replay-keystrokes-with-python/ e veja alguns exemplos de como ela pode ser usada.
Este artigo foi publicado originalmente na Linux Format Magazine.