2016-06-28 5 views
1

Я хочу воспроизвести музыку из QByteArray, поэтому во многих случаях я могу использовать ее для извлечения звука из базы данных или передачи его по сети с помощью Tcp и т. Д.
Так что я использую эти строки кодакак играть голос из QByteArray в Qt

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

+1

Там нет смысла называть 'метод QBuffer :: errorString': буфер никогда не может находиться в состояние ошибки, поэтому строковое представление ошибки не имеет смысла. –

ответ

3

Вы просто забыли открыть буфер с

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(); 
} 
+1

первое спасибо за ваш повтор, он отлично работает в главном, но когда я его использую на push_button, я нажимаю, я получаю сбой, когда нажимаю кнопку, которую я могу редактировать в вопросе –

+2

@hello вам нужно убедиться, что ByteArray и QBuffer выживают функция, поэтому вам придется делать QByteArray * arr = new QByteArray (file.readAll()); QBuffer * buffer = new QBuffer (arr); '(возможно, передать QMediaPlayer как родительский или управлять временем жизни самостоятельно). Но ничто из этого не имеет отношения к вашему исходному вопросу. – PeterT

+1

Вызов метода 'errorString' на что-либо в Qt без проверки того, что есть ошибка для начала, бессмысленна и может привести к неправильным выводам. У 'QBuffer' нет метода' error() 'и вообще нет сообщений об ошибках, поэтому вызов' errorString() 'всегда неверен. Сначала нужно проверить 'error()' QMediaPlayer', и только если есть ошибка, вы должны вызывать 'errorString()' и испускать вывод отладки. –

Смежные вопросы