Índice:
2025 Autor: John Day | [email protected]. Última modificação: 2025-01-13 06:58
Este Instructables mostra algo sobre a reprodução de vídeo e áudio com ESP32.
Etapa 1: Recursos e limitações do ESP32
Recursos
- 4 barramentos SPI, 2 barramentos SPI disponíveis para o espaço do usuário, eles são SPI2 e SPI3 ou chamados de HSPI e VSPI. Ambos os barramentos SPI podem operar a no máximo 80 MHz. Teoricamente, ele pode enviar 320x240 pixels coloridos de 16 bits para o SPI LCD a 60 fps, mas ainda não contou o tempo necessário para ler e decodificar os dados de vídeo.
- O barramento SD de 1/4 bits pode conectar o cartão SD no protocolo nativo
- Saída de áudio DAC interna I2S
- mais de 100 KB de RAM disponível para buffer de vídeo e áudio
- Potência de processamento razoável para decodificar JPEG (reproduzir Motion JPEG) e compactação de dados LZW (reproduzir-g.webp" />
- A versão dual-core pode dividir os dados de leitura do cartão SD, decodificar e enviar para SPI LCD em multitarefas paralelas e aumentar o desempenho de reprodução
Limitações
- RAM interna insuficiente para ter buffer de quadro duplo para 320x240 em cores de 16 bits, limitava o design multitarefa. Ele pode superar um pouco com PSRAM externo, embora seja mais lento do que a RAM interna
- não há capacidade de processamento suficiente para decodificar vídeo mp4
- nem todas as versões do ESP32 têm 2 núcleos, o exemplo multitarefa só se beneficia na versão dual-core
Ref.:
Etapa 2: formato de vídeo
RGB565
Ou chamado de cor de 16 bits é um formato de dados brutos comumente usado na comunicação entre o MCU e o visor colorido. Cada pixel de cor representado por um valor de 16 bits, os primeiros 5 bits são o valor vermelho, os 6 bits seguintes são o valor verde e, em seguida, o valor azul de 5 bits. O valor de 16 bits pode fazer uma variação de 65.536 cores, por isso também é chamado de 64 mil cores. Portanto, o vídeo de 1 minuto 320x240 @ 30 fps terá o tamanho: 16 * 320 * 240 * 30 * 60 = 2211840000 bits = 276480000 bytes ou mais de 260 MB
Este é um formato de arquivo comum na web desde 1990. Limita a variação de cor para cada tela em até 256 cores e não armazena repetidamente o pixel que tem a mesma cor do quadro anterior. Portanto, pode reduzir muito o tamanho do arquivo, especialmente quando cada quadro de animação não altera muitos detalhes. A compressão LZW foi projetada para ser decodificada pelo computador dos anos 1990, de modo que o ESP32 também tem poder de processamento justo o suficiente para decodificá-lo em tempo real.
Motion JPEG
Ou chamado M-JPEG / MJPEG é um formato de compressão de vídeo comum para o hardware de captura de vídeo com poder de processamento limitado. Na verdade, é simplesmente uma concatenação de quadros JPEG estáticos. Compare com MPEG ou MP4, Motion JPEG sem necessidade de técnica computacionalmente intensiva de predição entre quadros, cada quadro é independente. Portanto, requer menos recursos para codificar e decodificar.
Ref.:
en.wikipedia.org/wiki/List_of_monochrome_a…
en.wikipedia.org/wiki/GIF
en.wikipedia.org/wiki/Motion_JPEG
Etapa 3: formato de áudio
PCM
Um formato de dados brutos para áudio digital. ESP32 DAC usa profundidade de 16 bits, o que significa que cada dado de 16 bits representa uma amostra de sinal analógico digital. A maioria dos vídeos e músicas normalmente usam taxa de amostragem de 44100 MHz, o que significa 44100 sinal analógico amostrado para cada segundo. Portanto, os dados brutos PCM de áudio mono de 1 minuto serão dimensionados: 16 * 44100 * 60 = 42336000 bits = 5292000 bytes ou mais de 5 MB. O tamanho do áudio estéreo será o dobro, ou seja, mais de 10 MB
MP3
MPEG Layer 3 é um formato de áudio compactado amplamente utilizado para compactação de músicas desde 1990. Pode reduzir drasticamente o tamanho do arquivo para menos de um décimo do formato PCM bruto
Ref.:
en.wikipedia.org/wiki/Pulse-code_modulatio…
en.wikipedia.org/wiki/MP3
Etapa 4: conversão de formato
Este projeto usa FFmpeg para converter o vídeo em formato legível ESP32.
Baixe e instale o FFmpeg em seu site oficial, se ainda não:
Converter para áudio PCM
ffmpeg -i input.mp4 -f u16be -acodec pcm_u16le -ar 44100 -ac 1 44100_u16le.pcm
Converter para áudio MP3
ffmpeg -i input.mp4 -ar 44100 -ac 1 -q: a 9 44100.mp3
Converter para RGB565
ffmpeg -i input.mp4 -vf "fps = 9, scale = -1: 176: flags = lanczos, crop = 220: in_h: (in_w-220) / 2: 0" -c: v rawvideo -pix_fmt rgb565be 220_9fps. rgb
Converter para-g.webp
ffmpeg -i input.mp4 -vf "fps = 15, scale = -1: 176: flags = lanczos, crop = 220: in_h: (in_w-220) / 2: 0, split [s0] [s1]; [s0] palettegen [p]; [s1] [p] paletteuse "-loop -1 220_15fps.gif
Converter para Motion JPEG
ffmpeg -i input.mp4 -vf "fps = 30, scale = -1: 176: flags = lanczos, crop = 220: in_h: (in_w-220) / 2: 0" -q: v 9 220_30fps.mjpeg
Observação:
FFmpeg convertido-g.webp" />
Etapa 5: Preparação de Hardware
ESP32 Dev Board
Qualquer placa de desenvolvimento ESP32 dual-core deve estar ok, desta vez estou usando um TTGO ESP32-Micro.
Exibição em cores
Qualquer display colorido que suporte Arduino_GFX deve estar ok, desta vez estou usando uma placa de breakout ILI9225 com slot para cartão SD.
Você pode encontrar a lista de exibição de cores compatível com Arduino_GFX no Github:
github.com/moononournation/Arduino_GFX
Cartão SD
Qualquer cartão SD deve estar ok, desta vez estou usando um micro SD de 8 GB de "velocidade normal" da SanDisk com adaptador SD.
Áudio
Se você quiser usar apenas fone de ouvido, basta conectar os pinos do fone de ouvido ao pino 26 e o GND poderá ouvir o áudio. Ou você pode usar um pequeno amplificador para reproduzir áudio com alto-falante.
Outros
Algumas placas de ensaio e fios da placa de ensaio
Etapa 6: Interface SD
A placa de breakout ILI9225 LCD também inclui pinos de breakout de slot SD crd. Pode ser usado como barramento SPI ou barramento SD de 1 bit. Conforme mencionado em meus instructables anteriores, eu prefiro usar o barramento SD de 1 bit, então este projeto será baseado no barramento SD de 1 bit.
Etapa 7: coloque tudo junto
As fotos acima mostram a plataforma de teste que estou usando neste projeto. A placa de ensaio branca é impressa em 3D, você pode fazer o download e imprimi-la em thingiverse:
A conexão real depende de qual hardware você tem em mãos.
Aqui está o resumo da conexão:
ESP32
Vcc -> LCD Vcc GND -> LCD GND GPIO 2 -> SD D0 / MISO -> resistor 1k -> Vcc GPIO 14 -> SD CLK GPIO 15 -> SD CMD / MOSI GPIO 18 -> LCD SCK GPIO 19 -> LCD MISO GPIO 22 -> LCD LED GPIO 23 -> LCD MOSI GPIO 27 -> LCD DC / RS GPIO 33 -> LCD RST
Ref.:
Etapa 8: Programa
IDE Arduino
Baixe e instale o Arduino IDE se ainda não o fez:
www.arduino.cc/en/main/software
Suporte ESP32
Siga as instruções de instalação para adicionar suporte ESP32 se você ainda não o fez:
github.com/espressif/arduino-esp32
Biblioteca Arduino_GFX
Baixe as bibliotecas Arduino_GFX mais recentes: (pressione "Clonar ou Baixar" -> "Baixar o ZIP")
github.com/moononournation/Arduino_GFX
Importe bibliotecas no Arduino IDE. (Menu "Sketch" do IDE do Arduino -> "Incluir Biblioteca" -> "Adicionar Biblioteca. ZIP" -> selecione o arquivo ZIP baixado)
ESP8266Audio
Baixe as bibliotecas de áudio ESP8266 mais recentes: (pressione "Clonar ou Baixar" -> "Baixar ZIP")
github.com/earlephilhower/ESP8266Audio
Importe bibliotecas no Arduino IDE. (Menu "Sketch" do IDE do Arduino -> "Incluir Biblioteca" -> "Adicionar Biblioteca. ZIP" -> selecione o arquivo ZIP baixado)
Código de amostra RGB565_video
Baixe o código de amostra RGB565_video mais recente: (pressione "Clonar ou Baixar" -> "Baixar ZIP")
github.com/moononournation/RGB565_video
Dados do cartão SD
Copie os arquivos convertidos para o cartão SD e insira no slot do cartão LCD
Compilar e fazer upload
- Abra SDMMC_MJPEG_video_PCM_audio_dualSPI_multitask.ino no Arduino IDE
- Se você não estiver usando ILI9225, altere o novo código da classe (em torno da linha 35) para corrigir o nome da classe
- Pressione o botão "Upload" do IDE do Arduino
- Se você não conseguiu carregar o programa, tente desconectar a conexão entre ESP32 GPIO 2 e SD D0 / MISO
- Se você achar que a orientação não está correta, altere o valor de "rotação" (0-3) no novo código de classe
- Se o programa funcionar bem, você pode tentar outro exemplo de início com SDMMC_ *
- Se você não tem slot para cartão SD ou não tem FFmpeg instalado, você ainda pode tentar SPIFFS_ * example
Etapa 9: Comparativo de mercado
Aqui está o resumo do desempenho para diferentes formatos de vídeo (220x176) e áudio (44100 MHz):
Formato | Quadro por segundo (fps) |
MJPEG + PCM | 30 |
15 | |
RGB565 + PCM | 9 |
MJPEG + MP3 | 24 |
Observação:
- MJPEG + PCM pode atingir fps maiores, mas é desnecessário jogar em uma tela minúscula maior que 30 fps
- RGB565 não requer processo de decodificação, mas o tamanho dos dados é muito grande e muito tempo consumido no carregamento de dados do SD, o barramento SD de 4 bits e o cartão SD mais rápido podem melhorá-lo um pouco (o palpite pode chegar a cerca de 12 fps)
- Processo de decodificação de MP3 ainda não otimizado, agora é dedicado núcleo 0 para decodificação de MP3 e núcleo 1 para reproduzir vídeo
Etapa 10: Jogue bem
Agora você pode reproduzir vídeo e áudio com seu ESP32, ele desbloqueou muitas possibilidades!
Acho que vou fazer uma pequena TV vintage mais tarde …