gpt4 book ai didi

ios - 如何管理每个tableviewCell中的AVAudioPlayer isPlaying?

转载 作者:行者123 更新时间:2023-11-28 06:14:31 26 4
gpt4 key购买 nike

我有一个 tableview 并且在 tableView 中有多个单元格。
每个单元格都有一个 AVAudioPlayer
我遇到了一个问题。
我不知道如何管理 AVAudioPlayer。
当我播放第一个 AVAudioPlayer,然后播放第二个 AVAudioPlayer 时,声音会重叠。
如何在我的自定义单元格中停止第一个 AVAudioPlayer,并播放第二个 AVAudioPlayer?
谢谢。

这是我定制的单元格:

class TableViewCell: UITableViewCell {

@IBOutlet weak var myImageView: UIImageView!
@IBOutlet weak var myChatBubbleView: UIView!
@IBOutlet weak var myDateLabel: UILabel!
@IBOutlet weak var mySecondLabel: UILabel!
@IBOutlet weak var myRecordPlayerBtn: MenuButton!
private var timer:Timer?
private var elapsedTimeInSecond:Int = 0
var audioPlayer:AVAudioPlayer?
var message:ChatroomMessage?
var chatroomId:String = ""
var delegate:PlayRecordDelegate?

override func awakeFromNib() {
super.awakeFromNib()
// Initialization code

self.backgroundColor = defaultBackgroundColor
self.tintColor = defaultChatroomCheckButtonColor

myImageView.layer.masksToBounds = true
myImageView.layer.cornerRadius = defaultIconRadius

myChatBubbleView.backgroundColor = defaultChatGreenBubbleColor
myChatBubbleView.layer.cornerRadius = defaultButtonRadius

myDateLabel.textColor = defaultChatTimeColor

mySecondLabel.textColor = defaultChatTimeColor
mySecondLabel.isHidden = true

myRecordPlayerBtn.imageView?.animationDuration = 1
myRecordPlayerBtn.imageView?.animationImages = [
UIImage(named: "img_myRocordPlaying1")!,
UIImage(named: "img_myRocordPlaying2")!,
UIImage(named: "img_myRocordPlaying3")!
]
}

override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)

// Configure the view for the selected state
}

func loadByMessage(_ message:ChatroomMessage, chatroomId:String) {
self.message = message
self.chatroomId = chatroomId

myRecordPlayerBtn.addTarget(self, action: #selector(recordPlay), for: .touchUpInside)
}

func resetRecordAnimation() {
self.myRecordPlayerBtn.imageView!.stopAnimating()
self.myRecordPlayerBtn.isSelected = false
}

func recordPlay(_ sender: UIButton) {

self.myRecordPlayerBtn.imageView?.startAnimating()

let documentsDirectoryURL = try! FileManager().url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("\(chatroomId)/Record/")

let fileName = message?.content.substring(from: 62)
let fileURL = documentsDirectoryURL.appendingPathComponent(fileName!)
if FileManager.default.fileExists(atPath: fileURL.path) {

let asset = AVURLAsset(url: URL(fileURLWithPath: fileURL.path), options: nil)
let audioDuration = asset.duration
let audioDurationSeconds = CMTimeGetSeconds(audioDuration)
self.elapsedTimeInSecond = Int(audioDurationSeconds)

if audioPlayer?.isPlaying == true {

audioPlayer?.stop()

DispatchQueue.main.async {
self.resetTimer(second: self.elapsedTimeInSecond)
self.startTimer()
}

}

updateTimeLabel()
startTimer()

audioPlayer = try? AVAudioPlayer(contentsOf: fileURL)
audioPlayer?.delegate = self
audioPlayer?.play()

}else{
//don't have file in local
let recordUrl = URL(string: (message?.content)!)
URLSession.shared.downloadTask(with: recordUrl!, completionHandler: { (location, response, error) in

guard
let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
let mimeType = response?.mimeType, mimeType.hasPrefix("audio"),
let location = location, error == nil
else { return }
do {
try FileManager.default.moveItem(at: location, to: fileURL)

let asset = AVURLAsset(url: URL(fileURLWithPath: fileURL.path), options: nil)
let audioDuration = asset.duration
let audioDurationSeconds = CMTimeGetSeconds(audioDuration)

self.elapsedTimeInSecond = Int(audioDurationSeconds)

DispatchQueue.main.async {
self.updateTimeLabel()
self.startTimer()
}

self.audioPlayer = try? AVAudioPlayer(contentsOf: fileURL)
self.audioPlayer?.delegate = self
self.audioPlayer?.play()

} catch {
print(error)
}
}).resume()
}
}

func startTimer() {

timer?.invalidate()
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: { (timer) in
self.elapsedTimeInSecond -= 1
self.updateTimeLabel()
})
}

func resetTimer(second:Int) {
timer?.invalidate()
elapsedTimeInSecond = second
updateTimeLabel()
}

func updateTimeLabel() {

let seconds = elapsedTimeInSecond % 60
let minutes = (elapsedTimeInSecond/60) % 60

mySecondLabel.isHidden = false
mySecondLabel.text = String(format: "%02d:%02d", minutes,seconds)
}
}

extension TableViewCell:AVAudioPlayerDelegate {

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {

let documentsDirectoryURL = try! FileManager().url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("\(Id)/Record/")
let fileName = message?.content.substring(from: 62)
let fileURL = documentsDirectoryURL.appendingPathComponent(fileName!)

if FileManager.default.fileExists(atPath: fileURL.path) {

let asset = AVURLAsset(url: URL(fileURLWithPath: fileURL.path), options: nil)
let audioDuration = asset.duration
let audioDurationSeconds = CMTimeGetSeconds(audioDuration)

DispatchQueue.main.async {
self.resetTimer(second: Int(audioDurationSeconds))
self.myRecordPlayerBtn.imageView!.stopAnimating()
self.myRecordPlayerBtn.imageView?.image = #imageLiteral(resourceName: "img_myRocordDefault")
}
}
}
}

最佳答案

可能首先初始化检查你的播放器是否正在播放

if audioPlayer != nil{
if audioPlayer?.isPlaying == true {

audioPlayer?.stop()

DispatchQueue.main.async {
self.resetTimer(second: self.elapsedTimeInSecond)
self.startTimer()
}

}
}

关于ios - 如何管理每个tableviewCell中的AVAudioPlayer isPlaying?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45542348/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com