首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何强制QT5 MediaPlayer显示字幕?

如何强制QT5 MediaPlayer显示字幕?
EN

Stack Overflow用户
提问于 2014-01-20 00:50:26
回答 2查看 1.6K关注 0票数 0

我正在评估从Qt 4.8到Qt 5.2的迁移,最重要的一点是多媒体后端。在Qt 5.2中,Qt 4.8中的声子后端没有提供一些重要的功能。但至少老版本显示了字幕(SRT文件与视频文件在同一目录中)。

文档和反复试验都没有给我提供任何结果。

那么,有人知道如何强制Qt5显示这些字幕吗?或者它甚至没有得到支持(那将是一种耻辱)

任何帮助都将不胜感激..

PS:我需要的正好相反:Disable showing subtitle file in QMediaPlayer

EN

回答 2

Stack Overflow用户

发布于 2014-05-08 15:22:50

您必须在playbin2上设置标志GST_PLAY_FLAG_TEXT。(默认情况下,该选项通常处于启用状态。如果需要,则在QGstreamerPlayerSession的ctor中更改它)。

如果你的字幕文件是外部的,那么你必须在playbin2上设置"suburi“属性。suburi属性的值是字幕文件的路径。此更改应在方法QGstreamerPlayerSession::loadFromUri中完成。

在Qt5.2中,这些更改必须在文件中完成,qgstreamerplayersession.cpp.You将在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标志。

完成这些更改后,构建插件并使用它。

票数 1
EN

Stack Overflow用户

发布于 2020-01-28 23:23:03

我搜索了很多,显然Qt mediaplayer不支持字幕,我用srt parser来显示字幕。

我的BackEnd类代码:

代码语言:javascript
复制
 #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文件:

代码语言:javascript
复制
    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);
      }
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21219633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档