How I can play streaming audio over Ethernet in Qt?

懵懂的女人 提交于 2019-11-28 21:53:57
HoBBiT

This problem was solved. QAdioOutput has two modes; there are "push" and "pull". I give a pointer to a QIODevice, and write data directly to this. Solution:

Reading UDP socket:

void MainWindow::on_start_rx_triggered()
{
    udpSocketin = new QUdpSocket(this);
    udpSocketin->bind(localPORT);
    connect(udpSocketin, SIGNAL(readyRead()), this, SLOT(readDatagrams()));
    QDataStream out(&datagramout, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_7);
    timer2 = new QTimer (this);
    connect(timer2, SIGNAL(timeout()), this, SLOT(playbuff()));
    timer2->setInterval(15*9);
    audioout = new QAudioOutput(format, this);
    input = audioout->start();
}

void MainWindow::readDatagrams()
{
    if (udpSocketin->hasPendingDatagrams()){
    datagramin.resize(udpSocketin->pendingDatagramSize());
    qint64 receiveBytes = udpSocketin->readDatagram(datagramin.data(), datagramin.size());
    if (receiveBytes <= 0)
    {
        msg.warning(this, "File ERROR", "The end!", QMessageBox::Ok);
        emit on_stop_rx_triggered();
    }
    QDataStream in(&datagramin, QIODevice::ReadOnly);
    in.setVersion(QDataStream::Qt_4_7);
    quint64 size = 0;
    if(in.device()->size() > sizeof(quint64))
    {
        in >> size;
    }
    else return;
    in >> rxfilename;
    in >> name;
    in >> payloadin;
    emit jitterbuff();
}

void MainWindow::jitterbuff()
{
    if (buff_pos < SIZE_OF_BUF)
    {
        buffered.append(payloadin);
        buff_pos++;
    }
    else
    {
        timer2->start();
        buffered.clear();
        buff_pos = 0;
    }
}

void MainWindow::playbuff()
{
    if (!buffered.isEmpty())
    {
        buffer = new QBuffer(&buffered);
        buffer->open(QIODevice::ReadOnly);
        input->write(buffered);
        buffer->close();
    }
}

Writing to UDP socket:

void MainWindow::on_start_tx_triggered()
{
    timer1 = new QTimer (this);
    udpSocketout = new QUdpSocket(this);
    inputFile.setFileName(playlist.at(playIDfile));
    if (!inputFile.open(QIODevice::ReadOnly))
    {
        msg.warning(this, "File ERROR", "File not found!", QMessageBox::Ok);
        return;
    }
    fileinfo = new QFileInfo (inputFile);
    txfilename = fileinfo->fileName();
    ui->playedFile->setText("Now played: " + txfilename);
    connect(timer1, SIGNAL(timeout()), this, SLOT(writeDatagrams()));
    timer1->start(15);
}
void  MainWindow::writeDatagrams()
{

    if(!inputFile.atEnd()){
        payloadout = inputFile.read(SIZE_OF_SOUND);
        QDataStream out(&datagramout, QIODevice::WriteOnly);
        out.setVersion(QDataStream::Qt_4_7);
        out << qint64(0);
        out << txfilename;
        out << name;
        out << payloadout;
        out.device()->seek(qint64(0));
        out << qint64(datagramout.size() - sizeof(qint64));
        qint64 writtenBytes = udpSocketout->writeDatagram(datagramout, remoteHOST, remotePORT);
    }
}

If somebody will have seems problem, I will try to help him/her.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!