QML: SoundEffect не работает, аудио работает - PullRequest
4 голосов
/ 09 декабря 2011

У меня есть два пользовательских элемента QML для аудио, один для воспроизведения музыки (и расширяет элемент QML Audio) и один для воспроизведения звуковых эффектов (который расширяет элемент QML SoundEffect).

Я могу воспроизводить фоновую музыку без проблем, но когда я пытаюсь воспроизвести звуковой эффект, интерфейс останавливается на пару секунд (музыка продолжает играть), а затем, когда он размораживается, я получаю звук ошибки Windows .

Вот что у меня есть (музыка имеет похожую архитектуру):

MySoundEffect.qml

Loader {
   id: container
   source: "MobilitySoundEffect.qml"

   property bool  valid: item !== null
   property real  audioVolume: 1.0
   property int   loops: 1

   function initialise() {
      if(valid) {
         item.volume = container.audioVolume
         item.loops = container.loops
      }
   }

   function play(filename) { if(valid) item.play(filename); }
   function stop() { if(valid) item.stop(); }
   onLoaded: container.initialise()
   onAudioVolumeChanged: if(valid) item.volume = audioVolume;
}

MobilitySoundEffect.qml

Item {
   id: container

   property url   source: ""
   property real  volume: 1.0
   property int   loops: 1

   function play(filename) {
      if (settings.isFxOn()) {
         source = filename;
      }
   }

   function stop() { soundEffect.stop(); }
   SoundEffect {
      id: soundEffect
      source: container.source
      volume: container.volume
      loops:  container.loops
      onStatusChanged: if (Audio.Loaded == status) play();
   }
}

А вот как я их регистрирую (обрезано для краткости):

main.qml

Rectangle {
   id: main
   MyAudio {
      id: music
   }
   MySoundEffect {
      id: soundEffects
   }
   PageStack {
      id: pageStack

      Component.onCompleted: {
         pageStack.push(Qt.resolvedUrl("pages/IntroPage.qml"));
      }
   }
}

Наконец, вот как я их называю для воспроизведения музыки или звукового эффекта:

soundEffects.play("file://assets/audio/click.ogg");  
music.play("file://assets/audio/menu.mp3");

Опять же, музыка играет нормально, а звуковые эффекты - нет. И, насколько я проверял, это не имеет ничего общего с типом файла. Я не мог получить wav, mp3 или off для воспроизведения.

Моя установка - Windows 7, QtSDK 7.4.7, Symbian 1.1.

Под Microsoft Visual Studio Compiler 9.0 я получаю замораживание и звук ошибки, но под MinGW 4.4 нет звука замораживания или ошибки, но звуковой эффект все еще отсутствует.

Обновление

Я переместил все свои ресурсы (qml, audio, txt и т. Д.) В файл QResource, и теперь не воспроизводятся ни звуковые эффекты, ни музыка. Всякий раз, когда я пытаюсь воспроизвести музыку, я получаю следующее:

qrc файл: /audio/menu.ogg
Размер 353349
Последовательный 0

Мне действительно нужно это исправить, поэтому я начал щедрость. Пожалуйста, помогите.

Заранее спасибо.

Решение (больше похоже на обход)

Действительно, QSound не может воспроизводить звуки из ресурса, и я не могу заставить работать элемент SoundEffect. Итак, моя работа заключается в следующем:

Я использую элемент QML Audio для воспроизведения фоновой музыки (которая поддерживает Fade In / Fade Out) и я создал класс SoundEffects в C ++, используя Phonon для воспроизведения звуковых эффектов.

Кажется, все работает нормально, поэтому я больше не буду к нему прикасаться.

1 Ответ

3 голосов
/ 15 декабря 2011

Я думаю, что элемент QML Audio является оберткой вокруг QSound, которая не может получить доступ к звуковым файлам из файловой системы ресурсов Qt (упоминается в документе) Обратите внимание, что QSound не поддерживает ресурсы.Это может быть исправлено в будущей версии Qt. .Что касается звука предупреждения / ошибки Windows, я думаю, воспроизведение звукового эффекта может блокировать основной поток пользовательского интерфейса.

Это также может быть вызвано, если QSound не может воспроизводить два аудиофайла одновременно.Вы можете попробовать QtMultimedia или Phonon , если в классе QSound есть некоторые ограничения.

...