如何为Swift中的每个可重用单元分配不同的音频URL

时间:2016-07-26 13:41:24

标签: swift uitableview audio uicollectionview

我有2个(或更多)可重复使用的collectionView单元格,每个单元格必须播放不同的音频。我的问题是当audio1完成时,audio2文件在audio2的同一个单元格中启动。如果我在每个单元格上手动播放都没有问题,但如果我想一个接一个地自动播放所有音频,则所有音频都在同一个单元格中播放。如果尚未创建单元格,如何在下一个单元格中启动下一个音频? 我在这里如何附加到数组:

func appendToArray() {

    for (_, page) in self.resources.enumerate() {

        for (index,resource) in page.enumerate() {
            print("Passa di qui") // Qui passa

            if resource.fileType() == .Audio {
                S3Client.sharedInstance.downloadResource(resourceKey: resource.value, completion: { (success, file) in
                    // let files = String(file)
                    self.audioURLs.append(file)
                    /**
                     if self.audioURLs.count == self.resources.count {
                     // print("audioURLs \(self.audioURLs[index])")
                     MediaAudioPlayer.sharedInstance.queueTrack(self.audioURLs)

                     }
                     */
                })
            }
        }
    }
}

这是cellForItemAtIndexPath:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    case .Audio:
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(MediaAudioCell.kCellIdentifier, forIndexPath: indexPath) as! MediaAudioCell

    cell.activityIndicator.startAnimating()
    cell.activityIndicator.hidden = false

    S3Client.sharedInstance.downloadResource(resourceKey: resource.value, completion: { (success, file) in

        if success == true && file != nil {

            cell.activityIndicator.stopAnimating()
            cell.activityIndicator.hidden = true
            cell.audioURL = file!

            // Make slider indipendent from cell to another
            cell.sliderAudio.tag = indexPath.row
            cell.sliderAudio.addTarget(self, action: "sliderChange:", forControlEvents: .ValueChanged)

            // print("ArrayURL: \(file)")
            // print("CiaoCell : \(self.audioURLs.count)")
            // print("Ciaoself.resources.countCell : \(self.resources.count)")

            /**
             if self.audioURLs.count == self.resources.count {
             // print("audioURLs \(self.audioURLs[index])")
             let item = self.audioURLs[indexPath.row] print("item: \(item)")
             }

             if self.audioURLs.count == self.resources.count {
             // print("audioURLs \(self.audioURLs[index])")
             // MediaAudioPlayer.sharedInstance.queueTrack(self.audioURLs)

             }
             */


            // Display total audio leinght
            let asset = AVURLAsset(URL: file!, options: nil)
            let audios = asset.tracksWithMediaType(AVMediaTypeAudio)

            if let audios: AVAssetTrack = audios[0] {
                let audioDuration:CMTime = audios.timeRange.duration
                let seconds:Float64 = CMTimeGetSeconds(audioDuration)
                cell.labelAudio.text = cell.stringFromTimeInterval(NSTimeInterval(seconds)) as String
            }
        }
    })

    return cell
}

这是小组课程的一部分:

override func awakeFromNib() {
    super.awakeFromNib()

    // Partenza automatica, dopo 2secondi, se Accessibilità su ON
    let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(2 * Double(NSEC_PER_SEC)))

    dispatch_after(delayTime, dispatch_get_main_queue()) {

        if self.defaults.boolForKey("AutomaticStart") == true && self.defaults.boolForKey("goBackPressed") == false {

            if let audioURL = self.audioURL {
                // Set AVAudioSession for recording and playing at the same time
                let session = AVAudioSession.sharedInstance()

                do {
                    try session.setCategory(AVAudioSessionCategoryPlayback)
                    try session.setActive(true)
                } catch _ {}

                // If audio is playing, do not pass to next if cell is created, but    continue to playing.
                if MediaAudioPlayer.sharedInstance.player?.playing == true { // Se metto a    'false', ed elimino 'else', non parte in automatico.
                } else {
                    MediaVideoPlayer.sharedInstance.stop()
                    MediaAudioPlayer.sharedInstance.playPauseAudio(audioURL: audioURL, delegate: self)
                }

            }
        }
    }
}

这是玩家类:

class MediaAudioPlayer: NSObject, AVAudioPlayerDelegate {

    static let sharedInstance = MediaAudioPlayer()
    private var delegate: MediaAudioPlayerDelegate?

    var player: AVAudioPlayer?

    private var lastURL: NSURL?
    private var timer: NSTimer?

    internal var sliderTouched: Bool = false

    var tracks = Array<NSURL?>()
    var currentTrackIndex = 0

    override init() {
        super.init()

    }

    // MARK: Setup

    func playPauseAudio(audioURL url: NSURL, delegate: MediaAudioPlayerDelegate) {
        self.delegate?.playing = true // Set default play button on last delegate
        self.delegate = delegate // Save delegate

        self.sliderTouched = false

        // Setup as new only when this audio has not been already set up
        if (self.lastURL == nil) || (url != self.lastURL) {
            self.lastURL = url

            self.setupAudioSession(category: AVAudioSessionCategoryPlayback)

            do { // Setup Player
                self.player = try AVAudioPlayer(contentsOfURL: url)
            } catch _ {}

            self.player?.delegate = self
            self.player?.prepareToPlay()

            timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: #selector(MediaAudioPlayer.update), userInfo: nil, repeats: true)
        }

        // Play - Pause
        if self.player?.playing == true {
            self.player?.pause()
            self.delegate?.playing = true
        } else {
            self.player?.play()
            self.delegate?.playing = false
        }
    }

    // Transform second to minute
    func stringFromTimeInterval(interval: NSTimeInterval) -> NSString {
        let ti = NSInteger(interval)
        let seconds = ti % 60
        let minutes = (ti / 60) % 60

        return NSString(format: "%0.2d:%0.2d", minutes, seconds)
    }

    // MARK: Audio Session

    private func setupAudioSession(category category: String) {
        let session = AVAudioSession.sharedInstance()
        do {
            try session.setCategory(category)
            try session.setActive(true)
        } catch _ {}

    }

    // MARK: Stop

    func stop() {
        self.player?.stop()
        self.player = nil // Deinit player
        self.delegate?.playing = true
        self.delegate = nil // Deinit delegate
        self.timer?.invalidate(); self.timer = nil
        self.lastURL = nil
    }

    // MARK: Playing

    internal func playing() -> Bool {
        if player != nil {
            return player?.rate == 1.0 ? true : false
        }

        return false
    }

    // MARK: Seek

    func seekToPosition(position position: Float) {
        if let duration = self.player?.duration {
            player?.currentTime = Double(position) * duration

            self.delegate?.currentTimeAudio = stringFromTimeInterval((player?.currentTime)!) as String
        }
    }

    func update() {
        if sliderTouched == false {
            if let currentTime = self.player?.currentTime, duration = player?.duration {
                let time = Float(currentTime) / Float(duration)
                self.delegate?.sliderPosition = time

                self.delegate?.currentTimeAudio = stringFromTimeInterval((player?.currentTime)!) as String
            }
        }
    }

    // MARK: Delegate
    var counter = 0

    func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) {
        print("Called")
        self.lastURL = nil
        self.delegate?.playing = true

        /**
         if flag == true {
         nextSong(true)
         }*/

        /**
         if ((counter + 1) == tracks.count) {
         counter = 0
         self.delegate?.playing = false
         nextSong(false)
         } else {
         self.delegate?.playing = true
         nextSong(true)
         }
         */
    }
}

谢谢!

0 个答案:

没有答案