crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> воспроизведение видео через QMediaPlayer, Или я туплю или это такой прикол?
arrow
  опции профиля:
сообщение 26.12.2016, 21:57
Сообщение #1


Новичок


Группа: Неактивирован
Сообщений: 5
Регистрация: 26.12.2016
Пользователь №: 4686

Спасибо сказали: 0 раз(а)




Репутация:   0  


Я новичек с Qt Creator работаю около недели и решил для обучения написать на Qt Creator 5.7 простой видео проигрыватель с отображением времени воспроизведения видео и регуляцией громкости.

С громкостью и остальным все хорошо, а вот с самим временем воспроизведения и изображением проблемы

Компилировал проект и смотрел как работает на Windows 7 и Debian Linux и получил интересный прикол (возможно туплю я или чего-то не понимаю):

1. На Linux все работает, только у видео нет изображения (у любого видео - avi, mp4, mpeg). На Windows изображение есть.

Что я не так делаю? Какие модули нужно подключать дополнительно кроме QMediaPlayer и QVideoWidget?

2. На Windows все работает хорошо, только если в коде (см. ниже) убрать qDebug() << pos при воспроизведении в label выводится неверное время (все время разное даже на одном файле и одном месте воспроизведения в видео) на Linux без этого вообще ничего в label не выводится.

Помогите, что нужно изменить, чтобы работало без этой строки (строку ввел для тестирования сомневался, что правильно идет перевод из qint64 в QTime)?

Сам фрагмент кода:

    QTime time(0, 0, 0, 0);
    label->setText("00:00:00");

    connect(mPlayer, &QMediaPlayer::durationChanged, playSlider, &QSlider::setMaximum);

    connect(mPlayer, &QMediaPlayer::positionChanged, [&] (qint64 pos) {
       playSlider->setValue(pos);

       // Без этого почему-то время в label выводится не корректно в Windows, а
      // в Linux вообще не выводится
       qDebug() << pos;

       time = time.addMSecs(mPlayer->position());
       label->setText(time.toString("hh:mm:ss"));
    });


Спасибо за любую помощь .
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 27.12.2016, 8:20
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2911
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 199 раз(а)




Репутация:   34  


arrow, time у тебя - локальная переменная функции. Лямбда её захватила, а при вызове по сигналу будет обращение по невалидной памяти

Попробуй так
...
QTime  time = time.addMSecs(mPlayer->position());
label->setText(time.toString("hh:mm:ss"));


P.S. И, к слову, версия QtCreator особо роли не играет, важнА версия Qt :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
arrow
  опции профиля:
сообщение 28.12.2016, 0:15
Сообщение #3


Новичок


Группа: Неактивирован
Сообщений: 5
Регистрация: 26.12.2016
Пользователь №: 4686

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо!

Версия Qt 5.7.

На обеих операционных не работает - выводит в label неверное время.

А что можно сделать, чтобы на Linux в видео было изображение?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 29.12.2016, 7:49
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2911
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 199 раз(а)




Репутация:   34  


Цитата(arrow @ 28.12.2016, 2:15) *
выводит в label неверное время

разбирайся, почему mPlayer->position() возвращает не то, что нужно. Замени этот вызов, скажем, получением текущего времени QTime::currentTime(), чтобы удостовериться, что индикация работает верно

про Linux и про видео не смогу подсказать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
arrow
  опции профиля:
сообщение 29.12.2016, 23:37
Сообщение #5


Новичок


Группа: Неактивирован
Сообщений: 5
Регистрация: 26.12.2016
Пользователь №: 4686

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо, буду разбираться дальше.

P.S. Пробовал по разному. Данные в переменной pos верные, в QTime преобразуются тоже верно. Из QTime в QString, тоже отлично переводится, только выводится в сам label неверно - в этом весь непонятный для меня прикол.

Если убрать строку qDebug << pos - в label выводятся неверные данные, при этом в time.toString("hh:mm:ss") данные верные.

Вместо qDebug << pos написал qDebug() << "" - тоже работает корректно, а без - нет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 30.12.2016, 7:50
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2911
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 199 раз(а)




Репутация:   34  


возможно, где-то некорректная работа с label, разбирайся. По приведённому коду этого не видно

В качествен эксперимента попробуй вывести время на заголовок диалога

//label->setText(time.toString("hh:mm:ss"));
setWindowTitle(time.toString("hh:mm:ss"))


если туда нормально выводится, ищи косяки в работе с label
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
arrow
  опции профиля:
сообщение 30.12.2016, 18:05
Сообщение #7


Новичок


Группа: Неактивирован
Сообщений: 5
Регистрация: 26.12.2016
Пользователь №: 4686

Спасибо сказали: 0 раз(а)




Репутация:   0  


Огромное спасибо!

Вы гений :), сам я почему-то не подумал. В заголовок все выводится верно. Буду искать где накосячил с label.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
arrow
  опции профиля:
сообщение 2.1.2017, 15:03
Сообщение #8


Новичок


Группа: Неактивирован
Сообщений: 5
Регистрация: 26.12.2016
Пользователь №: 4686

Спасибо сказали: 0 раз(а)




Репутация:   0  


Решил проблему так:

connect(mPlayer, &QMediaPlayer::positionChanged, [this] (qint64 pos) {
        ui->timeSlider->setValue(pos);
        // Рассчет времени воспроизведения
        int minutes = round(mPlayer->position() / 60000);
        int seconds = round((mPlayer->position() % 60000) / 1000);
        QTime times(0, minutes, seconds, 0);
        timeLbl->setText(times.toString("h:mm:ss"));
    });
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.2.2017, 3:55