🎶 Como Tocar MP3 com C++ 🎻 🎼 Code Music

Tutorial estilo "Code Music 🎵"


🎶 Como Tocar MP3 com C++ 🎻 🎼 Code Music


Nesse artigo/vídeo veremos um código com OOP de como tocar MP3 com C++, existem outras bibliotecas que também fazem isso, algumas outras só tocam WAV, por exemplo, as bibliotecas de gamedev.

Antes de mais nada precisamos saber quais bibliotecas precisamos saber as diferenças entre: Mpg123, LibMPG123 e Libao:


Mpg123

É um reprodutor de áudio gratuito e de código aberto . Suporta formatos de áudio MPEG , incluindo MP3. É um aplicativo que funciona via linha de comando e não possui interface gráfica.


Libmpg123

É a biblioteca desenvolvida e utilizada pelo aplicativo Mpg123. Ela também a mesma usada nos aplicativos: Audacious , XMMS e Winamp.


Libao

É uma biblioteca de áudio multiplataforma que permite que os programas produzam áudio usando uma API simples em uma ampla variedade de plataformas.

É uma ferramenta desenvolvida pela Xiph.Org, a mesma que criou o tipo de arquivo: ogg e também o formato FLAC, que é uma alternativa livre ao mp3 e entre outros formatos.


Instalação

Lógico que você precisará delas para compilar o código, pesquise no gerenciador de pacotes do seu sistema operacional, ela funciona em todos: Windows(Recomendo você usar o Nuget e pesquisar), GNU/Linux, macOS e todos da família BSD além de Haiku e outros.

Exemplo no Ubuntu:

sudo apt update
sudo apt install libmpg123-dev libaio-dev

Assista ao Vídeo


Código criado no vídeo

Crie um projeto

mkdir playmp3
cd playmp3

Adicione os arquivos com os códigos abaixo:

playmp3.hpp

#pragma once

#include <mpg123.h>
#include <ao/ao.h>
#include <memory>
#include <iostream>

class PlayMP3 {
  // Primitive types
  std::size_t buffer_size, done;
  int driver, err, channels, encoding;
  long rate;
  std::string track;

  // LibMPG123 type and smart pointer
  mpg123_handle *mh;
  std::shared_ptr<char> buffer;

  // AO types
  ao_sample_format format;
  ao_device *dev;

  public:
    PlayMP3();
    ~PlayMP3();
    void music(char*);
    void play();
};

playmp3.cpp

#include "playmp3.hpp"

PlayMP3::PlayMP3(){
  ao_initialize();
  driver = ao_default_driver_id();
  mpg123_init();
  mh = mpg123_new(NULL, &err);
  buffer_size = mpg123_outblock(mh);

  // Dont use make_shared here
  buffer = std::shared_ptr<char>(
    new char[buffer_size], 
    std::default_delete<char[]>()
  );
}

void PlayMP3::music(char* mp3){
  track = mp3;
  mpg123_open(mh, mp3);
  mpg123_getformat(mh, &rate, &channels, &encoding);

  format.bits = mpg123_encsize(encoding) * 8;
  format.rate = rate;
  format.channels = channels;
  format.byte_format = AO_FMT_NATIVE;
  format.matrix = 0;
  dev = ao_open_live(driver, &format, NULL);
}

void PlayMP3::play(){
  std::cout << "\033[33;1m\u25B6 Playing the song: \033[35;1m ";
  std::cout << track << "\033[m\n";

  while(mpg123_read(mh, buffer.get(), buffer_size, &done) == MPG123_OK){
    ao_play(dev, buffer.get(), done);
  }
}

PlayMP3::~PlayMP3(){
  ao_close(dev);
  mpg123_close(mh);
  mpg123_delete(mh);
  mpg123_exit();
  ao_shutdown();
}

main.cpp

#include "playmp3.hpp"

int main(int argc, char **argv){
  if(argc > 1){
    auto p = std::make_unique<PlayMP3>();
    p->music(argv[1]);
    p->play();
  }else{
    std::cerr << "Enter the song\n";
    return EXIT_FAILURE;
  }
  return 0;
}

Compilando e tocando um MP3

Use a música que quiser como exemplo, faça o download da música.

music.mp3

Música: SAINt JHN - “Trap” ft. Lil Baby (Música disponível em https://en.mygomp3.com/):

wget -q https://cutt.ly/musicmp3 -O music.mp3.

g++ main.cpp playmp3.cpp -o playmp3 -lmpg123 -lao
./playmp3 music.mp3

Links úteis


multimidia cpp


Compartilhe


Nosso canal no Youtube

Inscreva-se


Marcos Oliveira

Marcos Oliveira

Desenvolvedor de software
https://github.com/terroo

Artigos Relacionados




Crie Aplicativos Gráficos para Linux e Windows com C++

Aprenda C++ Moderno e crie Games, Programas CLI, GUI e TUI de forma fácil.

Saiba Mais

Receba as novidades no seu e-mail!

Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!