Я хочу отправить двоичные аудиоданные в службу IBM watson STT через соединение через веб-сокет.Я успешно установил соединение и теперь пытаюсь отправить данные в следующем формате:
{
"action":"start",
"content-type": "audio/l16;rate=44100"
}
<binary audio data>
{
"action":"stop"
}
для этого: Я читаю необработанный аудиофайл (extn .pcm ) как показано ниже
#include <string>
#include <fstream>
ifstream fin;
string binarydata, bdataline;
fin.open("/home/rohan/TestFile.pcm", ios::binary | ios::in);
while (fin) {
// Read a Line from File
getline(fin, bdataline);
binarydata = binarydata + bdataline;
}
Вопрос 1: Я не уверен, правильно ли я читаю двоичные данные.Должен ли тип данных binarydata
быть string
?
Далее для отправки данных на веб-сокет наддува (после рукопожатия) я выполнил эту процедуру
void on_handshake(beast::error_code ec)
{
if(ec)
return fail(ec, "handshake");
// Send the Start message
ws_.async_write(net::buffer("{\"action\":\"start\",\"content-type\": \"audio/l16;rate=44100\"}"), bind(&session::on_start, shared_from_this(), placeholders::_1));
}
void on_start(beast::error_code ec)
{
if(ec)
return fail(ec, "write:start");
ws_.async_write(net::buffer(binarydata), bind(&session::on_binarysent, shared_from_this(), placeholders::_1));
}
void on_binarysent(beast::error_code ec)
{
if(ec)
return fail(ec, "write:Msg");
ws_.async_write(net::buffer("{\"action\":\"stop\"}"), bind(&session::on_write, shared_from_this(), placeholders::_1));
}
void on_write( beast::error_code ec) //,
{
if(ec)
return fail(ec, "write:end");
ws_.async_read(buffer_, bind(&session::on_start, shared_from_this(), placeholders::_1));
}
Программа не показываетлюбые выходные данные и выходы с
write: start: Поток WebSocket был аккуратно закрыт на обеих конечных точках
Вопрос 2: Идут ли данныеправильно, как ожидалось?Как это проверить?(ожидается: См. эту ссылку )
Как происходит закрытие веб-сокета без отправки команды закрытия?
ОБНОВЛЕНИЕ:
void on_start(beast::error_code ec)
{
if(ec)
return fail(ec, "write:start");
ifstream infile("/home/rohan/TestFile.pcm", ios::in | ios::binary);
streampos FileSize;
if (infile) {
// Get the size of the file
infile.seekg(0, ios::end);
FileSize = infile.tellg();
infile.seekg(0, ios::beg);
}
char binarydata[(size_t)FileSize];
ws_.binary(true);
// Send binary data
ws_.async_write(net::buffer(binarydata, sizeof(binarydata)), bind(&session::on_binarysent, shared_from_this(), placeholders::_1));
}