口述录音机BB10在QML中

口述录音机BB10在QML中,qml,audio-recording,blackberry-10,Qml,Audio Recording,Blackberry 10,我需要使用QML在BB10上制作一个小应用程序,它可以录制和播放一些声音。我有所有需要的许可证(麦克风和存储文件)和此代码: import bb.cascades 1.0 import bb.multimedia 1.0 Page { property string dataUrl; Container { background: Color.create("#001100") layout: StackLayout { }

我需要使用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() 
            }
        }
    }

}

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

你就快到了。问题是您的
sourceUrl
错误。存储您的录音的最佳位置是在您的应用程序中,但您的QML不知道它在哪里

为了解决这个问题,你需要使用C++来将应用程序的数据路径暴露到QML中。可以使用属性()执行此操作

在创建代码> >抽象窗格< /C>对象(在我的例子中称为代码>根<代码> >的地方添加下面的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()
,这将强制播放机重新加载录制的音频。如果不这样做,音频播放可能会被截断

你就快到了。问题是您的
sourceUrl
错误。存储您的录音的最佳位置是在您的应用程序中,但您的QML不知道它在哪里

为了解决这个问题,你需要使用C++来将应用程序的数据路径暴露到QML中。可以使用属性()执行此操作

在创建代码> >抽象窗格< /C>对象(在我的例子中称为代码>根<代码> >的地方添加下面的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()
,这将强制播放机重新加载录制的音频。如果不这样做,音频播放可能会被截断

还是没什么。按钮已显示但未工作。我调试了我的应用程序,看到
com.example.Audio.testDev\u ample\u Audiodd28f885.315166862默认9000警告录音机::prepare:连接输入源时出错。url=audio:default,error=UnsupportedMediaType
您使用的是模拟器还是真实设备?模拟器。你认为这是一个问题吗?是的,我认为模拟器不支持通过主机的麦克风录制音频。当你将应用程序部署到模拟器时,是否有任何错误?仍然没有。按钮已显示但未工作。我调试了我的应用程序,看到
com.example.Audio.testDev\u ample\u Audiodd28f885.315166862默认9000警告录音机::prepare:连接输入源时出错。url=audio:default,error=UnsupportedMediaType
您使用的是模拟器还是真实设备?模拟器。你认为这是一个问题吗?是的,我认为模拟器不支持通过主机的麦克风录制音频。当你将应用程序部署到模拟器时,是否出现任何错误?