每当我通过Remote Display API按下按钮时,尝试播放声音效果。
使用示例应用作为参考。它在设备上运行良好,但在电视上,如果我尝试多次播放它听起来很糟糕(而且我不必非常快地按下按钮以使其卡住)
这是我的测试(不检查远程会话错误)代码来尝试它:
var loop:AEAudioFilePlayer?
var audioController:AEAudioController?
let k48kHZ:Float64 = 48000.0
let file = NSBundle.mainBundle().URLForResource("got_it", withExtension: "wav")!
var receiver:AEBlockAudioReceiver?
func setupSound(){
// Temporary workaround for known issue where sound crackles on new Chromecast devices.
let cracklingSoundWorkaroundStereo = AudioStreamBasicDescription(
mSampleRate: k48kHZ,
mFormatID: kAudioFormatLinearPCM,
mFormatFlags: kAudioFormatFlagIsFloat | kAudioFormatFlagIsPacked |
kAudioFormatFlagIsNonInterleaved,
mBytesPerPacket: UInt32(sizeof(Float)),
mFramesPerPacket: 1,
mBytesPerFrame: UInt32(sizeof(Float)),
mChannelsPerFrame: 2,
mBitsPerChannel: 8*UInt32(sizeof(Float)),
mReserved: 1)
audioController = AEAudioController(audioDescription: cracklingSoundWorkaroundStereo, options: AEAudioControllerOptionEnableOutput)
do{
loop?.channelIsPlaying = false
loop?.currentTime = 0
loop?.channelIsPlaying = true
} catch {
print("Failure")
}
// Block the main output. Our receiver above will still receive the channel sound.
audioController?.muteOutput = true
// Add a new output receiver pushing to the remote display. TAEE defaults to 1024 buffers, which
// should work for us!
receiver = AEBlockAudioReceiver { (source, time, frames, bufferList) -> Void in
CastController.sharedInstance.remoteSession.enqueueAudioBuffer(bufferList, frames: frames, pts: time)
}
audioController?.addOutputReceiver(receiver, forChannel: loop)
//loop?.channelIsPlaying = true
}
@IBAction func playSound(sender: UIButton) {
do{
loop = try AEAudioFilePlayer(URL: file)
loop?.loop = false
audioController?.addChannels([loop!])
audioController?.addOutputReceiver(receiver, forChannel: loop)
} catch {
print("Failure")
}
}
更新: 基本上,播放几秒后播放效果很好。但如果你的声音效果长达4-5秒,那么50%的时间听起来会很糟糕。