使用 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.

中找到