Обзор проблемы:
ОС: Ubuntu
Я использую утилиту qt для получения видеоданных с удаленной машины (удаленная машина использует gstreamer для отправки живых данных) и записи этих данных в порт, скажем, 5000.
Порт 5000 уже связан с другой утилитой gstreamer. эта утилита прослушивает порт 5000 и преобразует данные в потоковое видео. Очевидно, что вещи не совсем работают, и я не могу просматривать видео. Итак, у меня есть два вопроса:
1) С помощью утилиты Qt разрешено ли выполнять запись в порт 5000, хотя порт связан с утилитой gstreamer.
2) Я использую стороннюю библиотеку и ее API для получения данных из внешнего источника. Данные хранятся в массиве символов. Если я преобразую это в qbytearray, то размер qbytearray будет таким же, как у буфера char. пример
rc = zco_receive_source(sdr, &reader, bytesToRead, buffer); // this is 3rd part functionqDebug() << " copy buffer size =" << rc; // genrally this size is 1412
QByteArray msgRecvd;
msgRecvd = QByteArray(reinterpret_cast<char*>(buffer), rc);
if(! msgRecvd.isEmpty() )
{
qDebug() << " size of msgRecv =" << msgRecvd.size();// again 1412
udpSock->writeDatagram( msgRecvd, QHostAddress::LocalHost, 5000 );
}
Но если я использую QDataStream, то QbyteArray получил 4 дополнительных байта. код показан ниже
rc = zco_receive_source(sdr, &reader, bytesToRead, buffer); // this is 3rd part functionqDebug() << " copy buffer size =" << rc; // genrally this size is 1412
QByteArray msgRecvd;
QDataStream dataStream( &msgRecvd, QIODevice::WriteOnly );
dataStream.writeBytes( ( const char* )buffer, rc );
if(! msgRecvd.isEmpty() )
{
qDebug() << " size of msgRecv =" << msgRecvd.size();// got 4 extra bytes .. size is 1415. why ???
udpSock->writeDatagram( msgRecvd, QHostAddress::LocalHost, 5000 );
}
Я хочу знать, почему QbyteArray получил дополнительный символ и нужно ли сериализовать данные для пересылки на порт 5000?
Отвечая на второй вопрос:
Попробуйте QDataStream :: writeRawData ().
Форма Qt docs:
QDataStream & QDataStream::writeBytes(const char * s, uint len)
Writes the length specifier len and the buffer s to the stream and returns a reference to the stream.
The len is serialized as a quint32, followed by len bytes from s. Note that the data is not encoded.
Других решений пока нет …