首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VC >

求LibMPG123的使用方法。该怎么处理

2013-01-11 
求LibMPG123的使用方法。。。本帖最后由 mm304321141 于 2009-06-20 03:04:27 编辑最近我写的程序要灵活播放m

求LibMPG123的使用方法。。。
本帖最后由 mm304321141 于 2009-06-20 03:04:27 编辑 最近我写的程序要灵活播放mp3,播放好多不到1秒的小mp3文件。
DirectShow定位不准,有的文件打开就从一半开始播放。。。一共就不足秒,这。。。

但是下载下来了LibMPG123,编辑了dll文件。。。但是现在只是勉强能用来播放mp3而已。。。

问下有没有办法像CDXGraph类一样的现成的类?


// mp3_to_wav.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

static int which = 0;
static BYTE buffer[8192];
static BYTE outbuf[2][1638400];
static HWAVEOUT _ghWaveOut = NULL;
static HANDLE _ghEvent = NULL;
static WAVEHDR WaveHdr[2];

static int playSetup(long rate, int chanel)
{
int err = 0;
WAVEFORMATEX waveform;
waveform.wFormatTag =WAVE_FORMAT_PCM;
waveform.nChannels =chanel;
waveform.nSamplesPerSec =rate;
waveform.nAvgBytesPerSec=rate*chanel;
waveform.nBlockAlign =rate*chanel/8;
waveform.wBitsPerSample =16;
waveform.cbSize =0;

_ghEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
err = waveOutOpen(&_ghWaveOut, WAVE_MAPPER, &waveform, (DWORD)_ghEvent, 0, CALLBACK_EVENT);
memset(WaveHdr, 0, sizeof(WaveHdr));
WaveHdr[1].dwLoops = 1;
WaveHdr[0].dwLoops = 1;
waveOutPrepareHeader(_ghWaveOut, &WaveHdr[1], sizeof(WAVEHDR));
waveOutPrepareHeader(_ghWaveOut, &WaveHdr[0], sizeof(WAVEHDR));
return err;
}

static int playAudio(const BYTE buf[], int len)
{
int err = 0;
LPWAVEHDR pWaveHdr = &WaveHdr[which];
pWaveHdr->lpData = (LPSTR)(LPTSTR)buf ;
pWaveHdr->dwBufferLength = len;
err = waveOutWrite (_ghWaveOut, pWaveHdr, sizeof (WAVEHDR));
which = !which;
pWaveHdr = &WaveHdr[which];
while(pWaveHdr->dwFlags == 0x12){
WaitForSingleObject(_ghEvent, -1);
}
return err;
}

static int decode_file(mpg123_handle *mh, char *path)
{
int n;
int err;
size_t done;
FILE *fp = fopen(path, "rb");
if (fp == NULL){
return -1;
}
while(feof(fp) == 0){
n = fread(buffer, 1, sizeof(buffer), fp);
err = mpg123_decode(mh, buffer, n, outbuf[which], 1638400, &done);
if (err == MPG123_NEW_FORMAT){
long rate;
int channels, enc;
mpg123_getformat(mh, &rate, &channels, &enc);
printf("new format\n");
playSetup(rate, channels);
}
playAudio(outbuf[which], done);
while (err!=MPG123_NEED_MORE && err!=MPG123_ERR){
err = mpg123_decode(mh, NULL, 0, outbuf[which], 1638400, &done);
playAudio(outbuf[which], done);
}
if (err == MPG123_ERR){
printf("err = %s\n", mpg123_strerror(mh));
break;
}
}
waveOutReset(_ghWaveOut);
waveOutClose(_ghWaveOut);
fclose(fp);
return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{

int err = 0;
mpg123_init();
mpg123_handle *mh = mpg123_new(NULL, &err);
assert(mh != NULL);
err = mpg123_open_feed(mh);
assert(err == MPG123_OK);


char path[] = "300.mp3";
decode_file(mh, path);
mpg123_close(mh);
mpg123_delete(mh);
mpg123_exit();
return 0;
}


[解决办法]
引用:
C/C++ codeif(mpg123_topen(_handle,*file)!=MPG123_OK)return-1;
这个mpg123_topen大概打开上千次之后就打不开文件了。。。不知道要怎么做。。。

mpg123_topen 打开用完了,对应的close 关闭一下

热点排行