Как я могу использовать QUdpSocket и QAudioOutput для потоковой передачи? - PullRequest
0 голосов
/ 17 сентября 2018

Мне нужно для потоковой передачи файла песни * .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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...