当前位置:编程学习 > html/css >>

捕获电脑的声音放到手机播放

在pc上使用adb命令:adb forward tcp:4626 tcp:4883,在PC上建立4626端口通信数据将被重定向到手机端server的4883端口;然后初始化socket,连接到手机4626端口,进行socket通信。PC端代码如下:

 

[html] 
DWORD WINAPI usbThreadFunc(LPVOID threadNum) 

    int length;  
    CString temp; 
    if(!initAdb())//adb init 
    { 
        MessageBox(0, L"初始化手机出错!", L"提示", MB_OK); 
        return 0; 
    } 
    if(!InItClientSock())//socket init 
    { 
        MessageBox(0, L"初始化IP地址出错!", L"提示", MB_OK); 
        return 0; 
    } 
    if(!USBConnectSock((HWND)threadNum))//connect socket 
    { 
        MessageBox(0, L"连接IP地址出错!", L"提示", MB_OK); 
        return 0; 
    } 
    //等待连接的时候,连接可能被取消。 
    if(clientThreadRun) 
    { 
    } 
    else 
    { 
        MessageBox(0, L"用户取消!", L"提示", MB_OK); 
        return 0; 
    } 
    SetDlgItemText( (HWND)threadNum, IDC_SOUNDFILE, TEXT("&USB Disconnect") ); 
    EnableWindow( GetDlgItem( (HWND)threadNum, IDC_RECORD ), TRUE ); 
    EnableWindow( GetDlgItem( (HWND)threadNum, IDC_BUTTON_WIFI ), FALSE );   
    while(clientThreadRun) 
    { 
        if( (length = recv(clientSock,(char*)recv_message_client,sizeof(recv_message_client),0))>0) 
        { 
            memset(recv_message_client, 0, sizeof(recv_message_client)); 
            LogPrintf(recv_message_client); 
        }        
    } 
    return 0; 

DWORD WINAPI usbThreadFunc(LPVOID threadNum)
{
 int length; 
 CString temp;
 if(!initAdb())//adb init
 {
  MessageBox(0, L"初始化手机出错!", L"提示", MB_OK);
  return 0;
 }
 if(!InItClientSock())//socket init
 {
  MessageBox(0, L"初始化IP地址出错!", L"提示", MB_OK);
  return 0;
 }
 if(!USBConnectSock((HWND)threadNum))//connect socket
 {
  MessageBox(0, L"连接IP地址出错!", L"提示", MB_OK);
  return 0;
 }
 //等待连接的时候,连接可能被取消。
 if(clientThreadRun)
 {
 }
 else
 {
  MessageBox(0, L"用户取消!", L"提示", MB_OK);
  return 0;
 }
 SetDlgItemText( (HWND)threadNum, IDC_SOUNDFILE, TEXT("&USB Disconnect") );
 EnableWindow( GetDlgItem( (HWND)threadNum, IDC_RECORD ), TRUE );
 EnableWindow( GetDlgItem( (HWND)threadNum, IDC_BUTTON_WIFI ), FALSE ); 
 while(clientThreadRun)
 {
  if( (length = recv(clientSock,(char*)recv_message_client,sizeof(recv_message_client),0))>0)
  {
   memset(recv_message_client, 0, sizeof(recv_message_client));
   LogPrintf(recv_message_client);
  }  
 }
 return 0;
}

这里说道最重要的是捕获声音,下面的代码启动了一个线程来处理捕获到的声音:


[html] 
DWORD WINAPI captureThreadFunc(LPVOID hDlg) 

    DWORD dwResult; 
    while(g_bRecording)  
    {  
        dwResult = MsgWaitForMultipleObjects( 1, &g_hNotificationEvent, FALSE, INFINITE, QS_ALLEVENTS ); 
        switch( dwResult ) 
        { 
        case STATUS_WAIT_0://case WAIT_OBJECT_0 + 0: 
 
            RecordCapturedData(); 
            break; 
        } 
    } 
    return 0; 

DWORD WINAPI captureThreadFunc(LPVOID hDlg)
{
 DWORD dwResult;
 while(g_bRecording)
 {
  dwResult = MsgWaitForMultipleObjects( 1, &g_hNotificationEvent, FALSE, INFINITE, QS_ALLEVENTS );
  switch( dwResult )
  {
  case STATUS_WAIT_0://case WAIT_OBJECT_0 + 0:

   RecordCapturedData();
   break;
  }
 }
 return 0;
}

在创建捕获声音的设备的时候,会创建一个事件,这个事件就是捕获到一定长度的声音之后(比如2K大小的声音),会发出一个通知,告诉你去处理。上面的线程,就是一直待等待这个事件,然后再去处理捕获到的声音,把声音发送给socket,交给手机处理,代码:


[html] 
HRESULT RecordCapturedData()  

    HRESULT hr; 
    VOID*   pbCaptureData    = NULL; 
    DWORD   dwCaptureLength; 
    VOID*   pbCaptureData2   = NULL; 
    DWORD   dwCaptureLength2; 
    DWORD   dwReadPos; 
    DWORD   dwCapturePos; 
    LONG lLockSize; 
 
    if( NULL == g_pDSBCapture ) 
        return S_FALSE; 
 
    if( FAILED( hr = g_pDSBCapture->GetCurrentPosition( &dwCapturePos, &dwReadPos ) ) ) 
        return DXTRACE_ERR_MSGBOX( TEXT("GetCurrentPosition"), hr ); 
 
    lLockSize = dwReadPos - g_dwNextCaptureOffset; 
    if( lLockSize < 0 ) 
        lLockSize += g_dwCaptureBufferSize; 
 
    // Block align lock size so that we are always write on a boundary 
    lLockSize -= (lLockSize % g_dwNotifySize); 
 
    if( lLockSize == 0 ) 
        return S_FALSE; 
 
    // Lock the capture buffer down 
&n

补充:web前端 , HTML 5 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,