Tôi đang sử dụng AVPlayer để phát tệp video cục bộ (mp4) trong Swift. Có ai biết cách phát hiện khi video kết thúc bằng cách phát không? Cảm ơnCách phát hiện khi nào video AVPlayer kết thúc phát?
Trả lời
Để nhận được AVPlayerItemDidPlayToEndTimeNotification
đối tượng của bạn cần phải là AVPlayerItem
.
Để làm như vậy, chỉ cần sử dụng .currentItem
tài sản trên của bạn AVPlayer
Bây giờ bạn sẽ nhận được thông báo khi video kết thúc!
Xem ví dụ của tôi:
let videoPlayer = AVPlayer(URL: url)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerDidFinishPlaying:",
name: AVPlayerItemDidPlayToEndTimeNotification, object: videoPlayer.currentItem)
func playerDidFinishPlaying(note: NSNotification) {
print("Video Finished")
}
Swift 3
let videoPlayer = AVPlayer(URL: url)
NotificationCenter.default.addObserver(self, selector: Selector(("playerDidFinishPlaying:")),
name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: videoPlayer.currentItem)
func playerDidFinishPlaying(note: NSNotification) {
print("Video Finished")
}
Đừng quên để loại bỏ các Observer tại của bạn deinit
bạn có biết sự khác biệt giữa việc sử dụng phương pháp này và sử dụng phương pháp AVPlayer 'addPeriodicTimeObserver (TimeInterval:)'? – MikeG
addPeriodicTimeObeserver được sử dụng khi bạn muốn được thông báo khi khoảng thời gian tăng. ví dụ, nếu bạn muốn được thông báo sau mỗi 0,5 giây, bạn sẽ tạo một CMTime là 0,5 giây và cuộc gọi lại sẽ được gọi mỗi 0.5 giây. – jstn
addObserver này có gây ra rò rỉ bộ nhớ khi được sử dụng nhiều lần không? – Martian2049
Swift 3.0
let videoPlayer = AVPlayer(URL: url)
NotificationCenter.default.addObserver(self, selector:#selector(self.playerDidFinishPlaying(note:)),name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem)
@objc func playerDidFinishPlaying(note: NSNotification){
print("Video Finished")
}
Nhưng nó nói [myClass playerDidFinishPlaying:]: unrecognized chọn gửi đến dụ –
'#selector (playerDidFinishPlaying)' – djv
addObserver này gây ra rò rỉ bộ nhớ khi sử dụng nhiều lần? – Martian2049
Swift 3,0
let videoPlayer = AVPlayer(URL: url)
NotificationCenter.default.addObserver(self, selector:#selector(self.playerDidFinishPlaying(note:)),name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem)
func playerDidFinishPlaying(note: NSNotification){
//Called when player finished playing
}
Đối với SWIFT 3.0
Dưới đây fullurl 'là URL của video và chắc chắn rằng sẽ không có không gian trong URL, Bạn nên thay thế 'Space 'với'% 20 'sao cho URL đó sẽ hoạt động.
let videoURL = NSURL(string: fullUrl)
let player = AVPlayer(url: videoURL! as URL)
playerViewController.delegate = self
playerViewController.player = player
self.present(playerViewController, animated: false) {
self.playerViewController.player!.play()
NotificationCenter.default.addObserver(self, selector: #selector(yourViewControllerName.playerDidFinishPlaying), name: Notification.Name.AVPlayerItemDidPlayToEndTime, object: self.player?.currentItem)
}
Thêm phương thức này dưới đây vào bộ điều khiển chế độ xem của bạn.
func playerDidFinishPlaying(){
print("Video Finished playing in style")
}
addObserver này có gây ra rò rỉ bộ nhớ khi được sử dụng nhiều lần không? – Martian2049
Đối với SWIFT 3.0 này đang làm việc tốt
class PlayVideoViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(PlayVideoViewController.finishVideo), name: NSNotification.Name.AVPlayerItemDidPlayToEndTimeNotification, object: nil)
}
func finishVideo()
{
print("Video Finished")
}
}
Trong Swift 3 và RxSwift 3.5 tất cả các bạn phải làm là:
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.rx.notification(Notification.Name.AVPlayerItemDidPlayToEndTime)
.asObservable().subscribe(onNext: { [weak self] notification in
//Your action
}).addDisposableTo(disposeBag)
}
Tôi biết có rất nhiều các câu trả lời được chấp nhận tại đây ...
Bu t, một tuyến đường khác có thể là thêm một người quan sát thời gian biên giới vào AVPlayer của bạn. Bạn sẽ phải có thời lượng của video mà bạn có thể nhận được từ số player.currentItem
và sau đó thêm nó làm ranh giới thời gian mong muốn của bạn.
fileprivate var videoEndObserver: Any?
func addVideoEndObserver() {
guard let player = YOUR_VIDEO_PLAYER else { return }
// This is just in case you are loading a video from a URL.
guard let duration = player.currentItem?.duration, duration.value != 0 else {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: { [weak self] in
self?.addVideoEndObserver()
})
return
}
let endTime = NSValue(time: duration - CMTimeMakeWithSeconds(0.1, duration.timescale))
videoEndObserver = player.addBoundaryTimeObserver(forTimes: [endTime], queue: .main, using: {
self.removeVideoEndObserver()
// DO YOUR STUFF HERE...
})
}
func removeVideoEndObserver() {
guard let observer = videoEndObserver else { return }
videoPlayer.player?.removeTimeObserver(observer)
videoEndObserver = nil
}
Swift 4,0
một này làm việc cho tôi. Nhờ @Channel
private func playVideo(fileURL: String) {
// Create RUL object
let url = URL(string: fileURL)
// Create Player Item object
let playerItem: AVPlayerItem = AVPlayerItem(url: url!)
// Assign Item to Player
let player = AVPlayer(playerItem: playerItem)
// Prepare AVPlayerViewController
let videoPlayer = AVPlayerViewController()
// Assign Video to AVPlayerViewController
videoPlayer.player = player
NotificationCenter.default.addObserver(self, selector: #selector(myViewController.finishVideo), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)
// Present the AVPlayerViewController
present(videoPlayer, animated: true, completion: {
// Play the Video
player.play()
})
}
@objc func finishVideo()
{
print("Video Finished")
}
- 1. Phát video bằng AVPlayer
- 2. cách phát hiện khi MotionEvent.ACTION_MOVE kết thúc
- 3. Cách đặt AVPlayer xuất hiện ngay lập tức thay vì sau khi video kết thúc?
- 4. Phát hiện khi kết thúc chuỗi
- 5. Làm cách nào để hiển thị kết thúc áp phích video html5 khi phát video?
- 6. Phát video với AVPlayer trong Swift Playground?
- 7. Nhận thời gian phát video hiện tại trong AVPlayer ios
- 8. Cách phát hiện kết thúc luồng?
- 9. Swift: Phát video trên Facebook bằng AVPlayer
- 10. Phát video được mã hóa bằng AVPlayer
- 11. Phát video với AVPlayer sau AVCaptureMovieFileOutput
- 12. IOS AVPlayer sẽ không phát video
- 13. Phát hiện Khi máy ảnh AVFoundation kết thúc lấy nét
- 14. Làm thế nào để hiển thị lightbox sau khi kết thúc phát video?
- 15. Cách phát hiện tệp kết thúc bằng dòng mới?
- 16. Phát hiện khi AvPlayer chuyển đổi tốc độ bit
- 17. AVPlayer sẽ không phát video từ url trong iOS9
- 18. Phát hiện khi một đoạn video YouTube đã chơi xong
- 19. Phát hiện kết thúc của fling trên ScrollView
- 20. Phát hiện kết thúc Nói trong freeTTS cho java
- 21. API Postgres Async phát hiện kết thúc truy vấn
- 22. Phát hiện ScrollView đã đạt đến kết thúc
- 23. AVPlayer chưa bao giờ sẵn sàng phát
- 24. Phát hiện video 360 độ
- 25. Cách phát hiện khi nào kết nối WiFi (lại)?
- 26. Truy cập dữ liệu của AVPlayer khi phát video từ HTTP Live Streaming
- 27. Nhanh chóng, cách phát hiện cảm ứng khi phát video trong AVPlayerViewController
- 28. Làm cách nào để phát video (tự động phát) trong UITableViewCell trong iOS
- 29. Làm thế nào để phát hiện khi hoạt ảnh UINavigationController kết thúc?
- 30. nhanh chóng. AVPlayer. Làm thế nào để theo dõi khi bài hát kết thúc chơi?
Ví dụ ObjC nhưng bạn có thể làm theo cùng một cách: http: // stackoverflow.com/questions/6837002/no-avplayer-delegate-how-to-track-khi-song-thành-chơi-mục tiêu-c-iphon – kabarga
Tại sao bạn không thể chấp nhận một trong các câu trả lời dưới đây? – D4ttatraya
bởi vì những câu trả lời hút, dường như ai đó đã lây lan misinformations – Martian2049