Как заставить QT5 MediaPlayer показывать субтитры?

Я оцениваю переход с Qt 4.8 на Qt 5.2, и наиболее важным моментом является мультимедийный бэкенд. В Qt 5.2 есть несколько важных функций, которые Phonon не предоставляет в Qt 4.8. Но по крайней мере старшая версия показывала субтитры (файл SRT в том же каталоге, что и видеофайл).

Ни документация, ни пробы и ошибки не дали мне никаких результатов.

Итак, кто-нибудь знает, как заставить Qt 5 показывать эти субтитры? Или он даже не поддерживается (было бы позором)

Любая помощь приветствуется..

PS: мне нужно ровно наоборот: отключить показ файла субтитров в QMediaPlayer


person Community    schedule 19.01.2014    source источник


Ответы (2)


Вы должны установить флаг GST_PLAY_FLAG_TEXT на playbin2. (Обычно он включен по умолчанию. При необходимости измените его в ctor QGstreamerPlayerSession).

И если ваш файл субтитров является внешним, вам нужно будет установить свойство «suburi» на playbin2. Значением свойства suburi является путь к файлу субтитров. Это изменение должно быть сделано в методе QGstreamerPlayerSession::loadFromUri.

В Qt5.2 эти изменения должны быть сделаны в файле qgstreamerplayersession.cpp. Вы найдете файл в qtmultimedia/src/plugins/gstreamer/mediaplayer. Расположение файла может отличаться для более старых версий 4.x.

Еще я заметил, что код плагина устанавливает флаг GST_PLAY_FLAG_NATIVE_VIDEO. Субтитры не отображаются, если установлен этот флаг. Вам нужно запретить коду плагина устанавливать этот флаг. Либо вы можете закомментировать код, устанавливающий этот флаг, либо вам придется установить переменную среды QT_GSTREAMER_PLAYBIN_FLAGS в значение 0x00000017 (то есть GST_PLAY_FLAG_VIDEO|GST_PLAY_FLAG_AUDIO|GST_PLAY_FLAG_TEXT). Установка любого значения пропустит флаг GST_PLAY_FLAG_NATIVE_VIDEO.

После внесения этих изменений соберите плагин и используйте его.

person sky    schedule 08.05.2014

Я много искал, видимо, медиаплеер Qt не поддерживает субтитры, я использую парсер srt для отображения субтитров.

Мой код класса BackEnd:

 #include "backend.h"
BackEnd::BackEnd(QObject *parent) : QObject(parent)
{
     readSubtitleFile("./en.srt");
}

void BackEnd::readSubtitleFile(QString directory)
{
      cout<< "readSubtitleFile:"<< directory.toStdString()<<endl;
      if(!isFileExist(directory.toStdString())) {
          cout<< "file does not exist"<<endl;
          return ;
      }
      SubtitleParserFactory *subParserFactory = new SubtitleParserFactory(directory.toStdString());
      SubtitleParser *parser = subParserFactory->getParser();

      sub = parser->getSubtitles();
}

QString BackEnd::getSubtitleText(double playTime)
{
    for(SubtitleItem * element : sub) {
        double startTime = element->getStartTime();
        double endTime = element->getEndTime();
        if( (startTime <= playTime) && (playTime <= endTime)) {
            cout<< "getSubtitleText: founded"<< element->getText()<<endl;
            return QString::fromStdString(element->getText());
        }
    }
    cout<< "getSubtitleText: not founded"<< endl;
    return "";
}

bool BackEnd::isFileExist(const string &temp)
{
    if (FILE *file = fopen(temp.c_str(), "r")) {
            fclose(file);
            return true;
        } else {
            return false;
        }
}

Мой qml-файл:

    Window {
    visible: true
    width: 900
    height: 700
    title: qsTr("My Player")
      Rectangle {
        id: root
        color: "black"
        width: parent.width
        height: parent.height
        function msToTime(duration) {
          var milliseconds=parseInt((duration%1000)/100),
          seconds = Math.floor((duration / 1000) % 60),
        minutes = Math.floor((duration / (1000 * 60)) % 60),
        hours = Math.floor((duration / (1000 * 60 * 60)) % 24);

      hours = (hours < 10) ? "0" + hours : hours;
      minutes = (minutes < 10) ? "0" + minutes : minutes;
      seconds = (seconds < 10) ? "0" + seconds : seconds;

      return hours + ":" + minutes + ":" + seconds;
    }
    Column {
        width: parent.width
        height: parent.height
        Item {
            width: parent.width
            height: parent.height-100
            MediaPlayer {
                id: mediaplayer
                source: "file:///E:/1.mp4"
            }

            VideoOutput {
                anchors.fill: parent
                source: mediaplayer
            }
        }
        Text {
            id: subtitleText
            text: qsTr("")
            y: -150
            font.pixelSize: 18
            color: "white"
            anchors.horizontalCenter: 
         parent.horizontalCenter
        }
    }
    Timer {
      id: refreshTimer
      interval: 1000//30 // 60 Hz
      running: true
      repeat: true
      onTriggered: {
         durationPass.text =  
            root.msToTime(mediaplayer.position);
         subtitleText.text = 

        BackEnd.getSubtitleText(mediaplayer.position);
      }
  }
}
person Mohammad vatandoost    schedule 28.01.2020