Мне нужно для потоковой передачи файла песни * .wav по локальной сети. Я пытался использовать это Как я могу воспроизводить потоковое аудио через Ethernet в Qt? , но не работает. Я попытался создать буфер и одновременно запустить его, но звука нет вообще. Идея в том, что я передаю аудиофайл и одновременно играю через udp, как если бы это было радио.
Получатель:
void Widget::on_listenStation_clicked()
{
quint16 port = ui->portStation->value();
QHostAddress ip;
ip.setAddress( ui->lineEdit_Ip->text());
uSocket->bind( port, QUdpSocket::ShareAddress);
connect(uSocket, SIGNAL(readyRead()),this, SLOT(processPendingDatagrams()));
ui->textEdit->append("Listening");
}
void Widget::processPendingDatagrams()
{
char *data;
QByteArray datagram;
QHostAddress address;
QAudioOutput* audio;
QAudioFormat format;
format.setSampleRate(44100);
format.setChannelCount(2);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::UnSignedInt);
while (uSocket->hasPendingDatagrams()) {
datagram.resize (uSocket->pendingDatagramSize ());
qint64 writtedBytes = uSocket->readDatagram (datagram.data (), datagram.size (), &address);
QBuffer buffer(&datagram);
buffer.open(QIODevice::ReadOnly);
// data = datagram.data ();
audio = new QAudioOutput(format);
audio->start(&buffer);
buffer.close();
qDebug()<<datagram.data();
qDebug() << "Recive" << writtedBytes << " bytes.";
}
}
Отправитель:
void Widget::on_pushButton_enviar_clicked()
{
QByteArray data;
//Data.append("Hello UDP");
QFile file("G:/LinkinPark2.wav");
if(!file.open(QFile::ReadOnly)){
QMessageBox::warning(this, "title", "file not open");
}
//QTextStream out(&Data, QIODevice::WriteOnly);
for(;;){
if(!file.atEnd()){
// 320
data = file.read(320);
qint64 writtenBytes = mSocket->writeDatagram(data, QHostAddress::LocalHost, 1235);
qDebug() << "Sent " << writtenBytes << " bytes.";
}else{
break;
}
qDebug()<<data;
}
file.flush();
file.close();
}