AVFoundation AVPlayer দিয়ে কোনও ভিডিও লুপ করছেন?


142

এভিফাউন্ডেশনে কোনও ভিডিও লুপ করার অপেক্ষাকৃত সহজ উপায় আছে?

আমি আমার AVPlayer এবং AVPlayerLayer এর মতো তৈরি করেছি:

avPlayer = [[AVPlayer playerWithURL:videoUrl] retain];
avPlayerLayer = [[AVPlayerLayer playerLayerWithPlayer:avPlayer] retain];

avPlayerLayer.frame = contentView.layer.bounds;
[contentView.layer addSublayer: avPlayerLayer];

এবং তারপরে আমি এর সাথে আমার ভিডিওটি খেলি:

[avPlayer play];

ভিডিওটি দুর্দান্ত খেলছে তবে শেষ পর্যন্ত থামবে। MPMoviePlayerController এর মাধ্যমে আপনাকে যা করতে হবে তা হল তার repeatModeসম্পত্তিটিকে সঠিক মান হিসাবে সেট করা । এভিপ্লেয়ারে অনুরূপ সম্পত্তি বলে মনে হয় না। এমন কোনও কলব্যাক বলে মনে হচ্ছে না যা সিনেমাটি শেষ হয়ে গেলে আমাকে বলবে যাতে আমি শুরুতে চেষ্টা করতে এবং এটি আবার প্লে করতে পারি।

আমি MPMoviePlayerController ব্যবহার করছি না কারণ এর কিছু গুরুতর সীমাবদ্ধতা রয়েছে। আমি একবারে একাধিক ভিডিও স্ট্রিম খেলতে সক্ষম হতে চাই।


1
: প্রকৃত পরিশ্রমী কোডে একটি লিঙ্কের জন্য এই উত্তরটি দেখুন stackoverflow.com/questions/7822808/...
MoDJ

উত্তর:


275

প্লেয়ার শেষ হয়ে গেলে আপনি একটি বিজ্ঞপ্তি পেতে পারেন। চেকAVPlayerItemDidPlayToEndTimeNotification

প্লেয়ার স্থাপন করার সময়:

ObjC

  avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone; 

  [[NSNotificationCenter defaultCenter] addObserver:self
                                           selector:@selector(playerItemDidReachEnd:)
                                               name:AVPlayerItemDidPlayToEndTimeNotification
                                             object:[avPlayer currentItem]];

এটি প্লেয়ারটিকে শেষে থামতে বাধা দেবে।

বিজ্ঞপ্তিতে:

- (void)playerItemDidReachEnd:(NSNotification *)notification {
    AVPlayerItem *p = [notification object];
    [p seekToTime:kCMTimeZero];
}

এটি মুভিটি রিভাইন্ড করবে।

প্লেয়ারকে ছেড়ে দেওয়ার সময় নোটিফিকেশনটি নিবন্ধভুক্ত না করে ভুলে যাবেন না।

দ্রুতগতি

avPlayer?.actionAtItemEnd = .none

NotificationCenter.default.addObserver(self,
                                       selector: #selector(playerItemDidReachEnd(notification:)),
                                       name: .AVPlayerItemDidPlayToEndTime,
                                       object: avPlayer?.currentItem)

@objc func playerItemDidReachEnd(notification: Notification) {
    if let playerItem = notification.object as? AVPlayerItem {
        playerItem.seek(to: kCMTimeZero)
    }
}

সুইফট 4+

@objc func playerItemDidReachEnd(notification: Notification) {
    if let playerItem = notification.object as? AVPlayerItem {
        playerItem.seek(to: CMTime.zero, completionHandler: nil)
    }
}

6
... এবং আপনি যদি [পিক টুটাইম: কেসিএমটাইমজিরো] (এক ধরণের "রিওয়াইন্ড") এর ঠিক পরে খেলতে চান তবে কেবল [পি প্লে] করুন।
থোম্যাক্স

24
এটি প্রয়োজনীয় হওয়া উচিত নয় ... আপনি যদি avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone;এটি করেন তবে এটি থামবে না, সুতরাং এটি আবার খেলতে সেট করার দরকার নেই
বাস্টিয়ান

শব্দটি আবার খেলতে আপনাকে [player play];রিওয়াইন্ডিংয়ের পরে কল করতে হবে ।
কেনি উইঙ্কার

12
এই সমাধানটি কাজ করে তবে এটি সম্পূর্ণ বিজোড় নয়। আমার খুব ছোট বিরতি আছে আমি কি ভুল কিছু করছি?
জোরিস ভ্যান লেম্পড আইডিভোপার

3
@ প্রক্সাইটেলগুলি আপনার দৃষ্টিভঙ্গিটি নষ্ট হওয়ার পরে, বা আপনি যখন ভিডিওপ্লেয়ারটি মুছে ফেলেন বা যা কিছু করেন তা মুছে ফেলতে হবে) আপনি [[NSNotificationCenter defaultCenter] removeObserver:self];উদাহরণস্বরূপ, যখন selfবিজ্ঞপ্তিগুলি শোনার সময় ব্যবহার করতে পারেন ।
বাসটিয়ান

63

যদি এটি আইওএস / টিভিএস 10 এ সহায়তা করে তবে একটি নতুন এভিপ্লেয়ারলুপার () রয়েছে যা আপনি ভিডিওর (সুইফট) বিরামবিহীন লুপিং তৈরি করতে ব্যবহার করতে পারেন:

player = AVQueuePlayer()
playerLayer = AVPlayerLayer(player: player)
playerItem = AVPlayerItem(url: videoURL)
playerLooper = AVPlayerLooper(player: player, templateItem: playerItem)
player.play()    

এটি ডাব্লুডাব্লুডিসি 2016 এ "এভিফাউন্ডেশন প্লেব্যাকের অগ্রযাত্রায়" উপস্থাপন করা হয়েছিল: https://developer.apple.com/videos/play/wwdc2016/503/

এমনকি এই কোডটি ব্যবহার করেও, আমি অ্যাপলকে বাগ রিপোর্ট দায়ের না করে এবং এই প্রতিক্রিয়া না পাওয়া পর্যন্ত আমার একটি হিচাপ ছিল up

অডিও / ভিডিও ট্র্যাকের চেয়ে চলচ্চিত্রের সময়কাল বেশি হওয়া মুভি ফাইল is ফিগপ্লেয়ার_ফাইল ফাঁকবিহীন স্থানান্তরটি অক্ষম করছে কারণ অডিও ট্র্যাক সম্পাদনা চলচ্চিত্রের সময়কাল (15.682 বনাম 15.787) এর চেয়ে কম is

মুভি সময়কাল এবং ট্র্যাকের সময়সীমা একই দৈর্ঘ্যের জন্য আপনাকে মুভি ফাইলগুলি ঠিক করতে হবে বা আপনি এভিপ্লেয়ারলুপারের সময়সীমা প্যারামিটারটি ব্যবহার করতে পারেন (অডিও ট্র্যাকের সময়সীমা 0 থেকে সময়সীমা নির্ধারণ)

দেখা যাচ্ছে যে প্রিমিয়ার ভিডিওর চেয়ে কিছুটা আলাদা দৈর্ঘ্যের অডিও ট্র্যাকের সাথে ফাইলগুলি রফতানি করছিল। আমার ক্ষেত্রে অডিওটি পুরোপুরি সরিয়ে ফেলা ভাল ছিল এবং সমস্যাটি স্থির করে।


2
আর কিছুই আমার পক্ষে কাজ করেনি। আমি একটি এভিপ্লেয়ারলুপার ব্যবহার করছি এবং এই বাগটি পেয়েছি এবং ভিডিও / অডিও দৈর্ঘ্যের মধ্যে পার্থক্যটি সমাধান করে সমস্যার সমাধান করেছি।
কেভিন হিপ

1
প্রিমিয়ার সম্পর্কে সেই তথ্যের জন্য আপনাকে ধন্যবাদ। আমি লুপে একটি টাইমরেঞ্জ যুক্ত করেছি এবং এটি আমার "ফ্ল্যাশিং ভিডিও" সমস্যাটি স্থির করেছে।
আলেকজান্ডার ফ্লেনিকেন

@ নাভা কি ভিডিওর মধ্যে একটি নির্দিষ্ট সময়সীমার জন্য এটি ব্যবহার করা সম্ভব? উদাহরণস্বরূপ ভিডিওটি 60 সেকেন্ডের তবে আমি কেবল প্রথম 10 সেকেন্ড লুপ করতে চাই
ল্যান্স সামেরিয়া

29

ইন সুইফট :

প্লেয়ার শেষ হয়ে গেলে আপনি একটি বিজ্ঞপ্তি পেতে পারেন ... AVPlayerItemDidPlayToEndTimeNotifications পরীক্ষা করুন

প্লেয়ার সেট আপ করার সময়:

avPlayer.actionAtItemEnd = AVPlayerActionAtItemEnd.None

NSNotificationCenter.defaultCenter().addObserver(self, 
                                                 selector: "playerItemDidReachEnd:", 
                                                 name: AVPlayerItemDidPlayToEndTimeNotification, 
                                                 object: avPlayer.currentItem)

এটি প্লেয়ারটিকে শেষে থামতে বাধা দেবে।

বিজ্ঞপ্তিতে:

func playerItemDidReachEnd(notification: NSNotification) {
    if let playerItem: AVPlayerItem = notification.object as? AVPlayerItem {
        playerItem.seekToTime(kCMTimeZero)
    }
}

Swift3

NotificationCenter.default.addObserver(self,
    selector: #selector(PlaylistViewController.playerItemDidReachEnd),
     name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,
     object: avPlayer?.currentItem)

এটি মুভিটি রিভাইন্ড করবে।

প্লেয়ারকে ছেড়ে দেওয়ার সময় বিজ্ঞপ্তিটি নিবন্ধভুক্ত করতে ভুলবেন না।


4
আমি এই পদ্ধতির সাথে লুপগুলির মধ্যে একটি ছোট হিক্কার দেখছি। আমি আমার ভিডিওটি অ্যাডোব প্রিমিয়ারে খুলেছি এবং যাচাই করেছি ভিডিওতে কোনও সদৃশ ফ্রেম নেই, সুতরাং সংক্ষিপ্ত হিচাপ অবশ্যই প্লেব্যাকে রয়েছে। দ্রুতগতিতে কেউ কি নির্বিঘ্নে কোনও ভিডিও লুপ তৈরির উপায় খুঁজে পেয়েছে?
স্পেসম্যানগ্যালাক্সি

@ স্পেসম্যানগ্যালাক্সি আমিও হিচাপ লক্ষ্য করেছি। আপনি কি এই সমস্যাটি ঠিক করার কোনও উপায় খুঁজে পেয়েছেন?
ল্যান্স সামেরিয়া

18

বিরতি-হিচাপ সমস্যাটি রোধ করতে আমি এখানে কী শেষ করেছি:

সুইফট:

NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime,
                                       object: nil,
                                       queue: nil) { [weak self] note in
                                        self?.avPlayer.seek(to: kCMTimeZero)
                                        self?.avPlayer.play()
}

উদ্দেশ্য গ:

__weak typeof(self) weakSelf = self; // prevent memory cycle
NSNotificationCenter *noteCenter = [NSNotificationCenter defaultCenter];
[noteCenter addObserverForName:AVPlayerItemDidPlayToEndTimeNotification
                        object:nil
                         queue:nil
                    usingBlock:^(NSNotification *note) {
                        [weakSelf.avPlayer seekToTime:kCMTimeZero];
                        [weakSelf.avPlayer play];
                    }];

দ্রষ্টব্য:avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone এটির প্রয়োজন নেই বলে আমি ব্যবহার করিনি ।


2
@ কোস্টিয়াডম্ব্রভস্কি আপনি একটি আসল ডিভাইস বা বিভিন্ন ভিডিও ব্যবহার করে দেখেছেন?
ইসলাম Q.

@IslamQ। আমি একটি এমপি 4 ফাইল রেকর্ড করি এবং তারপরে স্ন্যাপচ্যাটের মতো লুপ টাইপে এটি চালানোর চেষ্টা করি।
কোস্টিয়া ডম্ব্রভস্কি

@ কোস্টিয়া ডম্ব্রোভস্কি আপনি কি আপনার প্লেব্যাকটি পাশাপাশি স্ন্যাপচ্যাটের সাথে তুলনা করেছেন? আমি মনে করি কারণ শুরু এবং শেষ ফ্রেমগুলি মেলে না বলে মনে হয় এটি বিরতি দিয়েছিল তবে এটি কখনও থামে না।
ইসলাম Q.

আমার পক্ষেও কাজ করেনি। অবিরাম অডিও সহ আমার একটি 6 সেকেন্ডের ভিডিও রয়েছে এবং আমি এই পদ্ধতিটির সাথে নিরবতার দ্বিতীয় ভাগে শুনছি
সিবাস

এই পদ্ধতির ব্যবহার করার সময় আমি একটি মেমরি ফুটো দেখছি। এটি [weakSelf.avPlayer seekToTime:kCMTimeZero]; [weakSelf.avPlayer play];লাইনগুলির সাথে করতে হবে - যখন আমি এই লাইনগুলিতে মন্তব্য করি তখন আর মেমরি ফাঁস হয় না। আমি যন্ত্রগুলিতে এটি প্রোফাইল করেছি।
সোলসমা দেব

3

আমি আপনার ভিডিওগুলি নির্বিঘ্নে লুপ করতে AVQueuePlayer ব্যবহার করার পরামর্শ দিচ্ছি। বিজ্ঞপ্তি পর্যবেক্ষক যুক্ত করুন

AVPlayerItemDidPlayToEndTimeNotification

এবং এর নির্বাচকটিতে, আপনার ভিডিও লুপ করুন

AVPlayerItem *video = [[AVPlayerItem alloc] initWithURL:videoURL];
[self.player insertItem:video afterItem:nil];
[self.player play];

আমি এটি চেষ্টা করেছিলাম এবং এটি @ বাসটিয়ান প্রস্তাবিত পদ্ধতির তুলনায় কোনও উন্নতি দেখায় না। আপনি কি এইটির সাথে পুরোপুরি হিচাপ মুছে ফেলার ব্যবস্থা করেছিলেন?
আমাদুর

2
@ মদৌর আপনি যা করতে পারেন তা হল AVQueuePlayer প্লেয়ারটিতে একই ভিডিওর 2 টি যুক্ত করা যখন আরম্ভ করা হয় এবং যখন প্লেয়ার AVPlayerItemDidPlayToEndTimeNotifications পোস্ট করে, প্লেয়ারের কাতারে একই ভিডিও যুক্ত করুন।
কেভিনাঙ্গুই

3

ভিডিওটি যখন রিওয়াউন্ড হয় তখন ফাঁক এড়াতে কোনও সংমিশ্রণে একই সম্পদের একাধিক অনুলিপি ব্যবহার করা আমার পক্ষে ভাল কাজ করে। আমি এটি এখানে পেয়েছি: www.developers- Life.com/avplayer-looping-video-without-hiccupdelays.html (লিঙ্ক এখন মৃত)।

AVURLAsset *tAsset = [AVURLAsset assetWithURL:tURL];
CMTimeRange tEditRange = CMTimeRangeMake(CMTimeMake(0, 1), CMTimeMake(tAsset.duration.value, tAsset.duration.timescale));
AVMutableComposition *tComposition = [[[AVMutableComposition alloc] init] autorelease];
for (int i = 0; i < 100; i++) { // Insert some copies.
    [tComposition insertTimeRange:tEditRange ofAsset:tAsset atTime:tComposition.duration error:nil];
}
AVPlayerItem *tAVPlayerItem = [[AVPlayerItem alloc] initWithAsset:tComposition];
AVPlayer *tAVPlayer = [[AVPlayer alloc] initWithPlayerItem:tAVPlayerItem];

আমার ধারণা আপনি এই লিঙ্কটি বোঝাতে চেয়েছেন devbrief.blogspot.se/2011/12/…
শিখা 3

2

এটি হিক্কার সমস্যাগুলি ছাড়াই আমার পক্ষে কাজ করেছে, পয়েন্ট প্লেয়ারটি টোকটাইম পদ্ধতি কল করার আগে প্লেয়ারকে থামিয়ে দিচ্ছে:

  1. আর এভিপ্লেয়ার

    let url = NSBundle.mainBundle().URLForResource("loop", withExtension: "mp4")
    let playerItem = AVPlayerItem(URL: url!)
    
    self.backgroundPlayer = AVPlayer(playerItem: playerItem)
    let playerLayer = AVPlayerLayer(player: self.backgroundPlayer)
    
    playerLayer.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height)
    self.layer.addSublayer(playerLayer)
    self.backgroundPlayer!.actionAtItemEnd = .None
    self.backgroundPlayer!.play()
  2. বিজ্ঞপ্তি নিবন্ধকরণ

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "videoLoop", name: AVPlayerItemDidPlayToEndTimeNotification, object: self.backgroundPlayer!.currentItem)
  3. ভিডিওলুপ ফাংশন

    func videoLoop() {
      self.backgroundPlayer?.pause()
      self.backgroundPlayer?.currentItem?.seekToTime(kCMTimeZero)
      self.backgroundPlayer?.play()
    }

3
ধন্যবাদ - আমি এটি চেষ্টা করেছিলাম, তবে এখনও আমার জন্য কিছু বিরতি রয়েছে।
নাভা

2

সুইফট 3 এবং 4 এর জন্য

NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: self.avPlayer?.currentItem, queue: .main) { _ in
     self.avPlayer?.seek(to: kCMTimeZero)
     self.avPlayer?.play()
}

1

আমার উদ্দেশ্য-সি wth এভিউইউপ্লাইয়ার - আমার মনে হয় আপনাকে এভিপ্লেয়ার আইটেমটি নকল করতে হবে এবং প্রথম উপাদানটির প্লেব্যাক শেষ করার সাথে সাথে সাথে অন্য একটি অনুলিপি যুক্ত করতে হবে। "Kind of" অর্থ দেয় এবং কোনও হিক্কার ছাড়াই আমার পক্ষে কাজ করে

NSURL *videoLoopUrl; 
// as [[NSBundle mainBundle] URLForResource:@"assets/yourVideo" withExtension:@"mp4"]];
AVQueuePlayer *_loopVideoPlayer;

+(void) nextVideoInstance:(NSNotification*)notif
{
 AVPlayerItem *currItem = [AVPlayerItem playerItemWithURL: videoLoopUrl];

[[NSNotificationCenter defaultCenter] addObserver:self
                                      selector:@selector(nextVideoInstance:)
                                      name:AVPlayerItemDidPlayToEndTimeNotification
                                      object: currItem];

 [_loopVideoPlayer insertItem:currItem afterItem:nil];
 [_loopVideoPlayer advanceToNextItem];

}

+(void) initVideoPlayer {
 videoCopy1 = [AVPlayerItem playerItemWithURL: videoLoopUrl];
 videoCopy2 = [AVPlayerItem playerItemWithURL: videoLoopUrl];
 NSArray <AVPlayerItem *> *dummyArray = [NSArray arrayWithObjects: videoCopy1, videoCopy2, nil];
 _loopVideoPlayer = [AVQueuePlayer queuePlayerWithItems: dummyArray];

 [[NSNotificationCenter defaultCenter] addObserver: self
                                      selector: @selector(nextVideoInstance:)
                                      name: AVPlayerItemDidPlayToEndTimeNotification
                                      object: videoCopy1];

 [[NSNotificationCenter defaultCenter] addObserver: self
                                      selector: @selector(nextVideoInstance:)
                                      name: AVPlayerItemDidPlayToEndTimeNotification
                                      object: videoCopy2];
}

https://gist.github.com/neonm3/06c3b5c911fdd3ca7c7800dccf7202ad


1

সুইফট 5:

আমি পূর্বের উত্তরগুলি থেকে কিছুটা সামঞ্জস্য করেছি যেমন প্লেয়ার লাইয়ারে যুক্ত করার আগে প্লেয়ার আইটেমটিকে কাতারে যুক্ত করা।

let playerItem = AVPlayerItem(url: url)
let player = AVQueuePlayer(playerItem: playerItem)
let playerLayer = AVPlayerLayer(player: player)

playerLooper = AVPlayerLooper(player: player, templateItem: playerItem)

playerLayer.frame = cell.eventImage.bounds
playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill

// Add the playerLayer to a UIView.layer

player.play()

এবং প্লেয়ারলুপারকে আপনার ইউআইভিউউকন্ট্রোলারের একটি সম্পত্তি বানান, অন্যথায় ভিডিওটি কেবল একবার প্লে করতে পারে।


0

ভিডিওটি এভিপ্লেয়ারে লোড করার পরে (অবশ্যই এটির অ্যাভিপ্লেয়ার আইটেমের মাধ্যমে):

 [self addDidPlayToEndTimeNotificationForPlayerItem:item];

AddDidPlayToEndTimeNotifications forPlayerItem পদ্ধতি:

- (void)addDidPlayToEndTimeNotificationForPlayerItem:(AVPlayerItem *)item
{
    if (_notificationToken)
        _notificationToken = nil;

    /*
     Setting actionAtItemEnd to None prevents the movie from getting paused at item end. A very simplistic, and not gapless, looped playback.
     */
    _player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
    _notificationToken = [[NSNotificationCenter defaultCenter] addObserverForName:AVPlayerItemDidPlayToEndTimeNotification object:item queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
        // Simple item playback rewind.
        [[_player currentItem] seekToTime:kCMTimeZero];
    }];
}

আপনার দর্শন উইলডিস্পায়ার পদ্ধতিতে:

if (_notificationToken) {
        [[NSNotificationCenter defaultCenter] removeObserver:_notificationToken name:AVPlayerItemDidPlayToEndTimeNotification object:_player.currentItem];
        _notificationToken = nil;
    }

বাস্তবায়ন ফাইলের মধ্যে আপনার দর্শনী নিয়ন্ত্রকের ইন্টারফেস ঘোষণাতে:

id _notificationToken;

আপনি চেষ্টা করার আগে এই আপ এবং চলমান দেখতে প্রয়োজন? এই নমুনা অ্যাপ্লিকেশনটি ডাউনলোড এবং চালনা করুন:

https://developer.apple.com/library/prerelease/ios/samplecode/AVBasicVideoOutput/Listings/AVBasicVideoOutput_APLViewController_m.html#//apple_ref/doc/uid/DTS40013109-AVBasicVideoOutput_APLViewController_m-DontLinkElementID_8

আমার অ্যাপ্লিকেশনটিতে, যা এটি খুব কোড ব্যবহার করে, ভিডিওর শেষ এবং শুরুতে কোনও বিরাম নেই। প্রকৃতপক্ষে, ভিডিওটির উপর নির্ভর করে, টাইমকোড প্রদর্শনটি সংরক্ষণ করুন, ভিডিওটির শুরুতে আবার বলার উপায় নেই।


0

আপনি একটি AVPlayerItemDidPlayToEndTimeNotifications পর্যবেক্ষক এবং নীচের মত কোড থেকে সিলেক্টারে কোড থেকে ভিডিও পুনরায় খেলতে পারেন

 //add observer
[[NSNotificationCenter defaultCenter] addObserver:self                                                 selector:@selector(playbackFinished:)                                                     name:AVPlayerItemDidPlayToEndTimeNotification
object:_aniPlayer.currentItem];

-(void)playbackFinished:(NSNotification *)notification{
    [_aniPlayer seekToTime:CMTimeMake(0, 1)];//replay from start
    [_aniPlayer play];
}

0

নিম্নলিখিতটি আপনার জন্য সুইট ৪.১-এ ডব্লিউকেউইউভিউতে কাজ করছে W

wkwebView.navigationDelegate = self
wkwebView.allowsBackForwardNavigationGestures = true
self.wkwebView =  WKWebView(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height))
let config = WKWebViewConfiguration()
config.allowsInlineMediaPlayback = true
wkwebView = WKWebView(frame: wkwebView.frame, configuration: config)
self.view.addSubview(wkwebView)
self.wkwebView.load(NSURLRequest(url: URL(string: self.getUrl())!) as URLRequest)

0

আমি যা করেছি তা হ'ল এটিকে লুপ প্লে করা যেমন আমার নীচের কোডটির মতো:

[player addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 1.0)
queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
    float current = CMTimeGetSeconds(time);
    float total = CMTimeGetSeconds([playerItem duration]);
    if (current >= total) {
        [[self.player currentItem] seekToTime:kCMTimeZero];
        [self.player play];
    }
}];

0

এক্সকোড 10.1-এ 4.2 সুইফ্ট করুন

হ্যাঁ , AVKit/ ভিডিও AVFoundationব্যবহার / লুপ করার অপেক্ষাকৃত সহজ উপায় AVQueuePlayer(), কী-মান পর্যবেক্ষণ (কেভিও) কৌশল এবং এর জন্য একটি টোকেন রয়েছে।

এটি অবশ্যই CPU- এর জন্য সর্বনিম্ন বোঝা সহ H.264 / HEVC ভিডিওগুলির একটি গোছের জন্য কাজ করে।

এখানে একটি কোড:

import UIKit
import AVFoundation
import AVKit

class ViewController: UIViewController {

    private let player = AVQueuePlayer()
    let clips = ["01", "02", "03", "04", "05", "06", "07"]
    private var token: NSKeyValueObservation?
    var avPlayerView = AVPlayerViewController()

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(true)

        self.addAllVideosToPlayer()
        present(avPlayerView, animated: true, completion: { self.player.play() })
    }

    func addAllVideosToPlayer() {
        avPlayerView.player = player

        for clip in clips {
            let urlPath = Bundle.main.path(forResource: clip, ofType: "m4v")!
            let url = URL(fileURLWithPath: urlPath)
            let playerItem = AVPlayerItem(url: url)
            player.insert(playerItem, after: player.items().last)

            token = player.observe(\.currentItem) { [weak self] player, _ in
                if self!.player.items().count == 1 { self?.addAllVideosToPlayer() }
            }
        }
    }
}

-1

কোডের নীচে AVPlayerViewController ব্যবহার করুন, এটি আমার জন্য কার্যকর

        let type : String! = "mp4"
        let targetURL : String? = NSBundle.mainBundle().pathForResource("Official Apple MacBook Air Video   YouTube", ofType: "mp4")

        let videoURL = NSURL(fileURLWithPath:targetURL!)


        let player = AVPlayer(URL: videoURL)
        let playerController = AVPlayerViewController()

        playerController.player = player
        self.addChildViewController(playerController)
        self.playView.addSubview(playerController.view)
        playerController.view.frame = playView.bounds

        player.play()

সমস্ত নিয়ন্ত্রণ প্রদর্শিত হবে, আশা করি এটি সহায়ক


-2
/* "numberOfLoops" is the number of times that the sound will return to the beginning upon reaching the end. 
A value of zero means to play the sound just once.
A value of one will result in playing the sound twice, and so on..
Any negative number will loop indefinitely until stopped.
*/
@property NSInteger numberOfLoops;

এই সম্পত্তি ইতিমধ্যে ভিতরে সংজ্ঞায়িত করা হয় AVAudioPlayer। আশা করি এটি আপনাকে সহায়তা করতে পারে। আমি এক্সকোড 6.3 ব্যবহার করছি।


8
এটি অডিওর জন্য, এভিপ্লেয়ারের জন্য নয়
নিসিম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.