swift:聊天应用程序 - 单元格内的音频播放器

时间:2018-04-29 20:46:22

标签: ios swift avplayer

我的应用程序允许用户像在典型的消息传递应用程序中一样发送音频。 问题是,每次有新消息进入时,我都会刷新我的collectionView,音频会停止。

目前我在消息单元中有一个AVPlayer。

有没有更好的方法,我怎样才能确保在刷新collectionView时音频不会停止播放?

2 个答案:

答案 0 :(得分:0)

你可以声明你这样的球员

import UIKit
import AVFoundation
import MediaToolbox
import MediaPlayer

class MusicPlayer: NSObject {

    static let player = MusicPlayer()

    //this is global variable
    var player : AVPlayer?
    var playerItem:AVPlayerItem?

    func initPlayer(){
        do {
            UIApplication.shared.beginReceivingRemoteControlEvents()
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)
            print("AVAudioSession Category Playback OK")
            do {
                try AVAudioSession.sharedInstance().setActive(true)

                print("AVAudioSession is Active")

            } catch let error as NSError {
                print(error.localizedDescription)
            }
        } catch let error as NSError {
            print(error.localizedDescription)
        }
}
    func playMusic(_ musicUrl: String?) {
        if let mm = musicUrl {
            var url: URL!
            url = URL(string: mm)
            playerItem = AVPlayerItem(url: url)
            player = AVPlayer(playerItem: playerItem)
            player?.volume = 1.0
            player?.rate = 1.0
            player?.play()

        }
    }

}

您可以像这样在AppDelegate中初始化

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    MusicPlayer.player.initPlayer()


    return true
}

在该玩家使用之后

MusicPlayer.player.playMusic(YourFile)

答案 1 :(得分:0)

解决方案非常简单。因为我正在重新加载完整的collectionView

DispatchQueue.main.async{
   self.collectionView.reloadData()
   (...)
}

这个问题不得不出现。我通过插入新单元格或重新加载特定单元格而不是重新加载完整的collectionView来解决它。