远程显示iOS不止一次播放声音=乱码

时间:2016-01-30 01:16:16

标签: ios swift google-cast

每当我通过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%的时间听起来会很糟糕。

0 个答案:

没有答案