Swift   发布时间:2022-04-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在Swift中流式传输MP3网址(iOS)?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
目前下面的代码可以流式传输本地mp3文件,所以如果我打电话

audio.scheduleFile(NSBundle.mainBundle().URLForresource(“Moon River”,withExtension:“mp3”)!)
它将正确播放本地文件.现在我希望能够流式传输非本地网址.

我需要做什么才能让我流式传输MP3网址?

class Audio: NSObject {
    var graph: AUGraph
    var filePlayerAU: AudioUnit
    var filePlayerNode: AUNode
    var outputAU: AudioUnit
    var filEID: AudioFilEID
    var currentFrame: Int64

    override init () {
        graph = AUGraph()
        filePlayerAU = AudioUnit()
        filePlayerNode = AUNode()
        outputAU = AudioUnit()
        filEID = AudioFilEID()
        currentFrame = 0

        super.init()

        NewAUGraph(&graph)

        // Add file player node
        var cd = AudioComponentDescription(componentType: OSType(kAudioUnitType_Generator),componentSubType: OSType(kAudioUnitSubType_AudioFilePlayer),componentManufacturer: OSType(kAudioUnitManufacturer_ApplE),componentFlags: 0,componentFlagsmask: 0)
        AUGraphAddNode(graph,&cd,&filePlayerNodE)

        // Add output node
        var outputNode = AUNode()

        cd.componentType = OSType(kAudioUnitType_Output)
        cd.componentSubType = OSType(kAudioUnitSubType_RemoteIO)
        AUGraphAddNode(graph,&outputNodE)

        // Graph must be opened before we can get node info!
        AUGraphOpen(graph)
        AUGraphNodeInfo(graph,filePlayerNode,nil,&filePlayerAU)
        AUGraphNodeInfo(graph,outputNode,&outputAU)


        AUGraphConnectNodeInput(graph,0)
        AUGraphInitialize(graph)

        registerCallBACkForAU(filePlayerAU,nil)
    }

    func scheduleFile(url: NSURL) {
        AudioFiLeopenURL(url,1,&filEID)

        // Step 1: schedule the file(s)
        // kAudioUnitProperty_scheduledFilEIDs takes an array of AudioFilEIDs
        var filesToschedule = [filEID]
        AudioUnitSetProperty(filePlayerAU,AudioUnitPropertyID(kAudioUnitProperty_scheduledFilEIDs),AudioUnitScope(kAudioUnitScope_Global),filesToschedule,UInt32(sizeof(AudioFilEID)))
    }

    func scheduleRegion() {
        // Step 2: schedule the regions of the file(s) to play
        // Swift forces us to fill out the structs completely,even if they are not used
        let smpteTime = SMPTETime(mSubframes: 0,mSubframeDivisor: 0,mCounter: 0,mType: 0,mFlags: 0,mHours: 0,mminutes: 0,mSeconds: 0,mFrames: 0)

        var timestamp = Audiotimestamp(mSampleTime: 0,mHostTime: 0,mRateScalar: 0,mWordClockTime: 0,mSMPTETime: smpteTime,mFlags: UInt32(kAudiotimestampSampleTimeValid),mReserved: 0)

        var region = scheduledAudioFileRegion()
        region.mtimestamp = timestamp
        region.mCompletionProc = nil
        region.mCompletionProcUserData = nil
        region.mAudioFile = filEID
        region.mLoopCount = 0
        region.mStartFrame = currentFrame
        region.mFramesToPlay = UInt32.max

        AudioUnitSetProperty(filePlayerAU,AudioUnitPropertyID(kAudioUnitProperty_scheduledFileRegion),&region,UInt32(sizeof(scheduledAudioFileRegion)))

        // Step 3: Prime the file player
        var primeFrames: UInt32 = 0
        AudioUnitSetProperty(filePlayerAU,AudioUnitPropertyID(kAudioUnitProperty_scheduledFilePrimE),&primeFrames,UInt32(sizeof(UInt32)))

        // Step 4: schedule the start time (-1 = Now)
        timestamp.mSampleTime = -1
        AudioUnitSetProperty(filePlayerAU,AudioUnitPropertyID(kAudioUnitProperty_scheduleStarttimestamp),&timestamp,UInt32(sizeof(Audiotimestamp)))
    }
}

解决方法

如果您要从服务器播放远程文件(mp3).我会研究使用AVPlayer().

https://developer.apple.com/documentation/avfoundation/avplayer

这是一个片段,可能会推动你朝着正确的方向前进.当然,这只是一个非常基本的例子.

func playRemoteFile() {

    let fileUrl = "http://www.foo.com/bar.mp3"
    let url = NSURL(String: fileUrl)

    var myPlayer = AVPlayer(URL: url)
    myPlayer.play()
}

大佬总结

以上是大佬教程为你收集整理的如何在Swift中流式传输MP3网址(iOS)?全部内容,希望文章能够帮你解决如何在Swift中流式传输MP3网址(iOS)?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。