mpg123的解码MP3为PCM在C++

问题描述:

哎每一个机构,我想一个MP3文件解码为PCM:mpg123的解码MP3为PCM在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; 
} 

,但它给这个犯错

The program has unexpectedly finished. 

错误只字不提的原因,我不知道问题在哪里?是关于操作系统的一些事情?

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

一般来说,这个消息意味着你的程序崩溃了。在调试器下执行它,你应该能够找到问题。 –

我修正了一些错误,并得到了待产的一些数值。我把它留给你来检查产生的波形是否正确。建议使用Excel和Audacity将其可视化并确认波形看起来没问题。

#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

谢谢你的作品。但你能解释为什么你使用short *类型的缓冲区,为什么你使用我的

+0

哦,我发现了!当sizeof(char)是1时sizeof(short)是2个字节,这就是为什么你使用buffer_size/2作为条件。 –