我需要从我使用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;
答案 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构建了以下界面:
<强> 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中找到。