Russian Qt Forum

Qt => Общие вопросы => Тема начата: megido от Июнь 13, 2016, 21:19



Название: чем можно порисовать еще кроме QPainter? или как его заставить рисовать шустрее
Отправлено: megido от Июнь 13, 2016, 21:19
(https://i.gyazo.com/f14a5f4e9be4620da4536193715a6ff7.gif)
(сейчас вот так, гифка немного замедлена)
а вот так должно быть
(https://i.gyazo.com/a5860d8ab5c2bee6104b4ae07de1a392.gif)

но так даже лучше видно шлейфы

рисую вот так
Код:
    qreal widthLevel = m_level * height();
    painter.fillRect(0,0, 10,height(), Qt::black);
    painter.fillRect(0,height()-widthLevel,10, height(), Qt::red);
да кстати прямоугольники рисуются в цикле по очереди


Название: Re: чем можно порисовать еще кроме QPainter? или как его заставить рисовать шустрее
Отправлено: Racheengel от Июнь 13, 2016, 21:24
монитор поменять можно.
я никаких шлейфов не вижу.


Название: Re: чем можно порисовать еще кроме QPainter? или как его заставить рисовать шустрее
Отправлено: Old от Июнь 13, 2016, 21:31
монитор поменять можно.
я никаких шлейфов не вижу.
Тоже пока ничего не увидел.
Да и ускорить в таком простом рисовании что-то не просто.
Как вариант, можно не заливать черным весь виджет, а только верхнюю часть, а красным нижнюю.


Название: Re: чем можно порисовать еще кроме QPainter? или как его заставить рисовать шустрее
Отправлено: megido от Июнь 13, 2016, 21:32
монитор поменять можно.
я никаких шлейфов не вижу.
не с монитором все ок, наверно надо подганять проценты


Название: Re: чем можно порисовать еще кроме QPainter? или как его заставить рисовать шустрее
Отправлено: Old от Июнь 13, 2016, 21:34
монитор поменять можно.
я никаких шлейфов не вижу.
не с монитором все ок, наверно надо подганять проценты
Скорее всего нижний рисуется с каким-то усреднением, поэтому и нет сильных рывков.


Название: Re: чем можно порисовать еще кроме QPainter? или как его заставить рисовать шустрее
Отправлено: megido от Июнь 13, 2016, 21:46
монитор поменять можно.
я никаких шлейфов не вижу.
не с монитором все ок, наверно надо подганять проценты
Скорее всего нижний рисуется с каким-то усреднением, поэтому и нет сильных рывков.
ну вобще из QAudioBuffer'а вылазили какие то мелкие значение типа 0.041963 . я их умножил на 10.
а иначе там только на очень малый диапазон получается.
вобще почему это в буфере такие маленькие значения уровня?


Название: Re: чем можно порисовать еще кроме QPainter? или как его заставить рисовать шустрее
Отправлено: Old от Июнь 13, 2016, 21:54
Возможно там значения отскалены в диапазон [0..1]?


Название: Re: чем можно порисовать еще кроме QPainter? или как его заставить рисовать шустрее
Отправлено: megido от Июнь 13, 2016, 21:59
Возможно там значения отскалены в диапазон [0..1]?

не знаю. что это?

вот код какой выдает уровни

Код:
qreal getPeakValue(const QAudioFormat& format)
{
  //  qDebug() << format.codec();

    // Note: Only the most common sample formats are supported
    if (!format.isValid())
        return qreal(0);

    if (format.codec() != "audio/pcm")
        return qreal(0);

    switch (format.sampleType()) {
    case QAudioFormat::Unknown:
        break;
    case QAudioFormat::Float:
        if (format.sampleSize() != 32) // other sample formats are not supported
            return qreal(0);
        return qreal(1.00003);
    case QAudioFormat::SignedInt:
        if (format.sampleSize() == 32)
            return qreal(INT_MAX);
        if (format.sampleSize() == 16)
            return qreal(SHRT_MAX);
        if (format.sampleSize() == 8)
            return qreal(CHAR_MAX);
        break;
    case QAudioFormat::UnSignedInt:
        if (format.sampleSize() == 32)
            return qreal(UINT_MAX);
        if (format.sampleSize() == 16)
            return qreal(USHRT_MAX);
        if (format.sampleSize() == 8)
            return qreal(UCHAR_MAX);
        break;
    }

    return qreal(0);
}

// returns the audio level for each channel
QVector<qreal> getBufferLevels(const QAudioBuffer& buffer)
{
    QVector<qreal> values;

    if (!buffer.format().isValid() || buffer.format().byteOrder() != QAudioFormat::LittleEndian)
        return values;

    if (buffer.format().codec() != "audio/pcm")
        return values;

    int channelCount = buffer.format().channelCount();
    values.fill(0, channelCount);
    qreal peak_value = getPeakValue(buffer.format());
    if (qFuzzyCompare(peak_value, qreal(0)))
        return values;

    switch (buffer.format().sampleType()) {
    case QAudioFormat::Unknown:
    case QAudioFormat::UnSignedInt:
        if (buffer.format().sampleSize() == 32)
            values = getBufferLevels(buffer.constData<quint32>(), buffer.frameCount(), channelCount);
        if (buffer.format().sampleSize() == 16)
            values = getBufferLevels(buffer.constData<quint16>(), buffer.frameCount(), channelCount);
        if (buffer.format().sampleSize() == 8)
            values = getBufferLevels(buffer.constData<quint8>(), buffer.frameCount(), channelCount);
        for (int i = 0; i < values.size(); ++i)
            values[i] = qAbs(values.at(i) - peak_value / 2) / (peak_value / 2);
        break;
    case QAudioFormat::Float:
        if (buffer.format().sampleSize() == 32) {
            values = getBufferLevels(buffer.constData<float>(), buffer.frameCount(), channelCount);
            for (int i = 0; i < values.size(); ++i)
                values[i] /= peak_value;
        }
        break;
    case QAudioFormat::SignedInt:
        if (buffer.format().sampleSize() == 32)
            values = getBufferLevels(buffer.constData<qint32>(), buffer.frameCount(), channelCount);
        if (buffer.format().sampleSize() == 16)
            values = getBufferLevels(buffer.constData<qint16>(), buffer.frameCount(), channelCount);
        if (buffer.format().sampleSize() == 8)
            values = getBufferLevels(buffer.constData<qint8>(), buffer.frameCount(), channelCount);
        for (int i = 0; i < values.size(); ++i)
            values[i] /= peak_value;
        break;
    }

    return values;
}

template <class T>
QVector<qreal> getBufferLevels(const T *buffer, int frames, int channels)
{
    QVector<qreal> max_values;
    max_values.fill(0, channels);

    for (int i = 0; i < frames; ++i) {
        for (int j = 0; j < channels; ++j) {
            qreal value = qAbs(qreal(buffer[i * channels + j]));
            if (value > max_values.at(j))
                max_values.replace(j, value);
        }
    }
    return max_values;
}



может дело в рекордере какой я криво настроил? что-то там не устанавливаются настройки
Код:
QAudioEncoderSettings settings;
        settings.setCodec(QString('audio/mp3'));
        settings.setSampleRate(96000);
        settings.setBitRate(192);
        settings.setChannelCount(2);
        settings.setQuality(QMultimedia::EncodingQuality(100));

        QAudioRecorder *recorder = new QAudioRecorder();
        recorder->setEncodingSettings(settings, QVideoEncoderSettings(), QString('mp3'));


Название: Re: чем можно порисовать еще кроме QPainter? или как его заставить рисовать шустрее
Отправлено: Old от Июнь 13, 2016, 22:07
не знаю. что это?
Попробуйте widthLevel вычислять по формуле:
widthLevel = height() * val;

где val - это значение из QAudioBuffer.


Название: Re: чем можно порисовать еще кроме QPainter? или как его заставить рисовать шустрее
Отправлено: megido от Июнь 13, 2016, 22:09
не знаю. что это?
Попробуйте widthLevel вычислять по формуле:
widthLevel = height() * val;

где val - это значение из QAudioBuffer.
сейчас именно так и есть
потому 180*0.0557878 выходит мало


Название: Re: чем можно порисовать еще кроме QPainter? или как его заставить рисовать шустрее
Отправлено: Old от Июнь 13, 2016, 22:15
сейчас именно так и есть
потому 180*0.0557878 выходит мало
Возможно уровень сигнала очень низкий. Так а после умножения на 10, что не устраивает?


Название: Re: чем можно порисовать еще кроме QPainter? или как его заставить рисовать шустрее
Отправлено: megido от Июнь 13, 2016, 22:20
сейчас именно так и есть
потому 180*0.0557878 выходит мало
Возможно уровень сигнала очень низкий. Так а после умножения на 10, что не устраивает?
ну так может этому виной кривой файл? глянь там кодек pcm а должен быть другой(я разные ставил) ну и другие параметры я тоже настраивал и они не изменились. вобще что-то рекордер на настройки не реагирует


Название: Re: чем можно порисовать еще кроме QPainter? или как его заставить рисовать шустрее
Отправлено: Old от Июнь 13, 2016, 22:24
ну так может этому виной кривой файл? глянь там кодек pcm а должен быть другой(я разные ставил) ну и другие параметры я тоже настраивал и они не изменились. вобще что-то рекордер на настройки не реагирует
Так а файл играется нормально?
Я бы попробовал другие файлы поиграть, посмотреть поток.


Название: Re: чем можно порисовать еще кроме QPainter? или как его заставить рисовать шустрее
Отправлено: megido от Июнь 13, 2016, 22:32
ну так может этому виной кривой файл? глянь там кодек pcm а должен быть другой(я разные ставил) ну и другие параметры я тоже настраивал и они не изменились. вобще что-то рекордер на настройки не реагирует
Так а файл играется нормально?
Я бы попробовал другие файлы поиграть, посмотреть поток.
ну тот что я записываю я не играл. там плеер с стрим слушает  а рекордер его пишет


Название: Re: чем можно порисовать еще кроме QPainter? или как его заставить рисовать шустрее
Отправлено: megido от Июнь 13, 2016, 22:36
ха я кажись понял в чем дело. наверно рекордер пишет не мой стрим а запись с микрофона :D.
потому там pcm 16bit и низкая громкость


Название: Re: чем можно порисовать еще кроме QPainter? или как его заставить рисовать шустрее
Отправлено: kuzulis от Июнь 14, 2016, 08:58
Если это под Windows, то там вроде как баг.. типа текущие уровни пересчитываются через логарифм, а должны быть просто линейными:

https://codereview.qt-project.org/#/c/161717/

(я пост не читал, в тему не вникал.. пишу наобум :) )

UPD: Упс, это кажется другая проблема.


Название: Re: чем можно порисовать еще кроме QPainter? или как его заставить рисовать шустрее
Отправлено: megido от Июнь 22, 2016, 22:53
дописал прогу, осталось сделать эти уровни красивыми.

вот как они сейчас отрисовываются.
(https://i.gyazo.com/bd0e06b1751c395145d417662d73aefa.gif)

чем можно еще нарисовать подобное?

я пробовал QPropertyAnimation, кажется оно мне тут не поможет.
еще есть QVariantAnimation , но я не понял как его прицепить к лайоуту или виджету



Название: Re: чем можно порисовать еще кроме QPainter? или как его заставить рисовать шустрее
Отправлено: Igors от Июнь 23, 2016, 10:25
дописал прогу, осталось сделать эти уровни красивыми.
чем можно еще нарисовать подобное?
А что не так, не нравится? Какая "красивость" нужна?


Название: Re: чем можно порисовать еще кроме QPainter? или как его заставить рисовать шустрее
Отправлено: Bepec от Июнь 23, 2016, 13:43
Ему нужна плавность перехода скорее всего. Но это уже проблема компонента.
Т.е. при установке значения нужно не сразу бросаться отрисовывать текущий уровень, а плавненько его доводить до нужного. Соотвествтенно нужно учитывать разницу между текущим и устанавливаемым, менять значение постепенно.