SoundEffect 无法在 Android 上播放 WAV 音效

问题描述 投票:0回答:1

我最近在我的 Qt 应用程序中添加了对音效重放的支持,并将其移植到 Android 平台。

为了播放我的声音文件,我使用了

MediaPlayer
QML 组件,它能够播放我的效果,但对于频繁的声音来说毫无用处,因此我需要一个更高效的组件,它可以以较小的延迟重放声音效果。

根据Qt的文档,

SoundEffect
应该是首选,但由于某种原因声音没有播放。

在我的调试状态输出中,我可以看到,当触发

SoundEffect.play()
时,
playing
设置为
true
,但随后立即重置为 false。在控制台输出中我可以看到以下消息:

W QtAudioDeviceManager: Built in Earpiece may not work when Wired Headphones are connected
D AudioManager: setMode mode=2 from com.indurad.ioau
I AudioManager: In stopBluetoothSco(), calling application: com.indurad.ioau
I AudioManager: In setBluetoothScoOn(), on: false, calling application: com.indurad.ioau
I AudioManager: In setSpeakerphoneOn(), on: false, calling application: com.indurad.ioau
D om.indurad.ioa: PlayerBase::PlayerBase()
D om.indurad.ioa: TrackPlayerBase::TrackPlayerBase()
I libOpenSLES: android_audioPlayer_realize, channel mask 0x3
I libOpenSLES: android_audioPlayer_realize, create default channel mask 0x3, channels 2
I libOpenSLES: Emulating old channel mask behavior (ignoring positional mask 0x3, using default mask 0x3 based on channel count of 2)
D AudioTrackExtImpl: AudioTrackExtImpl init
D AudioTrack: set() streamType 3, sampleRate 24000, format 0x1, channelMask 0x3, frameCount 0, flags #104, notificationFrames -2, sessionId 1673, transferType 0, uid -1, pid -1 cbf 1
E AudioSystem: invalid attributes { Content type: AUDIO_CONTENT_TYPE_UNKNOWN Usage: AUDIO_USAGE_UNKNOWN Source: AUDIO_SOURCE_DEFAULT Flags: 0x0 Tags:  } when converting to stream
D AudioTrack: createTrack_l(0): AUDIO_OUTPUT_FLAG_FAST denied by server; frameCount 0 -> 968
I AudioTrack: createTrack_l(2091) on outputId(13) : 0x70a15a1400, mCblk = 0x721b6cc000,  mLatency = 88, mAfLatency = 48, frameCount = 968, mSampleRate = 24000, mFlags = 0, mReqFrameCount = 968, mNotificationFramesAct = 480
D ListServiceUtils: mListServiceUtils::init CallingPid 32492
D ListServiceUtils: mListServiceUtils::init this 0x70be56c740
D AudioTrack: setVolume left 0.000 right 0.000 , callingPid 32492
D AudioTrack: start(2091): prior state:STATE_STOPPED output 13 stream 3 session 1673
D om.indurad.ioa: PlayerBase::stop() from IPlayer
D AudioTrack: stop(2091): prior state:STATE_ACTIVE output 13 stream 3 session 1673
D AudioTrack: stop(2091): called with 2400 frames delivered
D AudioTrack: flush(2091): prior state:STATE_STOPPED
D AudioTrack: start(2091): prior state:STATE_FLUSHED output 13 stream 3 session 1673
D om.indurad.ioa: PlayerBase::stop() from IPlayer
D AudioTrack: stop(2091): prior state:STATE_ACTIVE output 13 stream 3 session 1673
D AudioTrack: stop(2091): called with 2400 frames delivered
D AudioTrack: flush(2091): prior state:STATE_STOPPED
D AudioTrack: start(2091): prior state:STATE_FLUSHED output 13 stream 3 session 1673
D om.indurad.ioa: PlayerBase::stop() from IPlayer
D AudioTrack: stop(2091): prior state:STATE_ACTIVE output 13 stream 3 session 1673
D AudioTrack: stop(2091): called with 4328 frames delivered
D AudioTrack: flush(2091): prior state:STATE_STOPPED
D AudioTrack: start(2091): prior state:STATE_FLUSHED output 13 stream 3 session 1673
D om.indurad.ioa: PlayerBase::stop() from IPlayer
D AudioTrack: stop(2091): prior state:STATE_ACTIVE output 13 stream 3 session 1673
D AudioTrack: stop(2091): called with 4328 frames delivered
D AudioTrack: flush(2091): prior state:STATE_STOPPED
D AudioTrack: start(2091): prior state:STATE_FLUSHED output 13 stream 3 session 1673
D om.indurad.ioa: PlayerBase::stop() from IPlayer
D AudioTrack: stop(2091): prior state:STATE_ACTIVE output 13 stream 3 session 1673
D AudioTrack: stop(2091): called with 4320 frames delivered
D AudioTrack: flush(2091): prior state:STATE_STOPPED
D AudioTrack: setVolume left 1.000 right 1.000 , callingPid 32492

留言:

E AudioSystem:无效属性 { 内容类型:AUDIO_CONTENT_TYPE_UNKNOWN 用法:AUDIO_USAGE_UNKNOWN 源:AUDIO_SOURCE_DEFAULT 标志:0x0 标签:} 转换为流时

让我看到了一些文章,其中说音频文件应该在文件系统中提供,而不是在 Qt 资源系统中提供。

但是,我有点困惑如何将资源按原样部署到 Android APK,而不将它们集成为 Qt 资源系统。

我正在使用:

  • Qt 6.4.2
  • CMake 用于构建 android 包。
android qt audio qml
1个回答
0
投票

在理解文件格式时,您必须意识到格式和内部流编解码器都很重要。我进行了以下测试并发现:

文件格式 直播 Windows 安卓
.wav pcm_s16le,44100 Hz,立体声,s16,1411 kb/s 是的 是的
.mp3 mp3、44100 Hz、立体声、fltp、206 kb/s 是的 是的
.mp2 mp2、44100 Hz、立体声、s16 384 kb/s 是的 是的
.ogg vorbis,44100 Hz,立体声,fltp 没有 是的
.ogg flac、44100 Hz、立体声、s32(24 位)、128 kb/s 没有 没有

从上表中,您必须意识到,仅仅拥有文件格式是不够的。找到正确的流很重要。我用来准备上述文件的软件是

ffmpeg
,我使用的脚本是:

ffmpeg -y -i test.wav test.mp3
ffmpeg -y -i test.wav test.mp2
ffmpeg -y -i test.wav -acodec libvorbis -vn test_ogg_vorbis.ogg
ffmpeg -y -i test.wav -acodec flac      -vn test_ogg_flac.ogg
© www.soinside.com 2019 - 2024. All rights reserved.