AVFoundation AVPlayer के साथ एक वीडियो को लूप करना?


142

AVFoundation में एक वीडियो को लूप करने का एक अपेक्षाकृत आसान तरीका है?

मैंने अपना 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संपत्ति को सही मूल्य पर सेट करना होगा। AVPlayer पर एक समान संपत्ति प्रतीत नहीं होती है। वहाँ भी एक कॉलबैक नहीं लगता है जो मुझे बताएगा कि फिल्म कब खत्म हुई है इसलिए मैं शुरुआत की तलाश कर सकता हूं और इसे फिर से खेल सकता हूं।

मैं 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
... और यदि आप इसे [p seekToTime: kCMTimeZero] (एक "रिवाइंड" प्रकार) के बाद खेलना चाहते हैं, तो बस [p play] फिर से करें।
थोमैक्स

24
यह आवश्यक नहीं होना चाहिए ... यदि आप करते हैं तो avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone;यह बंद नहीं होगा, इसलिए इसे फिर से खेलने के लिए सेट करने की कोई आवश्यकता नहीं है
बैस्टियन

साउंड प्ले को फिर से बनाने के लिए आपको [player play];रिवाइंड करने के बाद कॉल करना होगा ।
केनी विन्कर

12
यह समाधान काम करता है, लेकिन यह पूरी तरह से निर्बाध नहीं है। मेरे पास एक बहुत छोटा सा विराम है। क्या मुझसे कुछ गलत हो रही है?
जॉरिस वैन लिम्पड iDeveloper

3
@Praxiteles को यह देखने की इजाजत नहीं दी जाती है कि जब दृश्य सम्‍मिलित हो जाए, या जब आप विडोप्‍लेयर या जो कुछ भी करते हैं, उसे निकाल दें, तो आप [[NSNotificationCenter defaultCenter] removeObserver:self];उदाहरण के लिए उपयोग कर सकते हैं , जब selfसूचनाओं को सुन रहा हो।
बैस्टियन

63

यदि यह iOS / tvOS 10 में मदद करता है, तो एक नया AVPlayerLooper () है जिसका उपयोग आप वीडियो (स्विफ्ट) की सहज लूपिंग बनाने के लिए कर सकते हैं:

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

इसे WWDC 2016 में "एडवांस इन एवीफ़ाउंडेशन प्लेबैक": https://developer.apple.com/videos/play/wwdc2016/503/ पर प्रस्तुत किया गया था

इस कोड का उपयोग करते हुए भी, मुझे तब तक हिचकी थी जब तक कि मैंने Apple के साथ बग रिपोर्ट दर्ज नहीं की और यह प्रतिक्रिया नहीं मिली:

ऑडियो / वीडियो ट्रैक्स की तुलना में मूवी की मूवी की फाइल अधिक समय तक चलने वाली समस्या है। FigPlayer_File अंतररहित संक्रमण को अक्षम कर रहा है क्योंकि ऑडियो ट्रैक संपादित मूवी अवधि (15.682 बनाम 15.787) से कम है।

मूवी की अवधि को ट्रैक करने के लिए आपको फिल्म फ़ाइलों को ठीक करने की आवश्यकता है और अवधि समान होने के लिए ट्रैक की गई अवधि या आप AVPlayerLooper के समय सीमा पैरामीटर (ऑडियो ट्रैक की अवधि 0 से समय सीमा तक) का उपयोग कर सकते हैं

यह पता चला है कि Premiere वीडियो की तुलना में थोड़ी अलग लंबाई के ऑडियो ट्रैक के साथ फाइल निर्यात कर रहा था। मेरे मामले में ऑडियो को पूरी तरह से हटा देना ठीक था, और इसने समस्या को ठीक कर दिया।


2
मेरे लिए और कुछ काम नहीं किया। मैं एक AVPlayerLooper का उपयोग कर रहा हूँ और इस बग और वीडियो / ऑडियो लंबाई के बीच विसंगति को ठीक करने से समस्या हल हो गई।
केविन हीप

1
Premiere के बारे में जानकारी के लिए धन्यवाद। मैंने लूपर के लिए एक समय-सीमा जोड़ी और उस "मेरे चमकती वीडियो" समस्या को ठीक किया।
अलेक्जेंडर फ्लेनिकेन

@ नाभा क्या वीडियो के भीतर एक निश्चित समय सीमा के लिए इसका उपयोग करना संभव है? उदाहरण के लिए वीडियो 60 सेकेंड है, लेकिन मैं पाश करने के लिए पहले 10 सेकेंड ही चाहते हैं
लांस सामरिया

29

में स्विफ्ट :

खिलाड़ी के समाप्त होने पर आपको एक सूचना मिल सकती है ... AVPlayerItemDidPlayToEndTimeNotification जांचें

खिलाड़ी को सेट करते समय:

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
मैं इस विधि के साथ छोरों के बीच एक छोटी हिचकी देख रहा हूँ। मैंने एडोब प्रीमियर में अपना वीडियो खोला और सत्यापित किया कि वीडियो में कोई डुप्लिकेट फ़्रेम नहीं हैं, इसलिए संक्षिप्त हिचकी निश्चित रूप से प्लेबैक पर है। क्या किसी ने तेजी से वीडियो लूप बनाने का तरीका ढूंढ लिया है?
SpaceManGalaxy

@SpaceManGalaxy मैंने हिचकी पर भी ध्यान दिया है। क्या आपको इस गड़बड़ को ठीक करने का कोई तरीका मिला है?
लांस सामरिया

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
@ KostiaDombrovsky क्या आपने वास्तविक डिवाइस या अलग-अलग वीडियो पर कोशिश की?
इस्लाम Q.

@IslamQ। मैं एक MP4 फ़ाइल रिकॉर्ड करता हूं और फिर उसे स्नैपचैट की तरह लूप थोड़े में खेलने की कोशिश करता हूं।
कोस्तिया डोंब्रोवस्की

@ KostiaDombrovsky क्या आपने स्नैपचैट के साथ पार्श्व की तुलना की? मुझे लगता है कि शुरुआत और अंत के फ्रेम मेल नहीं खाते क्योंकि ऐसा लगता है जैसे इसे रोका गया था, लेकिन यह कभी रुकता नहीं है।
इस्लाम 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];

मैंने यह कोशिश की और यह @Bastian द्वारा सुझाई गई विधि पर कोई सुधार नहीं दिखाता है। क्या आपने इसके साथ हिचकी को पूरी तरह से हटाने का प्रबंधन किया था?
आमदौर

2
@amadour आप क्या कर सकते हैं AVQueuePlayer प्लेयर में एक ही वीडियो के 2 जोड़ सकते हैं जब इनिशियलाइज़ किया जाता है और जब प्लेयर AVPlayerItemDidPlayToEndTimeNotification पोस्ट करता है, तो उसी वीडियो को खिलाड़ी की कतार में जोड़ें।
केविनिंजय

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. init AVPlayer

    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

उद्देश्य- c wth AVQueuePlayer में मेरा समाधान - ऐसा लगता है कि आपको AVPlayerItem को डुप्लिकेट करना होगा और पहले तत्व के प्लेबैक को खत्म करने पर तुरंत दूसरी कॉपी जोड़ना होगा। "की तरह" समझ में आता है और मेरे लिए बिना किसी हिचकी के काम करता है

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()

और खिलाड़ी को अपने UIViewController की संपत्ति बनाएं, अन्यथा वीडियो केवल एक बार खेल सकता है।


0

AVPlayer (इसके AVPlayerItem के माध्यम से) में वीडियो लोड करने के बाद:

 [self addDidPlayToEndTimeNotificationForPlayerItem:item];

AddDidPlayToEndTimeNotificationForPlayerItem विधि:

- (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

आप एक AVPlayerItemDidPlayToEndTimeNotification पर्यवेक्षक जोड़ सकते हैं और चयनकर्ता में प्रारंभ से वीडियो फिर से शुरू कर सकते हैं, नीचे जैसा कोड

 //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

निम्नलिखित मेरे लिए WKWebView में स्विफ्ट 4.1 में काम कर रहा है। WKWebView में WKwebviewConfiguration का मुख्य भाग

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

स्विफ्ट 4.2Xcode 10.1 में ।

हां , वीडियो का उपयोग AVKit/ AVFoundationउपयोग करने का एक अपेक्षाकृत आसान तरीका हैAVQueuePlayer() , कुंजी-मूल्य अवलोकन (KVO) तकनीक और इसके लिए एक टोकन।

यह निश्चित रूप से 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। आशा है इससे आपको सहायता मिलेगी। मैं Xcode 6.3 का उपयोग कर रहा हूं।


8
यह ऑडियो के लिए है,
AVPlayer के
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.