Apakah ada cara yang relatif mudah untuk mengulang video di AVFoundation?
Saya telah membuat AVPlayer dan AVPlayerLayer seperti:
avPlayer = [[AVPlayer playerWithURL:videoUrl] retain];
avPlayerLayer = [[AVPlayerLayer playerLayerWithPlayer:avPlayer] retain];
avPlayerLayer.frame = contentView.layer.bounds;
[contentView.layer addSublayer: avPlayerLayer];
dan kemudian saya memutar video saya dengan:
[avPlayer play];
Video diputar dengan baik tetapi berhenti pada akhirnya. Dengan MPMoviePlayerController yang harus Anda lakukan adalah mengatur repeatMode
propertinya ke nilai yang tepat. Tampaknya tidak ada properti serupa di AVPlayer. Sepertinya juga tidak ada panggilan balik yang akan memberi tahu saya ketika film telah selesai sehingga saya dapat mencari ke awal dan memutarnya lagi.
Saya tidak menggunakan MPMoviePlayerController karena memiliki beberapa keterbatasan serius. Saya ingin dapat memutar ulang beberapa aliran video sekaligus.
Jawaban:
Anda bisa mendapatkan Pemberitahuan saat pemain berakhir. Memeriksa
AVPlayerItemDidPlayToEndTimeNotification
Saat mengatur pemain:
ObjC
ini akan mencegah pemain untuk berhenti di akhir.
dalam pemberitahuan:
ini akan memundurkan film.
Jangan lupa batalkan batalkan pemberitahuan saat melepaskan pemain.
Cepat
Swift 4+
sumber
avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone;
tidak akan berhenti, jadi tidak perlu mengaturnya untuk bermain lagi[player play];
setelah memutar ulang.[[NSNotificationCenter defaultCenter] removeObserver:self];
misalnya, saatself
mendengarkan pemberitahuan.Jika itu membantu, di iOS / tvOS 10, ada AVPlayerLooper () baru yang dapat Anda gunakan untuk membuat perulangan video yang mulus (Swift):
Ini disajikan di WWDC 2016 dalam "Kemajuan dalam Pemutaran AVFoundation": https://developer.apple.com/videos/play/wwdc2016/503/
Bahkan dengan menggunakan kode ini, saya memiliki masalah sampai saya mengajukan laporan bug dengan Apple dan mendapat respons ini:
Ternyata Premiere telah mengekspor file dengan trek audio dengan panjang yang sedikit berbeda dari video. Dalam kasus saya itu baik-baik saja untuk menghapus audio sepenuhnya, dan itu memperbaiki masalah.
sumber
Dalam Swift :
Anda bisa mendapatkan Pemberitahuan saat pemain berakhir ... periksa AVPlayerItemDidPlayToEndTimeNotification
saat mengatur pemain:
ini akan mencegah pemain untuk berhenti di akhir.
dalam pemberitahuan:
Swift3
ini akan memundurkan film.
Jangan lupa membatalkan registrasi notifikasi saat melepaskan pemain.
sumber
Inilah yang akhirnya saya lakukan untuk mencegah masalah jeda-cegukan:
Cepat:
Sasaran C:
CATATAN: Saya tidak menggunakannya
avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone
karena tidak diperlukan.sumber
[weakSelf.avPlayer seekToTime:kCMTimeZero]; [weakSelf.avPlayer play];
garis - ketika saya berkomentar garis-garis ini tidak ada lagi kebocoran memori. Saya sudah membuat profil ini dalam instrumen.Saya sarankan menggunakan AVQueuePlayer untuk mengulang video Anda dengan mulus. Tambahkan pengamat pemberitahuan
dan di pemilihnya, putar video Anda
sumber
Untuk menghindari kesenjangan saat video diputar ulang, menggunakan banyak salinan dari aset yang sama dalam komposisi berfungsi baik untuk saya. Saya menemukannya di sini:
www.developers-life.com/avplayer-looping-video-without-hiccupdelays.html(tautan sekarang mati).sumber
ini bekerja untuk saya tanpa masalah cegukan, intinya adalah menjeda pemain sebelum memanggil metode seekToTime:
init AVPlayer
mendaftar pemberitahuan
fungsi videoLoop
sumber
Untuk Swift 3 & 4
sumber
solusi saya di objektif-c dengan AVQueuePlayer - sepertinya Anda harus menduplikasi AVPlayerItem dan setelah menyelesaikan pemutaran elemen pertama langsung menambahkan salinan lain. "Agak" masuk akal dan bekerja untuk saya tanpa cegukan
https://gist.github.com/neonm3/06c3b5c911fdd3ca7c7800dccf7202ad
sumber
Swift 5:
Saya telah membuat sedikit penyesuaian dari jawaban sebelumnya seperti menambahkan playerItem ke antrian sebelum menambahkannya ke playerLayer.
Dan jadikan playerLooper properti dari UIViewController Anda, jika tidak, video hanya dapat diputar sekali.
sumber
Setelah memuat video ke dalam AVPlayer (tentu saja melalui AVPlayerItem-nya):
Metode addDidPlayToEndTimeNotificationForPlayerItem:
Dalam metode viewWillDisappear Anda:
Dalam deklarasi antarmuka pengontrol tampilan Anda dalam file implementasi:
Perlu melihat ini berjalan sebelum Anda mencoba? Unduh dan jalankan aplikasi sampel ini:
https://developer.apple.com/library/prerelease/ios/samplecode/AVBasicVideoOutput/Listings/AVBasicVideoOutput_APLViewController_m.html#//apple_ref/doc/uid/DTS40013109-AVBasicVontoLemap
Di aplikasi saya, yang menggunakan kode ini, tidak ada jeda apa pun antara akhir video dan awal. Bahkan, tergantung pada videonya, tidak ada cara bagiku untuk mengatakan bahwa videonya ada di awal lagi, simpan tampilan kode waktu.
sumber
Anda dapat menambahkan pengamat AVPlayerItemDidPlayToEndTimeNotification dan memutar ulang video dari awal di pemilih, kode seperti di bawah ini
sumber
Berikut ini berfungsi untuk saya di WKWebView di swift 4.1 Bagian utama dari WKWebView di WKwebviewConfiguration
sumber
Apa yang saya lakukan adalah membuatnya diputar, seperti kode saya di bawah ini:
sumber
Swift 4.2 dalam Xcode 10.1.
Ya , ada cara yang relatif mudah untuk mengulang video dalam
AVKit
/AVFoundation
menggunakan teknikAVQueuePlayer()
Key-Value Observation (KVO) dan token untuk itu.Ini pasti bekerja untuk banyak video H.264 / HEVC dengan beban minimal untuk CPU.
Ini kode:
sumber
gunakan kode AVPlayerViewController di bawah ini, ini berfungsi untuk saya
Semua kontrol harus ditunjukkan, semoga bermanfaat
sumber
Properti ini sudah ditentukan di dalam
AVAudioPlayer
. Semoga ini bisa membantu Anda. Saya menggunakan Xcode 6.3.sumber