使用 Qt 录制网络广播流
Record a Web radio stream Using Qt
我需要从使用 Qt 及其 QMediaplayer Class 播放的互联网广播流中获取数据,如下所示:
player->setMedia(QMediaContent(QUrl("http://rfm-live-mp3-64.scdn.arkena.com/rfm.mp3")),
但我不知道如何访问流数据并将其记录到缓冲区或文件中。我尝试了 QAUdioRecorder,但可用的 audioIn 似乎只是麦克风。
有谁知道 Qt 是否可行?
谢谢!
编辑--------------------
这是带有 eyllanesc 建议的代码:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QFile file(R"(D:\Mes_Projets_Qt_Creator\build-TestQtDesignWidget-
Desktop_Qt_5_11_0_MinGW_32bit-Debug\ML.wav)");
file.open(QIODevice::ReadOnly);
QByteArray arr = file.readAll();
QBuffer *buffer = new QBuffer(player);
buffer->setData(arr);
buffer->open(QIODevice::ReadOnly);
QFile autreFile("hello.wav");
autreFile.open(QIODevice::WriteOnly);
QDataStream out(&autreFile);
out << arr;
QAudioFormat format;
format.setSampleRate(22050);
format.setChannelCount(1);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
if (!info.isFormatSupported(format)) {
qWarning() << "Raw audio format not supported by backend, cannot play
audio.";
return;
}
QAudioOutput* audioOutput = new QAudioOutput(format, this);
audioOutput->start(buffer);
foreach (const QAudioDeviceInfo &deviceInfo,
QAudioDeviceInfo::availableDevices(QAudio::AudioOutput))
qDebug() << "Device name: " << deviceInfo.deviceName();
QNetworkAccessManager nam;
QNetworkRequest request(QUrl("http://rfm-live-mp3-
64.scdn.arkena.com/rfm.mp3"));
QString downloadDir =
QStandardPaths::writableLocation(QStandardPaths::DownloadLocation);
QFile file2(QDir(downloadDir).absoluteFilePath("test.mp3"));
QDataStream ds(&file2);
if(!file2.open(QFile::WriteOnly))
//return -1;
QNetworkReply *reply = nam.get(request);
QObject::connect(reply, &QNetworkReply::downloadProgress, [reply, &ds]
(qint64 bytesReceived, qint64 bytesTotal){
ds << reply->readAll();
qDebug()<<bytesReceived<<bytesTotal;
});
qDebug()<<reply;
对于这种情况,您可以使用 QNetworkAccessManager
下载文件,如下所示:
#include <QCoreApplication>
#include <QDataStream>
#include <QDir>
#include <QFile>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QStandardPaths>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QNetworkAccessManager nam;
QNetworkRequest request(QUrl("http://rfm-live-mp3-64.scdn.arkena.com/rfm.mp3"));
QString downloadDir = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation);
QFile file(QDir(downloadDir).absoluteFilePath("test.mp3"));
QDataStream ds(&file);
if(!file.open(QFile::WriteOnly))
return -1;
QNetworkReply *reply = nam.get(request);
QObject::connect(reply, &QNetworkReply::downloadProgress, [reply, &ds](qint64 bytesReceived, qint64 bytesTotal){
ds << reply->readAll();
qDebug()<<bytesReceived<<bytesTotal;
});
qDebug()<<reply;
return a.exec();
}
更新:
在下面的示例中,我展示了如何在 GUI 中实现我的解决方案,为此我使用 Qt Designer 构建了以下界面:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QFile>
#include <QMainWindow>
#include <QNetworkAccessManager>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal);
void on_selectButton_clicked();
void on_startButton_clicked();
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
QNetworkAccessManager mNam;
QFile mFile;
QDataStream mDs;
QNetworkReply *reply;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDir>
#include <QFile>
#include <QApplication>
#include <QNetworkReply>
#include <QFileDialog>
#include <QLineEdit>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->leUrl->setText("http://rfm-live-mp3-64.scdn.arkena.com/rfm.mp3");
ui->leOutput->setText(QDir(qApp->applicationDirPath()).absoluteFilePath("test.mp3"));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal)
{
mDs << reply->readAll();
qDebug()<<bytesReceived<< bytesTotal;
}
void MainWindow::on_selectButton_clicked()
{
QString filename =QFileDialog::getSaveFileName(this, "Select ", qApp->applicationDirPath());
ui->leOutput->setText(filename);
}
void MainWindow::on_startButton_clicked()
{
mFile.setFileName(ui->leOutput->text());
mDs.setDevice(&mFile);
if(!mFile.open(QFile::WriteOnly))
return;
QNetworkRequest request(QUrl(ui->leUrl->text()));
reply = mNam.get(request);
connect(reply, &QNetworkReply::downloadProgress, this, &MainWindow::onDownloadProgress);
}
void MainWindow::on_pushButton_clicked()
{
if(reply){
reply->disconnect(SIGNAL(downloadProgress(qint64,qint64)));
reply->abort();
mFile.close();
reply->deleteLater();
}
}
完整的例子可以在下面link.
中找到
我需要从使用 Qt 及其 QMediaplayer Class 播放的互联网广播流中获取数据,如下所示:
player->setMedia(QMediaContent(QUrl("http://rfm-live-mp3-64.scdn.arkena.com/rfm.mp3")),
但我不知道如何访问流数据并将其记录到缓冲区或文件中。我尝试了 QAUdioRecorder,但可用的 audioIn 似乎只是麦克风。
有谁知道 Qt 是否可行?
谢谢!
编辑-------------------- 这是带有 eyllanesc 建议的代码:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QFile file(R"(D:\Mes_Projets_Qt_Creator\build-TestQtDesignWidget-
Desktop_Qt_5_11_0_MinGW_32bit-Debug\ML.wav)");
file.open(QIODevice::ReadOnly);
QByteArray arr = file.readAll();
QBuffer *buffer = new QBuffer(player);
buffer->setData(arr);
buffer->open(QIODevice::ReadOnly);
QFile autreFile("hello.wav");
autreFile.open(QIODevice::WriteOnly);
QDataStream out(&autreFile);
out << arr;
QAudioFormat format;
format.setSampleRate(22050);
format.setChannelCount(1);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
if (!info.isFormatSupported(format)) {
qWarning() << "Raw audio format not supported by backend, cannot play
audio.";
return;
}
QAudioOutput* audioOutput = new QAudioOutput(format, this);
audioOutput->start(buffer);
foreach (const QAudioDeviceInfo &deviceInfo,
QAudioDeviceInfo::availableDevices(QAudio::AudioOutput))
qDebug() << "Device name: " << deviceInfo.deviceName();
QNetworkAccessManager nam;
QNetworkRequest request(QUrl("http://rfm-live-mp3-
64.scdn.arkena.com/rfm.mp3"));
QString downloadDir =
QStandardPaths::writableLocation(QStandardPaths::DownloadLocation);
QFile file2(QDir(downloadDir).absoluteFilePath("test.mp3"));
QDataStream ds(&file2);
if(!file2.open(QFile::WriteOnly))
//return -1;
QNetworkReply *reply = nam.get(request);
QObject::connect(reply, &QNetworkReply::downloadProgress, [reply, &ds]
(qint64 bytesReceived, qint64 bytesTotal){
ds << reply->readAll();
qDebug()<<bytesReceived<<bytesTotal;
});
qDebug()<<reply;
对于这种情况,您可以使用 QNetworkAccessManager
下载文件,如下所示:
#include <QCoreApplication>
#include <QDataStream>
#include <QDir>
#include <QFile>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QStandardPaths>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QNetworkAccessManager nam;
QNetworkRequest request(QUrl("http://rfm-live-mp3-64.scdn.arkena.com/rfm.mp3"));
QString downloadDir = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation);
QFile file(QDir(downloadDir).absoluteFilePath("test.mp3"));
QDataStream ds(&file);
if(!file.open(QFile::WriteOnly))
return -1;
QNetworkReply *reply = nam.get(request);
QObject::connect(reply, &QNetworkReply::downloadProgress, [reply, &ds](qint64 bytesReceived, qint64 bytesTotal){
ds << reply->readAll();
qDebug()<<bytesReceived<<bytesTotal;
});
qDebug()<<reply;
return a.exec();
}
更新:
在下面的示例中,我展示了如何在 GUI 中实现我的解决方案,为此我使用 Qt Designer 构建了以下界面:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QFile>
#include <QMainWindow>
#include <QNetworkAccessManager>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal);
void on_selectButton_clicked();
void on_startButton_clicked();
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
QNetworkAccessManager mNam;
QFile mFile;
QDataStream mDs;
QNetworkReply *reply;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDir>
#include <QFile>
#include <QApplication>
#include <QNetworkReply>
#include <QFileDialog>
#include <QLineEdit>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->leUrl->setText("http://rfm-live-mp3-64.scdn.arkena.com/rfm.mp3");
ui->leOutput->setText(QDir(qApp->applicationDirPath()).absoluteFilePath("test.mp3"));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal)
{
mDs << reply->readAll();
qDebug()<<bytesReceived<< bytesTotal;
}
void MainWindow::on_selectButton_clicked()
{
QString filename =QFileDialog::getSaveFileName(this, "Select ", qApp->applicationDirPath());
ui->leOutput->setText(filename);
}
void MainWindow::on_startButton_clicked()
{
mFile.setFileName(ui->leOutput->text());
mDs.setDevice(&mFile);
if(!mFile.open(QFile::WriteOnly))
return;
QNetworkRequest request(QUrl(ui->leUrl->text()));
reply = mNam.get(request);
connect(reply, &QNetworkReply::downloadProgress, this, &MainWindow::onDownloadProgress);
}
void MainWindow::on_pushButton_clicked()
{
if(reply){
reply->disconnect(SIGNAL(downloadProgress(qint64,qint64)));
reply->abort();
mFile.close();
reply->deleteLater();
}
}
完整的例子可以在下面link.
中找到