swift: 聊天应用程序 - 单元格内的音频播放器
swift: chat app - audio player within cells
我的应用程序允许用户像在典型的消息传递应用程序中一样发送音频。
问题是每次收到新消息时我正在刷新我的 collectionView,音频就会停止。
此刻我在消息单元格中有一个 AVPlayer。
有没有更好的方法以及如何确保刷新 collectionView 时音频不会停止播放?
你可以这样声明你的玩家
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)
解决方案非常简单。因为我正在重新加载完整的 collectionView
DispatchQueue.main.async{
self.collectionView.reloadData()
(...)
}
不得不提这个问题。我通过仅插入新单元格或重新加载特定单元格而不是重新加载完整的 collectionView 来解决它。
我的应用程序允许用户像在典型的消息传递应用程序中一样发送音频。 问题是每次收到新消息时我正在刷新我的 collectionView,音频就会停止。
此刻我在消息单元格中有一个 AVPlayer。
有没有更好的方法以及如何确保刷新 collectionView 时音频不会停止播放?
你可以这样声明你的玩家
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)
解决方案非常简单。因为我正在重新加载完整的 collectionView
DispatchQueue.main.async{
self.collectionView.reloadData()
(...)
}
不得不提这个问题。我通过仅插入新单元格或重新加载特定单元格而不是重新加载完整的 collectionView 来解决它。