最近我写的程序要灵活播放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);