An example of how to streaming audio over network using Qt
2015-06-17 14:54
513 查看
//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
#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
相关文章推荐