Jumat, 13 Maret 2015

Membaca Tag ID3 Pada MP3 Player


Tulisan ini dimaksudkan untuk melanjutkan yang sebelumnya, tentang Tutorial Pembuatan MP3 Player.

Saat spesifikasi format MP3 diciptakan, terdapat satu masalah yang belum sempat terpecahkan. File MP3 tidak mendukung metode untuk menympan informasi tentang suara MP3. Akhirnya muncullah ide di luar spesifikasi untuk menambahkan potongan informasi metadata di bagian belakang data MP3.

Tag ID3 awalnya hanya menyimpan informasi tentang judul lagu, artis, album, tahun, komentar dan genre saja. Namun, spesifikasi yang baru memungkinkan sebuah file MP3 memiliki informasi yang lebih lengkap, misalnya gambar album, rating dan nomor track.

Ada 2 versi tag ID3, yaitu ID3v1 dan ID3v2. Fungsinya tidak berbeda, namun struktur datanya sedikit berbeda diantara keduanya. ID3v2 adalah spesifikasi yang lebih baru, sehingga dapat menampung informasi lebih lengkap.

Sebuah file MP3 yang menyimpan informasi lebih lengkap dengan ID3v2, akan tetap menyimpan data ID3v1. Hal ini dimaksudkan untuk menjaga kompatibilitas software pemutar MP3 yang terdahulu yang masih belum mendukung ID3v2.

Untuk memperoleh informasi tag ID3, mpg123 menyediakan sebuah fungsi mpg123_id3() untuk memperoleh data ID3.

int mpg123_id3(mpg123_handle *mh, mpg123_id3v1 **v1, mpg123_id3v2 **v2);

Fungsi diatas menggunakan 2 buah parameter. Salah satu parameter boleh diberi argumen 0 (NULL) jika tidak ingin mendapatkan salah satu data ID3. Jika berhasil fungsi ini mengembalikan nilai 0 (MPG123_OK). Parameter v1 adalah pointer ke pointer struktur yang menampung informasi tag id3v1. Berikut ini adalah bentuk strukturnya.

typedef struct
{
    char tag[3];         /**< Always "TAG". */
    char title[30];      /**< Title string.  */
    char artist[30];     /**< Artist string. */
    char album[30];      /**< Album string. */
    char year[4];        /**< Year string. */
    char comment[30];    /**< Comment string. */
    unsigned char genre; /**< Genre index. */
} mpg123_id3v1;

*Member tag digunakan untuk memeriksa apakah data yang diproleh valid ataukah tidak. Jika karakter yang ada dalam member ini bukan “TAG”, maka lebih baik anda memeriksanya.
*Member genre merupakan kode genre dari musik yang dibuka, untuk mengetahui daftar lengkapnya lihat link berikut : http://en.wikipedia.org/wiki/ID3.

Sementara itu parameter v2 adalah pointer ke pointer struktur penampung informasi ID3v2. Isi dari struktur ini sebenarnya lebih lengkap dibanding kan ID3v1, namun karena tulisan ini ditujukan untuk pembelajaran, dan mengutamakan kemudahan pemahaman pembaca, maka tulisan ini hanya akan menunjukkan dasarnya saja. Jadi untuk parameter kedua(v2), kita akan memberikan argumen 0. Walaupun begitu, anda bisa mencoba memperoleh ID3v2 dengan melihat bentuk strukturnya dalam dokumentasi libmpg123 :)  


Source Code
#include <mpg123.h>
#include <ao/ao.h>

#define MP3_FILE "/home/irvan/Closer To The Edge.mp3"
int main()
{
    mpg123_handle    *handle;
    ao_sample_format sample_format;
    ao_device        *device;
    int              driver_id;
    char             *buffer;
    unsigned int     ukuran_buffer;
    long             rate;
    int              channels;
    int              encoding;
    mpg123_id3v1     *id3v1;
      
      
//inisialisasi MPG123
    printf("Komputoo MP3 player\nMemutar %s...\n", MP3_FILE);
    printf("Menyiapkan libmpg123\n");
    mpg123_init();
    handle = mpg123_new(0, 0);
    if(handle == 0)
    {
        printf("Gagal membuat handle baru!\n");
        exit(EXIT_FAILURE);
    }
   
//inisialisasi AO
    printf("Menyiapkan libao\n");
    ao_initialize();
    driver_id = ao_default_driver_id();
    if(driver_id == -1)
    {
        printf("Driver ID tidak diketahui\n");
        exit(EXIT_FAILURE);
    }

//buka mp3
    if(mpg123_open(handle,MP3_FILE) != 0)
    {
        printf("Gagal membuka file!\n");
        exit(EXIT_FAILURE);
    }

//inisialisasi memori buffer untuk menyimpan hasil decode mp3
    ukuran_buffer = mpg123_outblock(handle);
    buffer = (char*) malloc(ukuran_buffer);

//inisialisasi struktur sample_format dari MP3 yang terbuka
    printf("Mengolah informasi MP3...\n");
    mpg123_getformat(handle, &rate, &channels, &encoding);
    sample_format.bits = mpg123_encsize(encoding) * 8;
    sample_format.rate = rate;
    sample_format.channels = channels;
    sample_format.byte_format = AO_FMT_NATIVE;
    sample_format.matrix = 0;
   
//inisialisasi ao sebelum playing
    device = ao_open_live(driver_id, &sample_format, 0);
    if(device == 0)
    {
        printf("ao_open_live error!\n");
        exit(EXIT_FAILURE);
    }

//lihat ID3
if (mpg123_id3(handle, &id3v1, 0) == MPG123_OK)
{
    printf("ID3v1: \n");
    printf(" - Title: %s \n", id3v1->title);
    printf(" - Artist: %s \n", id3v1->artist);
    printf(" - Album: %s \n", id3v1->album);
}

//decode dan play mp3
    printf("Memutar MP3...\n");
    size_t terbaca;
    while(mpg123_read(handle, buffer, ukuran_buffer, &terbaca) == 0)
    {
        ao_play(device, buffer, ukuran_buffer);
    }
   
//akhir
    printf("Selesai.\n");
    free(buffer);
    mpg123_close(handle);
    mpg123_delete(handle);
    mpg123_exit();
    ao_close(device);
    ao_shutdown();
   
}

Kode diatas hanya mencoba mencetak Judul, artis dan album saja. Jika anda ingin mencoba mengeprint tahun lagu, sebaiknya anda membuat sebuah buffer dulu, lalu mengopy 4 karakter tahun ke buffer tersebut, danjangan lupa untuk memberikan karakter \0 dibelakang tahun. Ini harus dilakukan karena string tersebut tidak disimpan dengan null-terminated.

Hasil

Load disqus comments

0 comments