您的位置:首页 > 编程语言 > Qt开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: