এভিপ্লেয়ার প্রতিনিধি নেই? গান বাজানো শেষ হলে কীভাবে ট্র্যাক করবেন? উদ্দেশ্য সি আইফোন বিকাশ


84

আমি চারপাশে দেখেছি কিন্তু এর জন্য আমি কোনও প্রতিনিধি প্রোটোকল খুঁজে পাই না AVPlayer class। কি দেয়?

আমি এর সাবক্লাস ব্যবহার করছি AVQueuePlayer, AVPlayerItemsএকটি ইউআরএল থেকে লোড হওয়া একটি অ্যারের খেলতে । কোনও গান বাজানো শেষ হয়ে গেলে আমি কী কোনও পদ্ধতিতে কল করতে পারি? উল্লেখযোগ্যভাবে কিউ শেষে?

এবং যদি এটি সম্ভব না হয়, বাফারিংয়ের পরে স্টার্টস গানটি বাজানোর সময় কোনও পদ্ধতিতে কল করতে পারি কি? আমি সেখানে লোডিং আইকনটি পাওয়ার চেষ্টা করছি তবে [audioPlayer play]অ্যাকশন পরে আসার পরেও এটি সঙ্গীতটি শুরু হওয়ার আগেই আইকনটি বন্ধ করে দেয় ।

উত্তর:


152

হ্যাঁ, AVPlayer ক্লাসে AVAudioPlayer এর মতো প্রতিনিধি প্রোটোকল নেই। আপনাকে একটি এভিপ্লেয়ারআইটিমে বিজ্ঞপ্তিগুলির সাবস্ক্রাইব করতে হবে। আপনি অন্যথায় -initWithURL:এভিপ্লেয়ারে যে একই URL পাঠিয়েছেন তা ব্যবহার করে আপনি একটি এভিপ্লেয়ারআইটেম তৈরি করতে পারেন ।

-(void)startPlaybackForItemWithURL:(NSURL*)url {

    // First create an AVPlayerItem
    AVPlayerItem* playerItem = [AVPlayerItem playerItemWithURL:url];

    // Subscribe to the AVPlayerItem's DidPlayToEndTime notification.
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem];

    // Pass the AVPlayerItem to a new player
    AVPlayer* player = [[[AVPlayer alloc] initWithPlayerItem:playerItem] autorelease];

    // Begin playback
    [player play]

} 

-(void)itemDidFinishPlaying:(NSNotification *) notification {
    // Will be called when AVPlayer finishes playing playerItem
}

4
অবশ্যই ব্যবহার করুন itemDidFinishPlaying:, যেমন কোলন সহ। NSNotificationCenterডকুমেন্টেশন থেকে : বিজ্ঞপ্তি দ্বারা নির্বাচিত পদ্ধতিটির মধ্যে একটি এবং কেবল একটি যুক্তি থাকতে হবে (একটি উদাহরণ NSNotification)।
রুডল্ফ আদমকোভিč

@ রুডলফএডামকোভিচ নোটটির জন্য ধন্যবাদ - আমি সেই অনুযায়ী আমার উত্তরটি সম্পাদনা করেছি।
arexx

8

হ্যাঁ. প্লেয়ারের স্ট্যাটাস বা রেটে কেভিও পর্যবেক্ষক যুক্ত করুন:

- (IBAction)go {
   self.player = .....
   self.player.actionAtItemEnd = AVPlayerActionStop;
   [self.player addObserver:self forKeyPath:@"rate" options:0 context:0]; 
}

- (void)stopped {
    ...
    [self.player removeObserver:self]; //assumes we are the only observer
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if (context == 0) {
        if(player.rate==0.0) //stopped
            [self stopped];
    }
    else
        [super observeVal...];
}

সুতরাং মূলত, এটি।

দাবি অস্বীকার: আমি লিখেছিলাম যে এখানে তাই কোডটি ভাল ছিল কিনা তা আমি পরীক্ষা করে দেখিনি। এছাড়াও আমি আগে কখনও AVPlayer ব্যবহার করি নি তবে এটি প্রায় সঠিক হওয়া উচিত।


@ "রেট" পর্যবেক্ষককে কীভাবে অপসারণ করবেন?
সওমিল শাহ

আমাকে একটি সম্পাদনায় বলা হয়েছিল যে আমাকে অবশ্যই রেট পর্যবেক্ষণ করতে হবে। অভিযোজিত
দাইজ-দাজন

4
এই পদ্ধতির একটি সমস্যা হ'ল এটি মনে করবে একটি বিরতি সঙ্গীতের শেষ। বিরতিতে হার শূন্য যেমন এটি শেষ হবে।
C6Silver

5

সুইফট 3 - আমি AVPlayerItemযখনই প্লেয়ারে একটি ভিডিও যুক্ত করি ততবারে আমি একজন পর্যবেক্ষক যুক্ত করি:

func playVideo(url: URL) {
  let playerItem = AVPlayerItem(asset: AVURLAsset(url: someVideoUrl))
  NotificationCenter.default.addObserver(self, selector: #selector(playerItemDidPlayToEndTime), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerItem)
  self.player.replaceCurrentItem(with: playerItem)
  self.player.play()
}

func playerItemDidPlayToEndTime() {
  // load next video or something
}

1

অ্যাপল ডক্স এভিফাউন্ডেশন প্রোগ্রামিং গাইড (মনিটরিং প্লেব্যাক বিভাগের সন্ধান করুন) এ প্রচুর তথ্য রয়েছে । এটি তাই আপনার উপর (যে জন্য একটি নির্দেশিকা আছে যদি আপনি খুব পরিচিত নন যে ব্রাশ করতে চাইতে পারেন KVO মাধ্যমে প্রধানত উপস্থিত হতে পারে কী মান পর্যবেক্ষণ ProgrammingGuide


4
ধন্যবাদ, প্রথমে আমি কেভিওর মাধ্যমে সময় নিরীক্ষণ করে এটি কাজ করেছিলাম তবে তারপরে এটি পরিষ্কারকারী এবং কম প্রসেসর-নিবিড় হওয়ার কারণে আমি AVPlayerItemDidPlayToEndTimeNotifications প্রয়োগ করেছি।
টাইলার

4
এনএসএনটিফিকেশন সেন্টার, কেভিও এবং সেখানে ব্লক-ভিত্তিকের একটি ক্রেজি মিশ্রণ। আপনার মন আপেল আপ করুন!
কাপউনটায়ে

1

আমি এটি ব্যবহার করছি, এবং এটি কার্যকর:

_player = [[AVPlayer alloc]initWithURL:[NSURL URLWithString:_playingAudio.url]];
CMTime endTime = CMTimeMakeWithSeconds(_playingAudio.duration, 1);
timeObserver = [_player addBoundaryTimeObserverForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:endTime]] queue:NULL usingBlock:^(void) {
    [_player removeTimeObserver:timeObserver];
    timeObserver = nil;
    //TODO play next sound
}];
[self play];

যেখানে _playingAudioকিছু বৈশিষ্ট্য সঙ্গে আমার কাস্টম ক্লাস হয় এবং timeObserverহয় idivar।

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