Índice:

Reproduzir vídeo com ESP32: 10 etapas (com imagens)
Reproduzir vídeo com ESP32: 10 etapas (com imagens)

Vídeo: Reproduzir vídeo com ESP32: 10 etapas (com imagens)

Vídeo: Reproduzir vídeo com ESP32: 10 etapas (com imagens)
Vídeo: ESP32: O VÍDEO QUE TODOS PRECISAM ASSISTIR ANTES DE UTILIZAR! 2024, Novembro
Anonim
Reproduzir vídeo com ESP32
Reproduzir vídeo com ESP32

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

Preparação de Hardware
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

Interface SD
Interface SD
Interface SD
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

Junte tudo
Junte tudo
Junte tudo
Junte tudo
Junte tudo
Junte tudo

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

Programa
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

  1. Abra SDMMC_MJPEG_video_PCM_audio_dualSPI_multitask.ino no Arduino IDE
  2. 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
  3. Pressione o botão "Upload" do IDE do Arduino
  4. Se você não conseguiu carregar o programa, tente desconectar a conexão entre ESP32 GPIO 2 e SD D0 / MISO
  5. 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
  6. Se o programa funcionar bem, você pode tentar outro exemplo de início com SDMMC_ *
  7. 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

Benchmark
Benchmark

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

Bom jogo!
Bom jogo!

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 …

Recomendado: