2016-12-28 2 views
0

hey chaque corps que je veux décoder un fichier mp3 à pcm:mpg123 decode mp3 à pcm en C++

#include <iostream> 
#include <mpg123.h> 
#include <out123.h> 
using namespace std; 
int main() 
{ 
mpg123_handle *mh; 
unsigned char *buffer; 
size_t buffer_size; 
size_t done; 
int err; 
int channels, encoding; 
long rate; 
buffer_size = mpg123_outblock(mh); 
buffer = (unsigned char*) malloc(buffer_size * sizeof(unsigned char)); 

mpg123_init(); 
mh = mpg123_new(NULL, &err); 

mpg123_open(mh, "/home/abbas/Desktop/nastaran.mp3"); 
// mpg123_getformat(mh, &rate, &channels, &encoding); 



while (mpg123_read(mh, buffer, buffer_size, &done) == MPG123_OK) 
    cout << buffer ; 

free(buffer); 
mpg123_close(mh); 
mpg123_delete(mh); 
mpg123_exit(); 
return 0; 
} 

mais il donne cette erreur

The program has unexpectedly finished. 

erreur ne disent rien sur la raison, je Je ne sais pas où est le problème? est-ce quelque chose à propos de l'OS?

fichier CMake:

project(echoprint2) 
cmake_minimum_required(VERSION 2.8) 

aux_source_directory(. SRC_LIST) 
add_executable(${PROJECT_NAME} ${SRC_LIST}) 

add_library(mpg123 SHARED IMPORTED) 
set_target_properties(mpg123 PROPERTIES IMPORTED_LOCATION /usr/local  /lib/libmpg123.so) 
TARGET_LINK_LIBRARIES(echoprint2 mpg123) 
+0

En général, ce message signifie que votre programme s'est bloqué. Exécutez-le sous un débogueur et vous devriez pouvoir trouver le problème. –

Répondre

1

Je corrigé quelques erreurs et a des valeurs numériques à produire. Je vous laisse vérifier si la forme d'onde produite est correcte. Suggérez d'utiliser Excel et Audacity pour le visualiser et confirmer que les formes d'onde semblent correctes.

#include <iostream> 
#include <mpg123.h> 
#include <out123.h> 

int main(){ 
    mpg123_init(); 

    int err; 
    mpg123_handle *mh = mpg123_new(NULL, &err); 
    unsigned char *buffer; 
    size_t buffer_size; 
    size_t done; 

    int channels, encoding; 
    long rate; 
    buffer_size = mpg123_outblock(mh); 
    buffer = (unsigned char*)malloc(buffer_size * sizeof(unsigned char)); 

    mpg123_open(mh, "/home/abbas/Desktop/nastaran.mp3"); 
    mpg123_getformat(mh, &rate, &channels, &encoding); 

    std::ofstream out("res.txt"); 
    unsigned int counter = 0; 

    for (int totalBtyes = 0; mpg123_read(mh, buffer, buffer_size, &done) == MPG123_OK;) { 
     short* tst = reinterpret_cast<short*>(buffer); 
     for (auto i = 0; i < buffer_size/2; i++) { 
      out<< counter + i<<"\t"<< tst[i] << "\n"; 
     } 
     counter += buffer_size/2; 
     totalBtyes += done; 
    } 
    out.close(); 
    free(buffer); 
    mpg123_close(mh); 
    mpg123_delete(mh); 
    mpg123_exit(); 
    return 0; 
} 
+0

merci ça marche. mais pouvez-vous expliquer pourquoi vous utilisez le type short * pour le tampon et pourquoi avez-vous utilisé la condition i

+0

oh je l'ai découvert! sizeof (short) est de 2 octets quand sizeof (char) vaut 1 et c'est pourquoi vous utilisez buffer_size/2 pour la condition. –