delphi使用ACM函数的问题(mp3->PCM wave)

jeff 2008-09-08 03:01:17
要实现一个Mp3->pcm wav,然后pcm wav->g.711的功能,在网络上找到相关的g.711算法,但是在mp3转换到pcm wave的格式的时候需要使用acm的函数,但是找不到相关的dll和dll声明,问各位大虾哪里有相关的下载。
相关代码如下(太长,省略部分):
一:MP3转换为WAV

function acmDriverEnumCallback(hadid: HACMDRIVERID; dwInstance: DWORD; fdwSupport: DWORD): BOOL; stdcall;
var
driver : HACMDRIVER;
details : TACMDRIVERDETAILS;
i : integer;
fmtDetails : TACMFORMATTAGDETAILS;
begin
if (fdwSupport and ACMDRIVERDETAILS_SUPPORTF_CODEC) <> 0 then
begin
details.cbStruct := sizeof(TACMDRIVERDETAILS);
acmDriverDetails(hadid, details, 0);
acmDriverOpen(driver, hadid, 0);
for i := 0 to details.cFormatTags - 1 do
begin
ZeroMemory(@fmtDetails, sizeof(fmtDetails));
acmFormatTagDetails(driver, fmtDetails, ACM_FORMATTAGDETAILSF_INDEX);
……
if (fmtDetails.dwFormatTag = WAVE_FORMAT_MPEGLAYER3) then inc(g_mp3Drivers);
end;
acmDriverClose(driver, 0);
end;
Result := true;
end;


function ConverMP3ToRaw(Mp3FileName: pChar; const Channels, SamplesPerSec, BitsPerSample: Integer): Boolean; stdcall;
var
mmr : MMRESULT;
waveFormat : PWAVEFORMATEX;
mp3format : PMPEGLAYER3WAVEFORMAT;
g_mp3stream : HACMSTREAM;
mp3streamHead : TACMSTREAMHEADER;
……
begin
……
acmDriverEnum(acmDriverEnumCallback, 0, 0); // try to find an MP3 codec
if (g_mp3Drivers = 0) then Exit;
……
acmMetrics(nil, ACM_METRIC_MAX_SIZE_FORMAT, maxFormatSize);

waveFormat := PWAVEFORMATEX(Pointer(LocalAlloc(LPTR, maxFormatSize))); // define desired output format
waveFormat^.wFormatTag := WAVE_FORMAT_PCM;
if Channels = 1 then waveFormat^.nChannels := 1;
if Channels = 2 then waveFormat^.nChannels := 2;
……
waveFormat^.cbSize := 0; // no more data to follow

mp3format := PMPEGLAYER3WAVEFORMAT(Pointer(LocalAlloc(LPTR, maxFormatSize))); // define MP3 input format
mp3format^.wfx.cbSize := MPEGLAYER3_WFX_EXTRA_BYTES;
……
mp3format^.wID := MPEGLAYER3_ID_MPEG;

g_mp3stream := nil;
mmr := acmStreamOpen(g_mp3stream, // open an ACM conversion stream
nil, // querying all ACM drivers
TWAVEFORMATEX(Pointer(mp3format)^), //TWAVEFORMATEX(Pointer(LongInt
(@mp3format))), // converting from MP3
waveFormat^, // to WAV
nil, // with no filter
0, // or async callbacks
0, // (and no data for the callback)
0 // and no flags
);

LocalFree(LongInt(mp3format));
LocalFree(LongInt(waveFormat));
if mmr <> 0 then Exit;
……
// prepare the decoder
ZeroMemory(@mp3streamHead, sizeof(TACMSTREAMHEADER));
mp3streamHead.cbStruct := sizeof(TACMSTREAMHEADER);
mp3streamHead.pbSrc := mp3buf;
mp3streamHead.cbSrcLength := MP3_BLOCK_SIZE;
mp3streamHead.pbDst := rawbuf;
mp3streamHead.cbDstLength := rawbufsize;
acmStreamPrepareHeader(g_mp3stream, mp3streamHead, 0);
……
end;
...全文
424 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
fangsp 2008-09-08
  • 打赏
  • 举报
回复
顶一个
雄牛 2008-09-08
  • 打赏
  • 举报
回复

路过....

友情UP.....

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧