我最近在我的 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 资源系统。
我正在使用:
在理解文件格式时,您必须意识到格式和内部流编解码器都很重要。我进行了以下测试并发现:
文件格式 | 直播 | 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