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)
答
我修正了一些错误,并得到了待产的一些数值。我把它留给你来检查产生的波形是否正确。建议使用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作为条件。 –
一般来说,这个消息意味着你的程序崩溃了。在调试器下执行它,你应该能够找到问题。 –