กำลังเล่นวิดีโอด้วย 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)
    }
}

Swift 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] อีกครั้ง
thomax

24
สิ่งนี้ไม่จำเป็น ... ถ้าคุณทำavPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone;มันจะไม่หยุดดังนั้นไม่จำเป็นต้องตั้งค่าให้เล่นอีกครั้ง
Bastian

ในการทำให้เสียงเล่นอีกครั้งคุณต้องโทร[player play];หลังจากกรอกลับ
Kenny Winker

12
โซลูชันนี้ใช้งานได้ แต่ไม่ราบรื่นอย่างสมบูรณ์ ฉันหยุดชั่วคราวเล็กน้อย ฉันกำลังทำอะไรผิดหรือเปล่า?
Joris van Liempd iDeveloper

3
@Praxiteles คุณต้องยกเลิกการลงทะเบียนเมื่อมุมมองถูกทำลายหรือเมื่อคุณลบวิดีโอเทปหรือสิ่งที่คุณทำ) คุณสามารถใช้[[NSNotificationCenter defaultCenter] removeObserver:self];ตัวอย่างเช่นเมื่อselfกำลังฟังการแจ้งเตือน
บาสเตียน

63

หากเป็นไปได้ใน iOS / tvOS 10 มี AVPlayerLooper () ใหม่ที่คุณสามารถใช้เพื่อสร้างวนลูปของวิดีโอ (Swift) ได้อย่างราบรื่น:

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

สิ่งนี้ถูกนำเสนอในงาน WWDC 2016 ใน "Advance in AVFoundation Playback": https://developer.apple.com/videos/play/wwdc2016/503/

แม้จะใช้รหัสนี้ฉันมีอาการสะอึกจนกระทั่งฉันยื่นรายงานข้อผิดพลาดกับ Apple และได้รับการตอบสนองนี้:

ไฟล์ภาพยนตร์ที่มีระยะเวลาภาพยนตร์ยาวกว่าแทร็กเสียง / วิดีโอเป็นปัญหา FigPlayer_File ปิดการใช้งานการเปลี่ยนแปลงแบบไม่มีช่องว่างเนื่องจากการแก้ไขแทร็กเสียงสั้นกว่าระยะเวลาภาพยนตร์ (15.682 เทียบกับ 15.787)

คุณต้องแก้ไขไฟล์ภาพยนตร์เพื่อให้มีระยะเวลาภาพยนตร์และระยะเวลาการติดตามเป็นความยาวเท่ากันหรือคุณสามารถใช้พารามิเตอร์ช่วงเวลาของ AVPlayerLooper (ตั้งค่าช่วงเวลาตั้งแต่ 0 ถึงระยะเวลาของแทร็กเสียง)

ปรากฎว่า Premiere ส่งออกไฟล์ด้วยแทร็กเสียงที่มีความยาวแตกต่างจากวิดีโอเล็กน้อย ในกรณีของฉันมันเป็นเรื่องปกติที่จะลบเสียงทั้งหมดและแก้ไขปัญหาได้


2
ไม่มีอะไรทำงานให้ฉัน ฉันใช้ AVPlayerLooper และมีข้อผิดพลาดนี้และแก้ไขความคลาดเคลื่อนระหว่างความยาวของวิดีโอ / เสียงแก้ไขปัญหาได้
Kevin Heap

1
ขอบคุณสำหรับข้อมูลเกี่ยวกับรอบปฐมทัศน์ ฉันเพิ่ม timeRange ให้กับ looper และนั่นแก้ไขปัญหา "วิดีโอกะพริบ" ของฉัน
Alexander Flenniken

@Nabha เป็นไปได้หรือไม่ที่จะใช้สิ่งนี้ในช่วงเวลาหนึ่งภายในวิดีโอ ตัวอย่างเช่นวิดีโอ 60 วินาที แต่ฉันต้องการวนรอบ 10 วินาทีแรกเท่านั้น
Lance Samaria

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
ฉันเห็นอาการสะอึกเล็กน้อยระหว่างลูปด้วยวิธีนี้ ฉันเปิดวิดีโอของฉันใน Adobe Premier และตรวจสอบว่าไม่มีเฟรมซ้ำในวิดีโอดังนั้นอาการสะอึกสั้น ๆ ที่เล่นแน่นอน มีใครค้นพบวิธีที่จะทำให้การวนซ้ำวิดีโอเป็นไปอย่างรวดเร็วหรือไม่?
SpaceManGalaxy

@SpaceManGalaxy ฉันยังสังเกตเห็นอาการสะอึก คุณพบวิธีการแก้ไขความผิดพลาดนี้หรือไม่?
Lance Samaria

18

นี่คือสิ่งที่ฉันทำเพื่อป้องกันปัญหาอาการสะอึก:

สวิฟท์:

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

วัตถุประสงค์ C:

__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 แล้วลองเล่นแบบวนซ้ำเหมือน snapchat
Kostia Dombrovsky

@KostiaDombrovsky คุณเปรียบเทียบการเล่นของคุณกับ snapchat เคียงข้างกันหรือไม่? ฉันคิดว่าเพราะจุดเริ่มต้นและเฟรมสุดท้ายไม่ตรงกับดูเหมือนกับว่าหยุดชั่วคราว แต่ไม่เคยหยุดนิ่ง
ศาสนาอิสลาม Q.

ไม่ได้ผลสำหรับฉันเช่นกัน ฉันมีวิดีโอ 6 วินาทีพร้อมเสียงไม่หยุดหย่อนและฉันก็ได้ยินเสียงเงียบงันด้วยวิธีนี้
Cbas

ฉันเห็นหน่วยความจำรั่วเมื่อใช้วิธีนี้ มันเกี่ยวกับ[weakSelf.avPlayer seekToTime:kCMTimeZero]; [weakSelf.avPlayer play];เส้น - เมื่อฉันคอมเม้นท์บรรทัดเหล่านี้ไม่มีหน่วยความจำรั่วอีกต่อไป ฉันได้ทำโปรไฟล์นี้เป็นเครื่องมือ
Solsma Dev

3

ฉันแนะนำให้ใช้ AVQueuePlayer เพื่อวนวิดีโอของคุณอย่างราบรื่น เพิ่มผู้สังเกตการณ์การแจ้งเตือน

AVPlayerItemDidPlayToEndTimeNotification

และในตัวเลือกให้วนวิดีโอของคุณ

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

ฉันลองสิ่งนี้และมันไม่ได้แสดงการปรับปรุงใด ๆ กับวิธีการที่ @Bastian แนะนำ คุณจัดการที่จะลบอาการสะอึกด้วยสิ่งนี้อย่างสิ้นเชิงหรือไม่?
amadour

2
@ รักสิ่งที่คุณสามารถทำได้คือเพิ่มวิดีโอ 2 อันในเครื่องเล่น AVQueuePlayer เมื่อเริ่มต้นและเมื่อผู้เล่นโพสต์ AVPlayerItemDidPlayToEndTimeNotification ให้เพิ่มวิดีโอเดียวกันลงในคิวของผู้เล่น
kevinnguy

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

2

สิ่งนี้ใช้ได้กับฉันโดยไม่มีปัญหาอาการสะอึกจุดอยู่ในการหยุดเล่นชั่วคราวก่อนที่จะเรียกใช้เมธอด findToTime:

  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. ฟังก์ชั่น videoLoop

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

3
ขอบคุณ - ฉันพยายามทำสิ่งนี้ แต่ยังคงมีการหยุดชั่วคราวสำหรับฉัน
Nabha

2

สำหรับ Swift 3 & 4

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

1

โซลูชันของฉันในวัตถุประสงค์ 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:

ฉันได้ทำการปรับเปลี่ยนเล็กน้อยจากคำตอบก่อนหน้าเช่นเพิ่ม playerItem ลงในคิวก่อนที่จะเพิ่มไปยัง playerLayer

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];
    }];
}

ในวิธีการ viewWillDisappear ของคุณ:

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 ใน swift 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

Swift 4.2ใน Xcode 10.1

ใช่มีวิธีที่ง่ายในการวนลูปวิดีโอในAVKit/ AVFoundationใช้AVQueuePlayer() Key-Value Observation (KVO) และโทเค็นสำหรับมัน

วิธีนี้ใช้ได้กับวิดีโอ H.264 / HEVC จำนวนมากโดยมีภาระน้อยที่สุดสำหรับ CPU

นี่คือรหัส:

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
Yariv Nissim
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.