博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
An example of how to streaming audio over network using Qt
阅读量:4059 次
发布时间:2019-05-25

本文共 8121 字,大约阅读时间需要 27 分钟。

//client.

#include "mainwindow.h"

#include <QtCore>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();

}

<?xml version="1.0" encoding="UTF-8"?>

<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>151</width>
    <height>131</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <layout class="QGridLayout" name="gridLayout">
    <item row="2" column="0">
     <widget class="QLabel" name="label">
      <property name="text">
       <string>Server:</string>
      </property>
     </widget>
    </item>
    <item row="6" column="0">
     <widget class="QLabel" name="label_2">
      <property name="text">
       <string>Port:</string>
      </property>
     </widget>
    </item>
    <item row="10" column="0">
     <spacer name="horizontalSpacer">
      <property name="orientation">
       <enum>Qt::Horizontal</enum>
      </property>
      <property name="sizeHint" stdset="0">
       <size>
        <width>40</width>
        <height>20</height>
       </size>
      </property>
     </spacer>
    </item>
    <item row="10" column="2">
     <widget class="QPushButton" name="pushButton">
      <property name="text">
       <string>Connect</string>
      </property>
     </widget>
    </item>
    <item row="4" column="0" colspan="3">
     <widget class="QLineEdit" name="lineEdit"/>
    </item>
    <item row="7" column="0" colspan="3">
     <widget class="QLineEdit" name="lineEdit_2"/>
    </item>
   </layout>
  </widget>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtCore>
#include <QtGui>
#include <QtWidgets>
#include "client.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    void on_pushButton_clicked();
private:
    Ui::MainWindow *ui;
    Client *client;
};

#endif // MAINWINDOW_H

#include "mainwindow.h"

#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setFixedSize(size());
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_pushButton_clicked()
{
    QString host = ui->lineEdit->text();
    quint16 port = ui->lineEdit_2->text().toInt();
    client = new Client(host, port, this);
    ui->lineEdit->setEnabled(false);
    ui->lineEdit_2->setEnabled(false);
    ui->pushButton->setEnabled(false);
}

#ifndef CLIENT_H

#define CLIENT_H
#include <QtCore>
#include <QtNetwork>
#include "audiooutput.h"
class Client : public QObject
{
    Q_OBJECT
public:
    explicit Client(QString host, quint16 port, QObject *parent = 0);
signals:
public slots:
private slots:
    void readyRead();
private:
    QTcpSocket *socket;
    AudioOutput output;
};
#endif // CLIENT_H

#include "client.h"

Client::Client(QString host, quint16 port, QObject *parent) : QObject(parent)
{
    socket = new QTcpSocket(this);
    socket->connectToHost(host, port);
    connect(socket, SIGNAL(readyRead()), SLOT(readyRead()));
}
void Client::readyRead()
{
    QByteArray data;
    while (socket->bytesAvailable() > 0)
        data.append(socket->readAll());
    output.writeData(data);
}

#ifndef AUDIOOUTPUT_H

#define AUDIOOUTPUT_H
#include <QtCore>
#include <QtMultimedia>
class AudioOutput : public QObject
{
    Q_OBJECT
public:
    explicit AudioOutput(QObject *parent = 0);
signals:
public slots:
    void writeData(QByteArray data);
private:
    QAudioOutput *audio;
    QIODevice *device;
};
#endif // AUDIOOUTPUT_H

#include "audiooutput.h"

AudioOutput::AudioOutput(QObject *parent) : QObject(parent)
{
    QAudioFormat format;
    format.setChannelCount(1);
    format.setSampleRate(8000);
    format.setSampleSize(8);
    format.setCodec("audio/pcm");
    format.setByteOrder(QAudioFormat::LittleEndian);
    format.setSampleType(QAudioFormat::UnSignedInt);
    audio = new QAudioOutput(format, this);
    audio->setBufferSize(8192);
    device = audio->start();
}
void AudioOutput::writeData(QByteArray data)
{
    device->write(data.data(), data.size());
}

QT       += core gui multimedia network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = Client
TEMPLATE = app
SOURCES += main.cpp\
        mainwindow.cpp \
    audiooutput.cpp \
    client.cpp
HEADERS  += mainwindow.h \
    audiooutput.h \
    client.h
FORMS    += mainwindow.ui

//server.

#include "mainwindow.h"

#include <QtCore>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtCore>
#include <QtGui>
#include <QtWidgets>
#include "audioinput.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    void getDevInfo();
    void on_pushButton_clicked();
private:
    Ui::MainWindow *ui;
    AudioInput *input;
    Server *server;
};
#endif // MAINWINDOW_H

#include "mainwindow.h"

#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setFixedSize(size());
    getDevInfo();
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::getDevInfo()
{
    QList<QAudioDeviceInfo> devices = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);
    if (devices.isEmpty()) QMessageBox::warning(this, "Error", "No input device found!");
    for(int i = 0; i < devices.size(); ++i)
        ui->comboBox->addItem(devices.at(i).deviceName(), qVariantFromValue(devices.at(i)));
}
void MainWindow::on_pushButton_clicked()
{
    QAudioDeviceInfo devinfo = ui->comboBox->itemData(ui->comboBox->currentIndex()).value<QAudioDeviceInfo>();
    input = new AudioInput(devinfo, this);
    quint16 port = ui->lineEdit->text().toInt();
    server = new Server(port, this);
    connect(input, SIGNAL(dataReady(QByteArray)), server, SLOT(writeData(QByteArray)));
    ui->comboBox->setEnabled(false);
    ui->lineEdit->setEnabled(false);
    ui->pushButton->setEnabled(false);
}

#ifndef SERVER_H

#define SERVER_H
#include <QtCore>
#include <QtNetwork>
class Server : public QObject
{
    Q_OBJECT
public:
    explicit Server(quint16 port, QObject *parent = 0);
signals:
public slots:
    void writeData(QByteArray data);
private slots:
    void newConnection();
    void zeropointer();
private:
    QTcpServer *server;
    QTcpSocket *socket;
};
#endif // SERVER_H

#include "server.h"

Server::Server(quint16 port, QObject *parent) : QObject(parent)
{
    socket = 0;
    server = new QTcpServer(this);
    connect(server, SIGNAL(newConnection()), SLOT(newConnection()));
    server->listen(QHostAddress::Any, port);
}
void Server::newConnection()
{
    socket = server->nextPendingConnection();
    connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
    connect(socket, SIGNAL(destroyed()), SLOT(zeropointer()));
}
void Server::zeropointer()
{
    socket = 0;
}
void Server::writeData(QByteArray data)
{
    if (socket)
        socket->write(data);
}
#ifndef AUDIOINPUT_H
#define AUDIOINPUT_H
#include <QtCore>
#include <QtMultimedia>
#include "server.h"
class AudioInput : public QObject
{
    Q_OBJECT
public:
    explicit AudioInput(QAudioDeviceInfo devinfo, QObject *parent = 0);
signals:
    void dataReady(QByteArray data);
public slots:
private slots:
    void readyRead();
private:
    QAudioInput *audio;
    QIODevice *device;
};
#endif // AUDIOINPUT_H

#include "audioinput.h"

AudioInput::AudioInput(QAudioDeviceInfo devinfo, QObject *parent) : QObject(parent)
{
    QAudioFormat format;
    format.setChannelCount(1);
    format.setSampleRate(8000);
    format.setSampleSize(8);
    format.setCodec("audio/pcm");
    format.setByteOrder(QAudioFormat::LittleEndian);
    format.setSampleType(QAudioFormat::UnSignedInt);
    audio = new QAudioInput(devinfo, format, this);
    audio->setBufferSize(8192);
    device = audio->start();
    connect(device, SIGNAL(readyRead()), SLOT(readyRead()));
}
void AudioInput::readyRead()
{
    QByteArray data;
    //Check the number of samples in input buffer
    qint64 len = audio->bytesReady();
    //Read sound samples from input device to buffer
    if (len > 0)
    {
        data.resize(len);
        device->read(data.data(), len);
    }
    emit dataReady(data);
}
QT       += core gui multimedia network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = Server
TEMPLATE = app
SOURCES += main.cpp\
        mainwindow.cpp \
    audioinput.cpp \
    server.cpp
HEADERS  += mainwindow.h \
    audioinput.h \
    server.h
FORMS    += mainwindow.ui

转载地址:http://qbzji.baihongyu.com/

你可能感兴趣的文章
IOS开发的开源库
查看>>
IOS开发的开源库
查看>>
Jenkins - sonarqube 代码审查
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成(一)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 单机部署(二)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 高可用集群部署(三)
查看>>
Golang struct 指针引用用法(声明入门篇)
查看>>
Linux 粘滞位 suid sgid
查看>>
C#控件集DotNetBar安装及破解
查看>>
Winform皮肤控件IrisSkin4.dll使用
查看>>
Winform多线程
查看>>
C# 托管与非托管
查看>>
Node.js中的事件驱动编程详解
查看>>
mongodb 命令
查看>>
MongoDB基本使用
查看>>
mongodb管理与安全认证
查看>>
nodejs内存控制
查看>>
nodejs Stream使用中的陷阱
查看>>
MongoDB 数据文件备份与恢复
查看>>
数据库索引介绍及使用
查看>>