使用Qt记录Web广播流

时间:2018-06-08 15:58:33

标签: c++ qt stream streaming

我需要从我使用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;

1 个答案:

答案 0 :(得分:0)

在这种情况下,您可以使用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构建了以下界面:

enter image description here

enter image description here

<强> 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中找到。