Russian Qt Forum
Ноябрь 24, 2024, 02:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: чем можно порисовать еще кроме QPainter? или как его заставить рисовать шустрее  (Прочитано 9508 раз)
megido
Гость
« : Июнь 13, 2016, 21:19 »


(сейчас вот так, гифка немного замедлена)
а вот так должно быть


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

рисую вот так
Код:
    qreal widthLevel = m_level * height();
    painter.fillRect(0,0, 10,height(), Qt::black);
    painter.fillRect(0,height()-widthLevel,10, height(), Qt::red);
да кстати прямоугольники рисуются в цикле по очереди
« Последнее редактирование: Июнь 13, 2016, 21:30 от megido » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Июнь 13, 2016, 21:24 »

монитор поменять можно.
я никаких шлейфов не вижу.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #2 : Июнь 13, 2016, 21:31 »

монитор поменять можно.
я никаких шлейфов не вижу.
Тоже пока ничего не увидел.
Да и ускорить в таком простом рисовании что-то не просто.
Как вариант, можно не заливать черным весь виджет, а только верхнюю часть, а красным нижнюю.
Записан
megido
Гость
« Ответ #3 : Июнь 13, 2016, 21:32 »

монитор поменять можно.
я никаких шлейфов не вижу.
не с монитором все ок, наверно надо подганять проценты
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Июнь 13, 2016, 21:34 »

монитор поменять можно.
я никаких шлейфов не вижу.
не с монитором все ок, наверно надо подганять проценты
Скорее всего нижний рисуется с каким-то усреднением, поэтому и нет сильных рывков.
Записан
megido
Гость
« Ответ #5 : Июнь 13, 2016, 21:46 »

монитор поменять можно.
я никаких шлейфов не вижу.
не с монитором все ок, наверно надо подганять проценты
Скорее всего нижний рисуется с каким-то усреднением, поэтому и нет сильных рывков.
ну вобще из QAudioBuffer'а вылазили какие то мелкие значение типа 0.041963 . я их умножил на 10.
а иначе там только на очень малый диапазон получается.
вобще почему это в буфере такие маленькие значения уровня?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Июнь 13, 2016, 21:54 »

Возможно там значения отскалены в диапазон [0..1]?
Записан
megido
Гость
« Ответ #7 : Июнь 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'));
« Последнее редактирование: Июнь 13, 2016, 22:09 от megido » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Июнь 13, 2016, 22:07 »

не знаю. что это?
Попробуйте widthLevel вычислять по формуле:
widthLevel = height() * val;

где val - это значение из QAudioBuffer.
Записан
megido
Гость
« Ответ #9 : Июнь 13, 2016, 22:09 »

не знаю. что это?
Попробуйте widthLevel вычислять по формуле:
widthLevel = height() * val;

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

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Июнь 13, 2016, 22:15 »

сейчас именно так и есть
потому 180*0.0557878 выходит мало
Возможно уровень сигнала очень низкий. Так а после умножения на 10, что не устраивает?
Записан
megido
Гость
« Ответ #11 : Июнь 13, 2016, 22:20 »

сейчас именно так и есть
потому 180*0.0557878 выходит мало
Возможно уровень сигнала очень низкий. Так а после умножения на 10, что не устраивает?
ну так может этому виной кривой файл? глянь там кодек pcm а должен быть другой(я разные ставил) ну и другие параметры я тоже настраивал и они не изменились. вобще что-то рекордер на настройки не реагирует
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #12 : Июнь 13, 2016, 22:24 »

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

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

ха я кажись понял в чем дело. наверно рекордер пишет не мой стрим а запись с микрофона Веселый.
потому там pcm 16bit и низкая громкость
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.063 секунд. Запросов: 23.