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:
É 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.
É a biblioteca desenvolvida e utilizada pelo aplicativo Mpg123. Ela também a mesma usada nos aplicativos: Audacious , XMMS e Winamp.
É 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.
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
mkdir playmp3
cd playmp3
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;
}
Use a música que quiser como exemplo, faça o download da música.
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