1

我需要使用 QML 在 BB10 上制作小应用程序,它可以录制和播放一些声音。我有所有需要的权限(麦克风和存储文件)和这段代码:

import bb.cascades 1.0
import bb.multimedia 1.0

Page {
    property string dataUrl;

    Container {
        background: Color.create("#001100")
        layout: StackLayout {
        }

        attachedObjects: [
            MediaPlayer {
                id: audioPlayer
                sourceUrl: dataUrl + "/recording.mp4"
            },
            AudioRecorder {
                id: recorder

                outputUrl: dataUrl + "/recording.mp4"
            }
        ]

        Button {
            id: btnRecord
            text: "Record"

            onClicked: {
                recorder.record();
            }
        }

        Button {
            id: btnStop
            text: "Stop Record"

            onClicked: {
                recorder.reset();
            }
        }

        Button {
            text: "Play Audio"
            onClicked: {
               audioPlayer.play()
            }
        }

        Button {
            text: "Stop Audio"
            onClicked: {audioPlayer.stop() 
            }
        }
    }

}

运行后我可以看到所有按钮,但无法录制和/或播放。我不知道出了什么问题。我看不到任何错误。

4

1 回答 1

1

您快到了。问题是你sourceUrl错了。存储记录的最佳位置是应用程序的数据目录,但 QML 不知道该目录在哪里。

要解决此问题,您需要使用 C++ 将应用程序的数据路径公开给 QML。你可以使用一个属性来做到这一点(更多信息在这里)。

在您创建AbstractPane对象的位置下添加以下 C++ 代码(在我的例子中称为root)。这通常在applicationui.cpp.

root->setProperty("dataUrl", "file://" + QDir::currentPath() + "/data");

现在将该dataUrl属性添加到您的 QML 并将其用于您的sourceUrl

Page {
    property string dataUrl; 

    Container {
        background: Color.create("#001100")
        layout: StackLayout {
        }

        attachedObjects: [
            MediaPlayer {
                id: audioPlayer
                sourceUrl: dataUrl + "/recording.m4a"
            },
            AudioRecorder {
                id: recorder
                outputUrl: dataUrl + "/recording.m4a"
            }
        ]
        ....
  }

编辑:确保audioPlayer.reset()在完成录制后调用,这会强制播放器重新加载录制的音频。如果您不这样做,您的音频播放可能会被截断。

于 2013-06-04T22:15:39.100 回答