как воспроизвести голос из QByteArray в Qt

Я хочу воспроизвести музыку из 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


person Community    schedule 28.06.2016    source источник
comment
Нет смысла вызывать метод QBuffer::errorString: буфер никогда не может находиться в состоянии ошибки, поэтому строковое представление ошибки не имеет смысла.   -  person Kuba hasn't forgotten Monica    schedule 29.06.2016


Ответы (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();
}
person PeterT    schedule 28.06.2016
comment
во-первых, спасибо за ваш повтор, он отлично работает в основном, но когда я использую его при нажатии кнопки push_button, я получаю сбой при нажатии кнопки, которую я могу редактировать в вопросе - person ; 28.06.2016
comment
@hello, вам нужно убедиться, что ByteArray и QBuffer выживут в вашей функции, поэтому вам придется сделать QByteArray *arr = new QByteArray(file.readAll()); QBuffer *buffer = new QBuffer(arr); (возможно, передать QMediaPlayer в качестве родителя или управлять временем жизни самостоятельно). Но ничего из этого не имеет отношения к вашему первоначальному вопросу - person PeterT; 28.06.2016
comment
Вызов метода errorString для чего-либо в Qt без проверки наличия ошибки с самого начала бессмысленен и может привести к неверным выводам. QBuffer не имеет метода error() и вообще не может сообщать об ошибках, поэтому вызов errorString() всегда неправильный. Сначала необходимо проверить error() QMediaPlayer, и только в случае ошибки следует вызывать errorString() и выдавать отладочный вывод. - person Kuba hasn't forgotten Monica; 29.06.2016