QML中的录音电话BB10

时间:2013-06-04 20:20:47

标签: qml audio-recording blackberry-10

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

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() 
            }
        }
    }

}

跑步后我可以看到所有按钮,但录制和/或播放不起作用。我不知道出了什么问题。我看不出任何错误。

1 个答案:

答案 0 :(得分:1)

你快到了。问题是你sourceUrl错了。存储录制内容的最佳位置在您的应用data directory中,但您的QML不知道它在哪里。

要解决此问题,您需要使用C ++将应用程序的数据路径公开给QML。您可以使用属性(more info here)执行此操作。

在您创建AbstractPane对象的位置(在我的案例中称为root)下添加以下C ++代码。这通常在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(),这会强制播放器重新加载录制的音频。如果不这样做,您的音频播放可能会被截断。