قابلیت نمایش چند ویدیو در avplayer بصورت صفی و پشت هم
سلام من avplayer رو ساختم، فقط مشکلش اینه که من میخوام چند ویدیو رو بصورت صفی نمایش بده، بطور مثال وقتی روی دکمه "نمایش ویدیو ها" کلیک شد، به ترتیب تعدادی ویدیو رو نمایش بده.
کد نمایش یک ویدیو در avplayer:
class SessionListViewController: UIViewController {
var playerController = AVPlayerViewController()
var player:AVPlayer?
override func viewDidLoad() {
super.viewDidLoad()
let video:String? = NSBundle.mainBundle().pathForResource("Video", ofType: ".mp4")
let videoURL = NSURL(fileURLWithPath: video!)
self.player = AVPlayer(URL: videoURL as NSURL)
self.playerController.player = self.player
}
@IBAction func showVideos(sender: UIButton) {
self.presentViewController(self.playerController, animated: true, completion: {
self.playerController.player?.play()
})
}
}
سلام ،
برای نمایش به ترتیب شما نیاز به کدی دارید که متوجه شوید چه زمان ویدئویی پایان یافته و بعد از آن از طریق خواندن خانه دیگر آرایه ویدئو بعدی را پخش کنید .
از این کد می توانید برای این موضوع استفاده کنید ، البته کد را تست نکرده ام.
Swift 2 :
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")
}
من برای انجام این کار از AVQueuePlayer استفاده کردم ، ولی به یکسری ارور runtime برخوردم.
این هم کد :
class VideoMenuViewController: UIViewController {
var playerController = AVPlayerViewController()
var player:AVPlayer?
var playerItems = [AVPlayerItem]();
var videosString = [String]();
var videosURL = [NSURL]();
var queuePlayer:AVQueuePlayer?;
override func viewDidLoad() {
super.viewDidLoad()
self.videosString.append(NSBundle.mainBundle().pathForResource("Video1", ofType: ".mp4")!)
self.videosString.append(NSBundle.mainBundle().pathForResource("Video2", ofType: ".mp4")!)
self.videosString.append(NSBundle.mainBundle().pathForResource("Video3", ofType: ".mp4")!)
for item in videosString{
self.videosURL.append(NSURL(fileURLWithPath: item))
}
for item in videosURL{
self.playerItems.append(AVPlayerItem(URL: item))
}
for item in playerItems{
self.queuePlayer?.insertItem(item, afterItem: nil)
}
self.playerController.player = self.queuePlayer
}
@IBAction func showVideo(sender: UIButton) {
self.presentViewController(self.playerController, animated: true, completion: {
self.playerController.player?.play()
})
}
}
میشه بگید مشکل از کجاست! چون من هیچ اطاعاتی از AVQueuePlayer ندارم و چیز زیادی هم در موردش پیدا نکردم. ممنون (2 دقیقه پیش)
اون روشی که شما گفتین خیلی از امکانات از جمله دکمه های پلیر که جابجایی بین ویدیو ها رو مدیریت میکنه رو نداره، خود سایت اپل این ابزار رو پیشنهاد داده ولی متاسفانه هیچ منبعی که استفاده کردن ازش رو کامل توضیح بده پیدا نکردم و اینی که الآن نوشتم تیکه تیکه از جاهای مختلف برداشت کردم و نوشتم.
این هم عکس ارور :
خیلی ممنون مشکلم حل شد اما با دو خط کد کاملا بی منطق. مشکل از نحوه اضافه کردن ویدیو ها به queuePlayer بود. که به جای :
for item in playerItems{
self.queuePlayer?.insertItem(item, afterItem: nil)
}
self.playerController.player = self.queuePlayer
این کد رو وارد کردم:
self.queuePlayer = AVQueuePlayer(items: self.playerItems)
self.playerController.player = self.queuePlayer
الآن یک مسئله ای که دارم اینه که نمیدونم چجوری باید پلیر رو محدود کنم که فقط توی حالت landscape باشه.
البته ببخشید خیلی سوال میپرسم ها :D
درسته اما چون من از navigationViewController استفاده کردم کد :
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.LandscapeLeft
}
عملا هیچ کار مفیدی انجام نمیده برای همین اومدم از navigationControllerDeligate استفاده کردم و این کار رو انجام دادم :
func navigationControllerSupportedInterfaceOrientations(navigationController: UINavigationController) -> UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.LandscapeLeft
}
که این هم هیچ کار مفیدی انجام نمیده.
هرچی هم سرچ کردم و توی stackOverFlow هم گشتم هیچ چیز خاصی پیدا نکردم. این شد که دوباره دست به دامن شما شدم :)
در متد viewDidLoad این دستور را وارد کنید :
let value = UIInterfaceOrientation.LandscapeLeft.rawValue
UIDevice.currentDevice().setValue(value, forKey: "orientation")
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .