登录
首页 串口通信 串口通信
回帖 发帖
正文

主题:各位大虾,语音medom主动打电话后如何送出语音呢

点击:8711 回复:11

我已经发出声音的数据,但是电话那边是乱七八糟的东西。请问你是否有同感呢?
03-04-01 16:35
这里是我提出的问题,现在由我来解答自已。
用AT指令发送语音时只能发送一定采样频率的WAV文件。
我现在采用的是TAPI已经解决这个问题。
03-04-09 10:54
楼上的老师:
  我现在正在学TAPI方面的串口编程,
我打算做一个毕业设计,就是利用语音“猫”的电话聊天问题(通过公用电话网),却不知如何送出语音,
TAPI好像也没有提到如何控制猫送出语音的问题,
  请给与帮助!!!!!!谢谢!!!
03-05-03 09:16
楼上的,你会VC++.虽然我也会,但是我不是VC实现的,现在说明如下:
TAPI並不提供錄放音的功能,錄放音是藉由Windows 音效API來達成,例如本實作由TAPI打電話,電話接通後,使用Windows 音效API,對此通電話錄音(收電話的聲音),或對此通電話放音(送聲音到電話中)。當對此通電話錄音,電話機被當成音源輸入(Wave/In)裝置;當對此通電話放音,電話機被當成音源輸出(Wave/Out)裝置。
Windows 音效API為MMSYSTEM.DLL,Delphi 4.0 已改寫為MMSYSTEM.PAS檔案,可以直接叫用音效函數。
03-05-05 10:09
下面是原程式不知你是否能明白:
procedure PlayRecordedCall; //已錄音放音
var
WAVEOUTCAPS: TWAVEOUTCAPS;
hWaveOut1 : HWAVEOUT;
WAVEFORMATEX : TWAVEFORMATEX;
WAVEHDR : TWAVEHDR;
Buffer: PChar;
begin
begin
GetMem(Buffer, Sizeof(WAVEHDR));
WAVEHDR.dwBytesRecorded := BytesRecorded; //BytesRecorded: Global variable
WAVEHDR.dwBufferLength := BytesRecorded;
WAVEHDR.dwFlags := 0;
WAVEHDR.dwLoops := 0;
WaveOutGetDevCaps( 0, @WAVEOUTCAPS, Sizeof( WAVEOUTCAPS) );
WaveOutOpen( @hWaveOut1, 0, @WAVEFORMATEX, 0, 0, CALLBACK_NULL );
 
WaveOutPrepareHeader( hWaveOut1, @WAVEHDR, Sizeof(WAVEHDR));
waveOutWrite( hWaveOut1, @WAVEHDR, Sizeof(WAVEHDR)); //放音
WaveOutUnPrepareHeader( hWaveOut1, @WAVEHDR, Sizeof(WAVEHDR)); //free data blocks
WaveOutClose(hWaveOut1);
FreeMem(Buffer);
end;
 
03-05-05 10:12
网上有很多这方面的资料,有兴趣的朋友,我们可以进一步交流.
03-05-05 10:16
朋友,久久不见你的回信,原来你都回到了这里了,谢谢了,
以上的代码我是看不明白(我没有学过DELPHI)的,
但我想着录放音的时候,要用到什么句柄吧,那么是不是通过调用lineMakeCall()函数的时候,得到的m_hCall句柄呢,通过此句柄,把语音传进传出呢?
我还要查一查资料,我是一个大专生,对于VC是自学的,没有什么经验,见笑了!
03-05-06 08:35
不是的。先用LineMakeCall 成功后再用 LineGetID返回的结果就可以了。
03-05-06 14:25
void GethModem(HLINE hLine)  
{   ModemID far *mid;  
     VARSTRING * str;  
     LONG lid;  
    DWORD size;  
     char mark=1;  
     str=(VARSTRING *)malloc(sizeof(VARSTRING));  
     if(!str)  
return NULL;  
    str- >dwTotalSize=sizeof(VARSTRING);  
     do  
     { if((lineGetID(myhLine,0,NULL,LINECALLSELECT_LINE,str,  
"comm/datamodem")==0)&&(str- >dwTotalSize < str- > dwNeededSize))  
     { dwSize=str- >dwNeededSize;  
          free(str);  
            str=(VARSTRING *)malloc(dwSize);  
           if(!str)  
            { myhModem=NULL;  
    mark=2;  
}  
       str- >dwTotalSize=dwSize;  
        }  
  else mark=0;  
   }while(mark==1);  
  if(mark==0)  
  { mid=(ModemID far *)((LPSTR)str+str- >dwStringOffset);  
      myhModem=mid- >hModem;  
  }  
     free(str);  
}  
03-05-06 14:31
我找到了一些资料,是这样的,
 当得到modem的句柄后,当 回 调 函 数 收 到LINECALLSTATE_CONNECTED 消 息 后, 请 先 清 除 接 收 缓 冲 区, 可 以 使 用 函 数 为WriteFile 及ReadFile 函 数 进 行 数 据 交 换, 注 意 参 数hFile 调制解调器句柄hModem,
 对于播放声音这一块儿,我还是搞不定,若再加个来电显示,也没有头绪,
只恨自己的外语太菜啊,否则msdn中的,也够我啃一段时间的!
03-05-07 14:52

上一页下一页

工控新闻

更多新闻资讯