如何处理过多的 QML 和音频文件

Posted

技术标签:

【中文标题】如何处理过多的 QML 和音频文件【英文标题】:How to handle too many QML and audio files 【发布时间】:2015-10-28 02:52:27 【问题描述】:

我完成了一个 Qt Quick UI 项目,我在其中使用了许多 QML 和音频文件。这是一个儿童应用程序。在主屏幕中,我有 10 个部分。一个用于字母 (Pismena.qml),第二个用于数字 (Cislice.qml) 等 (Tvary.qml,Farby.qml)。如果您选择某个部分,那么您可以浏览带有声音的图像。一节包含大约 30 个 png 和 30 个 mp3 文件。一切正常。

但是如果我想部署这个应用程序并将这个项目转换成一个Qt Quick Application项目,我就有问题了。三个部分是可以的,但是如果我想使用四个部分,我会收到如下错误:

Error: "Internal data flow error." 

 

Error: "GStreamer encountered a general stream error." 

 

Error: "Failed to connect stream: Too large"

这些错误消息会在我启动应用程序时立即显示,而不是在我浏览图像时显示。 还有一些音频元素没有播放。

这是我的 ma​​in.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>

int main(int argc, char *argv[])

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("applicationDirPath", QGuiApplication::applicationDirPath());
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();

这是我的 ma​​in.qml(不完整)

import QtQuick 2.3
import QtQuick.Controls 1.2
import QtGraphicalEffects 1.0
import QtQuick.Window 2.0
import QtMultimedia 5.0

ApplicationWindow 
    visible: true
    width: 1024
    height:300

    Rectangle 
        width: parent.width
        height: parent.height
        id: appWindow
        property alias pismenaIconAlias: pismenaIcon

        Pismena
            id: pismena
            visible: false
            

        Cislice
            id: cislice
            visible: false
        

        Farby
            id: farby
            visible: false
        

        Tvary
            id: tvary
            visible: false
        

        Image
            id: pismenaIcon
            source: "file:" + applicationDirPath + "/obrazky/pismenaIcon.png"           
            MouseArea
                anchors.fill: parent
                hoverEnabled: true
                onClicked: 
                    parent.visible = false
                    pismena.visible = true

                                
            
        
        Image
            id: cisliceIcon
            source: "file:" + applicationDirPath + "/obrazky/cisliceIcon.png"
            MouseArea
                anchors.fill: parent
                hoverEnabled: true
                onClicked: 
                    parent.visible = false
                    cislice.visible = true                   
            
        

        Image
            id: farbyIcon
            source: "file:" + applicationDirPath + "/obrazky/farbyIcon.png"            
            MouseArea
                anchors.fill: parent
                hoverEnabled: true
                onClicked:                     
                    parent.visible = false
                    farby.visible = true                    
            
        

        Image
            id: tvaryIcon
            source: "file:" + applicationDirPath + "/obrazky/tvaryIcon.png"            
            MouseArea
                anchors.fill: parent
                hoverEnabled: true
                onClicked:                     
                    parent.visible = false
                    tvary.visible = true                    
            
        
    

在 main.qml 文件中,如果您选择 Pismena(pismenaIcon Image element),您将被重定向到该文件 - Pismena.qml,您可以在其中浏览带有声音的图像:

import QtQuick 2.3
import "myJava.js" as MyScript
import QtMultimedia 5.0
import QtQuick.Window 2.0
Item 
    anchors.horizontalCenter: parent.horizontalCenter
    anchors.verticalCenter: parent.verticalCenter
    Audio 
        id: hrajPismeno

    
    Image 
        id: pis     
        MouseArea
            anchors.fill: parent
            onClicked: 
                pis.source = "file:" + applicationDirPath + MyScript.cobr()
                hrajPismeno.source = "file:" + applicationDirPath + MyScript.zobr()
                hrajPismeno.play()

            
        
    

这是我的 myJava.js

.pragma library
var pr = 0;
var c = 1;
var z = 1;
var numberOfItems = 33;
var itemFolder = "\/pismena\/";
function cobr()
    c = (c === numberOfItems) ? 0 : c;
    c = c + 1;
    var s = itemFolder + c + ".png";
    return s;

function setLetters()
    numberOfItems = 33;
    itemFolder = "\/pismena\/";

function zobr()
    z = (z === numberOfItems) ? 0 : z;
    z = z + 1;
    var r = itemFolder + z + ".mp3";
    return r;

我在 Linux Mint 13 上使用 Qt 5.3。

为什么我不能使用很多音频文件?

【问题讨论】:

【参考方案1】:

Pismena.qml 中,您没有为ItemImage 设置初始widthheight。所以在窗口中没有用户可以实际点击的地方。 Image 元素也没有默认路径。

编辑

在每个Audio 元素中,将autoLoad 属性设置为false

【讨论】:

在原始 Pismena.qml 中,我有 Item width: parent.width height: parent.height 和 Image 它是 height: 0.4*appWindow.height/(720/sourceSize.height) width: 0.4 *appWindow.height/(720/sourceSize.height)*sourceSize.width/sourceSize.height 但是我没有放在这里,因为原来的太长了,我觉得没那么重要。对不起。 那么你应该使用调试器。将console.log("Image clicked") 放入onClicked。将console.log(hrajPismeno.errorString) 放在hrajPismeno.play 之后并尝试查看错误出现在哪里。 我忘了提一件事。对不起。当我启动应用程序时,我的错误消息会立即显示,而不是在我浏览图像时。无论如何,我尝试了您的建议,但是没有错误消息代替 console.log(hrajPismeno.errorString) 我认为这是系统中的一个错误。您是否在任何其他平台上编译过代码? 我也在 Mint 17.2 上尝试过,结果相同。

以上是关于如何处理过多的 QML 和音频文件的主要内容,如果未能解决你的问题,请参考以下文章

数据库日志文件太大如何处理

如何处理 iPhone 中的网络切换?

网络音频合成:如何处理在攻击或释放阶段更改滤波器截止?

如何处理 AVPlayerViewController 中的下一个和上一个按钮?

如何处理来自 WASAPI 流的声音数据块而不将它们写入文件?

scrapy中如何处理大文件下载?