如何在Swift中流式传输MP3网址(iOS)?
发布时间:2020-12-14 04:52:49 所属栏目:百科 来源:网络整理
导读:目前下面的代码可以流式传输本地mp3文件,所以如果我打电话 audio.scheduleFile(NSBundle.mainBundle().URLForResource(“Moon River”,withExtension:“mp3”)!) 它将正确播放本地文件.现在我希望能够流式传输非本地网址. 我需要做什么才能让我流式传输MP3
目前下面的代码可以流式传输本地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),®ion,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() } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |