我正在使用SFML从麦克风中捕获一些音频。 数据存储在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;
}
}
我在间隙之间只收到一些噪音。
顺便说一句。音频正被发送到IP摄像机p2连接器。
答案 0 :(得分:3)
数据格式就是您的应用程序处理它们的方式。毕竟你通过套接字发送原始字节。你可以用你想要的任何东西做到这一点
Int16 data;
const char* pBytesOfData = (const char*) &data;
int size = sizeof (Int16);
send( socket, pBytesOfdata, size, flags);
当字节到达第二端时,您可以正确解释它们。可能你会想要再次将它们视为Int16。你需要有一个协议(通用的通信方式)来做正确的事情(可能在传输开始时发送数据大小等)。
您还可以查看易于serialization的图书馆:Boost.Asio和Boost.Serialization。
答案 1 :(得分:0)
首先,您需要创建并绑定套接字。然后你必须发送存储在&#34;样本&#34;通过使用套接字API到另一个对等体。要使用套接字API发送数据,您需要将此数据转换为char *。由于socket的发送API需要输入您需要作为char *发送的数据。有关发送的详细信息,请访问this链接。这是为了窗户。对于Unix,您可以查看unix的send API的联机帮助页。
答案 2 :(得分:0)
Int16 *是一个指针。你得到的样本也应该有一个相关的长度。您的数据可能位于地址之间:[samples, samples + length)
(其中samples
是第一个样本的地址)。
远程播放示例(实际代码取决于您使用的API):
在服务器上,您必须在循环中读取样本并将它们发送到您使用的任何声音输出API。
答案 3 :(得分:0)
套接字使用字节,所以最后你会发送字节。只要您在接收端解释这些字节的方式与您发送的数据匹配,就可以在这些字节中发送您想要的任何内容。
在这种情况下,直接发送样本而不进行转换似乎是最简单的事情,但您可能需要先发送样本的大小,很可能是固定长度格式,例如:
[size on 4 bytes][sample on `size` bytes]
[] [] [] [][] [] [] [] [] []