C++ 音频通过插座c++;

C++ 音频通过插座c++;,c++,sockets,audio,stream,sfml,C++,Sockets,Audio,Stream,Sfml,我正在使用麦克风捕获一些音频。 数据存储在Int16*类型的样本中 Int16* samples; 我的问题是。我应该如何处理这些示例,使其通过套接字在另一个地方播放?我问的是数据类型的关系。是否需要将此Int16数组转换为其他类型?或者我可以按原样发送这个Int16*吗 编辑 void BroadcastRecorder::loadBufferFromSamples() { //m_samples is of type vector<Int16*> if (!m_

我正在使用麦克风捕获一些音频。 数据存储在Int16*类型的样本中

Int16* samples;
我的问题是。我应该如何处理这些示例,使其通过套接字在另一个地方播放?我问的是数据类型的关系。是否需要将此Int16数组转换为其他类型?或者我可以按原样发送这个Int16*吗

编辑

void BroadcastRecorder::loadBufferFromSamples()
{
    //m_samples is of type vector<Int16*>
    if (!m_samples.empty()){
        m_buffer.loadFromSamples(&m_samples[0], m_samples.size(), 1, getSampleRate());
        m_samples.clear();
    }
}

void Broadcaster::Send()
{
    //load the buffer with the samples
    if(!m_recorder->empty()){
        m_recorder->loadBufferFromSamples();
        const sf::SoundBuffer& buffer = m_recorder->getBuffer();

        size_t dataLength = m_recorder->GetSamplesSize();

        wxSocketClient * socket = new wxSocketClient(wxSOCKET_NOWAIT);
        socket->Notify(false);

        // ------------- DATA----------------------
        wxString data = "";
        wxString strToPrepend(_("--myboundary\r\nContent-Type: audio/wav\r\n"));
        wxString strToAppend(_("\r\n--myboundary\r\n"));

        // ------------- HEADER -----------------------
        wxString header = "";

        header.append("POST ");
        header.append("/cgi-bin/operator/transmit");
        header.append(" HTTP/1.0\r\n");
        header.append("Content-Type: multipart/form-data; boundary=--myboundary\r\n");
        header.append("Content-Length: " + wxString::Format(wxT("%i"),(dataLength + strToPrepend.Len() + strToAppend.Len()) ) + "\r\n");
        header.append("Authorization: Basic keykeykeykey\r\n");
        header.append("\r\n");

        //-------------- CONNECTION ---------------
        wxString host = _("192.168.50.11");
        wxIPV4address * address = new wxIPV4address();
        address->Hostname(host);
        address->Service(8084);

        if (socket->Connect(*address)){
            //Write header
            socket->Write(header.c_str(),header.Len());
            //Write data
            socket->Write(strToPrepend.c_str(),strToPrepend.Len());
            const sf::Int16* samples = buffer.getSamples();

            const char* bytesData = reinterpret_cast<const char*>(samples);

            socket->Write(bytesData,dataLength);

            socket->Write(strToAppend.c_str(),strToAppend.Len());

            socket->Close();
        }

        delete socket;
        delete address;
    }
}
void BroadcastRecorder::loadBufferFromSamples()
{
//m_样本属于向量类型
如果(!m_samples.empty()){
m_buffer.loadFromSamples(&m_samples[0],m_samples.size(),1,getSampleRate());
m_samples.clear();
}
}
无效广播者::发送()
{
//用样本加载缓冲区
如果(!m_recorder->empty()){
m_recorder->loadBufferFromSamples();
const sf::SoundBuffer&buffer=m_recorder->getBuffer();
size\u t dataLength=m\u recorder->GetSamplesSize();
wxSocketClient*socket=新的wxSocketClient(wxSOCKET_NOWAIT);
套接字->通知(假);
//------数据----------------------
wxString data=“”;
wxString strToPrepend(“--myboundary\r\n内容类型:audio/wav\r\n”);
wxString strToAppend(“\r\n--myboundary\r\n”);
//------标题-----------------------
wxString header=“”;
标题。附加(“POST”);
header.append(“/cgi-bin/operator/transmit”);
header.append(“HTTP/1.0\r\n”);
header.append(“内容类型:多部分/表单数据;边界=--myboundary\r\n”);
header.append(“内容长度:”+wxString::Format(wxT(“%i”),(dataLength+strToPrepend.Len()+strToAppend.Len())+“\r\n”);
header.append(“授权:基本密钥\r\n”);
header.append(“\r\n”);
//--------------联系---------------
wxString主机=((“192.168.50.11”);
wxIPV4address*地址=新的wxIPV4address();
地址->主机名(主机);
地址->服务(8084);
如果(套接字->连接(*地址)){
//写头
socket->Write(header.c_str(),header.Len());
//写入数据
socket->Write(strToPrepend.c_str(),strToPrepend.Len());
常量sf::Int16*samples=buffer.getSamples();
const char*bytesData=reinterpret_cast(样本);
套接字->写入(字节数据,数据长度);
socket->Write(strToAppend.c_str(),strToAppend.Len());
套接字->关闭();
}
删除套接字;
删除地址;
}
}
我只听到一些声音之间的差距


顺便说一句,音频正被发送到IP摄像头p2接口。

首先,您需要创建并绑定一个插座。然后,您必须使用套接字API将存储在“samples”中的数据发送给另一个对等方。要使用套接字API发送数据,需要将此数据转换为char*。socket的发送API接收需要以字符*形式发送的数据输入。有关发送的更多信息,请访问链接。这是给windows的。对于Unix,您可以检查手册页中的send API For Unix。

首先,您需要创建并绑定套接字。然后,您必须使用套接字API将存储在“samples”中的数据发送给另一个对等方。要使用套接字API发送数据,需要将此数据转换为char*。socket的发送API接收需要以字符*形式发送的数据输入。有关发送的更多信息,请访问链接。这是给windows的。对于Unix,您可以检查手册页中的send API For Unix。

首先,您需要创建并绑定套接字。然后,您必须使用套接字API将存储在“samples”中的数据发送给另一个对等方。要使用套接字API发送数据,需要将此数据转换为char*。socket的发送API接收需要以字符*形式发送的数据输入。有关发送的更多信息,请访问链接。这是给windows的。对于Unix,您可以检查手册页中的send API For Unix。

首先,您需要创建并绑定套接字。然后,您必须使用套接字API将存储在“samples”中的数据发送给另一个对等方。要使用套接字API发送数据,需要将此数据转换为char*。socket的发送API接收需要以字符*形式发送的数据输入。有关发送的更多信息,请访问链接。这是给windows的。对于Unix,您可以查看手册页中的Unix发送API。

Int16*是指针。您获得的样本也应该具有关联的长度。您的数据可能位于两个地址之间:
[样本,样本+长度)
(其中
样本
是第一个样本的地址)

远程播放示例(实际代码将取决于您使用的API):

  • 开放式插座
  • 循环
    • 从麦克风中获取样本
    • 通过套接字传输数据

在服务器上,您必须在循环中读取样本,并将其发送到您使用的任何声音输出API。

Int16*是指针。您获取的样本还应具有关联的长度。您的数据可能位于地址之间:
[samples,samples+length)
(其中
samples
是第一个样本的地址)

远程播放示例(实际代码将取决于您使用的API):

  • 开放式插座
  • 循环
    • 从麦克风中获取样本
    • 通过套接字传输数据

在服务器上,您必须在循环中读取样本,并将其发送到您使用的任何声音输出API。

Int16*是指针。您获取的样本还应具有关联的长度。您的数据可能位于地址之间:
[samples,samples+length)
(其中
samples
是第一个样本的地址)

远程播放示例(实际代码将取决于您使用的API):

  • 开放式插座
  • 循环
    • 从麦克风中获取样本
    • 通过套接字传输数据
在t上
[size on 4 bytes][sample on `size` bytes]
[]   []   []   [][]  []   []  []  []   []
Int16 data;
const char* pBytesOfData = (const char*) &data;
int size = sizeof (Int16);

send( socket, pBytesOfdata, size, flags);