【问题标题】:how to play a voice from QByteArray in Qt如何在 Qt 中播放来自 QByteArray 的声音
【发布时间】:2016-10-31 05:00:33
【问题描述】:

我想播放来自 QByteArray 的音乐,因此我可以在许多情况下使用它来从数据库中检索声音或使用 Tcp 等通过网络传输它。
所以我使用这些代码行

QFile file("E:\\amr.mp3");    // sound dir
file.open(QIODevice::ReadOnly);
QByteArray arr = file.readAll(); // change it to QbyteArray
QBuffer buffer(&arr);  
qDebug() << "Buffer error = " << buffer.errorString();  // i get error from here "unkow error"

QMediaPlayer *player = new QMediaPlayer();
player->setMedia(QMediaContent(),&buffer);

player->play();
qDebug() << "Player error = " << player->errorString(); // no error ""

我在搜索时看到了很多解决方案,其中一个在 stackoverflow 解决方案是制作一个 Qbuffer,将数组传递给它并将其放入 setMedia 但它不起作用 所以我需要任何帮助来运行此代码或以任何其他方式从 QByteArray 播放声音或音乐

【问题讨论】:

  • 调用QBuffer::errorString方法没有意义:缓冲区永远不会处于错误状态,因此错误的字符串表示是没有意义的。

标签: c++ qt qbytearray qmediaplayer


【解决方案1】:

你只是忘了用

打开缓冲区
buffer.open(QIODevice::ReadOnly);

所以一个完整的工作演示程序是这样的:

#include <QApplication>
#include <QMediaPlayer>
#include <QFile>
#include <QBuffer>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);


    QFile file(R"(C:\test.mp3)");    // sound dir
    file.open(QIODevice::ReadOnly);
    QByteArray arr = file.readAll(); 

    QMediaPlayer *player = new QMediaPlayer(&a);

    QBuffer *buffer = new QBuffer(player);
    buffer->setData(arr);
    buffer->open(QIODevice::ReadOnly);

    player->setMedia(QMediaContent(),buffer);

    player->play();

    return a.exec();
}

【讨论】:

  • 首先感谢您的重播,它在主程序中运行良好,但是当我在 push_button 单击时使用它时,按下按钮时我会崩溃,我可以在问题中进行编辑
  • @hello 您需要确保 ByteArray 和 QBuffer 在您的函数中存在,因此您必须执行 QByteArray *arr = new QByteArray(file.readAll()); QBuffer *buffer = new QBuffer(arr); (可能将 QMediaPlayer 作为父级传递或自己管理生命周期)。但这与您的原始问题无关
  • 在 Qt 中的任何内容上调用 errorString 方法而不验证是否有错误开始是没有意义的,并且可能导致错误的结论。一个QBuffer 没有error() 方法,也根本无法报告错误,所以调用它的errorString() 总是错误的。必须首先检查QMediaPlayererror(),并且只有在出现错误时才调用errorString() 并发出调试输出。
猜你喜欢
  • 2014-04-21
  • 1970-01-01
  • 2018-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 2011-01-08
相关资源
最近更新 更多