专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > VC

求LibMPG123的使用方法。该怎么解决

发布时间:2011-06-23 14:24:38 文章来源:www.iduyao.cn 采编人员:星星草
求LibMPG123的使用方法。。。
最近我写的程序要灵活播放mp3,播放好多不到1秒的小mp3文件。
DirectShow定位不准,有的文件打开就从一半开始播放。。。一共就不足秒,这。。。

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

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

C/C++ code

// 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大概打开上千次之后就打不开文件了。。。不知道要怎么做。。。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: