Adakah cara untuk mengetahui apakah AVPlayer
pemutaran terhenti atau mencapai akhir?
106
Adakah cara untuk mengetahui apakah AVPlayer
pemutaran terhenti atau mencapai akhir?
Untuk mendapatkan pemberitahuan untuk mencapai akhir item (melalui Apple ):
[[NSNotificationCenter defaultCenter]
addObserver:<self>
selector:@selector(<#The selector name#>)
name:AVPlayerItemDidPlayToEndTimeNotification
object:<#A player item#>];
Dan untuk melacak permainan Anda dapat:
"track perubahan di posisi playhead dalam suatu objek AVPlayer" dengan menggunakan addPeriodicTimeObserverForInterval: antrian: usingBlock: atau addBoundaryTimeObserverForTimes: antrian: usingBlock: .
Contohnya dari Apple:
// Assume a property: @property (retain) id playerObserver;
Float64 durationSeconds = CMTimeGetSeconds([<#An asset#> duration]);
CMTime firstThird = CMTimeMakeWithSeconds(durationSeconds/3.0, 1);
CMTime secondThird = CMTimeMakeWithSeconds(durationSeconds*2.0/3.0, 1);
NSArray *times = [NSArray arrayWithObjects:[NSValue valueWithCMTime:firstThird], [NSValue valueWithCMTime:secondThird], nil];
self.playerObserver = [<#A player#> addBoundaryTimeObserverForTimes:times queue:NULL usingBlock:^{
// Passing NULL for the queue specifies the main queue.
NSString *timeDescription = (NSString *)CMTimeCopyDescription(NULL, [self.player currentTime]);
NSLog(@"Passed a boundary at %@", timeDescription);
[timeDescription release];
}];
-replaceCurrentItemWithPlayerItem:
, dan tidak menanganinya dengan benar. Cara yang lebih dapat diandalkan bagi saya adalah melacakAVPlayer
status menggunakan KVO. Lihat jawaban saya di bawah untuk detail lebih lanjut: stackoverflow.com/a/34321993/3160561AVPlayerItemFailedToPlayToEndTimeNotification
Anda dapat membedakannya dengan menggunakan:
Ekstensi Swift 3:
sumber
- [AVPlayer setRate:-1.0]
), karena-1.0
kurang dari 0.Di iOS10, ada properti bawaan untuk ini sekarang: timeControlStatus
Misalnya, fungsi ini memutar atau menjeda avPlayer berdasarkan statusnya dan memperbarui tombol putar / jeda dengan tepat.
Adapun pertanyaan kedua Anda, untuk mengetahui apakah avPlayer mencapai akhir, hal termudah yang harus dilakukan adalah mengatur notifikasi.
Saat video mencapai akhir, misalnya, Anda dapat memundurkannya ke awal video dan mengatur ulang tombol Jeda ke Putar.
Contoh ini berguna jika Anda membuat kontrol Anda sendiri, tetapi jika Anda menggunakan AVPlayerViewController, kontrol tersebut sudah ada di dalamnya.
sumber
rate
adalah TIDAK cara untuk memeriksa apakah video yang diputar (bisa terhenti). Dari dokumentasirate
:Kata kunci "keinginan untuk bermain" - tingkat
1.0
tidak berarti video sedang diputar.Solusi sejak iOS 10.0 adalah menggunakan
AVPlayerTimeControlStatus
yang dapat diamati diAVPlayer
timeControlStatus
properti.Solusi sebelum iOS 10.0 (9.0, 8.0 dll.) Adalah menggulung solusi Anda sendiri. Nilai rata
0.0
-rata video dijeda. Jikarate != 0.0
itu berarti video sedang diputar atau terhenti.Anda dapat mengetahui perbedaannya dengan mengamati waktu pemain melalui:
func addPeriodicTimeObserver(forInterval interval: CMTime, queue: DispatchQueue?, using block: @escaping (CMTime) -> Void) -> Any
Blok mengembalikan waktu pemain saat ini masuk
CMTime
, jadi perbandinganlastTime
(waktu yang terakhir diterima dari blok) dancurrentTime
(waktu blok baru saja dilaporkan) akan memberi tahu apakah pemain itu bermain atau terhenti. Misalnya, jikalastTime == currentTime
danrate != 0.0
, maka pemain terhenti.Sebagaimana dicatat oleh orang lain, mencari tahu apakah pemutaran telah selesai ditunjukkan dengan
AVPlayerItemDidPlayToEndTimeNotification
.sumber
Alternatif yang lebih dapat diandalkan
NSNotification
adalah menambahkan diri Anda sebagai pengamat kerate
properti pemain .Kemudian periksa apakah nilai baru untuk kecepatan yang diamati adalah nol, yang berarti pemutaran berhenti karena beberapa alasan, seperti mencapai akhir atau terhenti karena buffer kosong.
Sebagai
rate == 0.0
contoh, untuk mengetahui apa sebenarnya yang menyebabkan pemutaran berhenti, Anda dapat melakukan pemeriksaan berikut:Dan jangan lupa untuk membuat pemain Anda berhenti saat mencapai akhir:
self.player.actionAtItemEnd = AVPlayerActionAtItemEndPause;
sumber
AVPlayerItemFailedToPlayToEndTimeNotification
. Jika kesalahan ini terjadi, tidak akan pernah mencapai akhir zaman. Atau membaca jawaban maz, tambahkan cek untuk kode Andaplayer.error != nil
, dalam hal ini pemutaran telah "berakhir" karena kesalahan.AVPlayerItemDidPlayToEndTimeNotification
?Untuk Swift :
AVPlayer :
Pembaruan :
player.rate > 0
kondisi berubah menjadiplayer.rate != 0
karena jika video diputar terbalik dapat menjadi negatif berkat Julian karena telah menunjukkan.Catatan : Ini mungkin terlihat sama seperti di atas (jawaban Maz) tetapi di Swift '! Player.error' memberi saya kesalahan kompiler sehingga Anda harus memeriksa kesalahan menggunakan 'player.error == nil' di Swift. (Karena properti kesalahan bukan tipe 'Bool')
AVAudioPlayer:
AVQueuePlayer:
sumber
player.rate = -1.0
), karena -1.0 kurang dari 0.Perpanjangan cepat berdasarkan jawaban oleh maz
sumber
Versi Swift dari jawaban maxkonovalov adalah ini:
dan
Terima kasih maxkonovalov!
sumber
nil
! Tapi saya perlu tahu kapan tampilan dimulai (bukan berakhir). Ada cara untuk melakukan itu?Saat ini dengan swift 5, cara termudah untuk memeriksa apakah pemutar sedang bermain atau dijeda adalah dengan memeriksa variabel .timeControlStatus .
sumber
sumber
sumber