2016-01-26 19 views
7

Tôi đang cố gắng cho phép người dùng có thể duyệt qua video, thay đổi URL AVPlayer khi đang di chuyển mà không làm mới chế độ xem. Tuy nhiên, ngay bây giờ tôi chỉ là instantiating AVPlayer đối tượng mỗi khi một video được chơi (kết quả là âm thanh được chơi qua nhau), mà tôi cảm thấy không phải là cách tốt nhất để làm điều này. Có cách nào hiệu quả hơn tương tự như thay đổi hình ảnh trong một imageView không?Phát video từ URL mới mà không cần tạo đối tượng AVPlayer mới

Đây là mã nơi tôi đóng clip:

player = AVPlayer(URL: fileURL) 
playerLayer = AVPlayerLayer(player: player) 
playerLayer!.frame = self.view.bounds 
self.view.layer.addSublayer(playerLayer!) 
player!.play() 

Trả lời

0

tôi có thể thực hiện những gì bạn đang tìm kiếm bằng cách làm này ...

Tôi có một tableView tên bài hát, cho các tệp mp3 được lưu trữ trên Parse.com. Trong didSelectRowAtIndexPath Tôi làm ...

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    SelectedSongNumber = indexPath.row 
    grabSong() 
} 


    func grabSong() { 

    let songQuery = PFQuery(className: "Songs") 
    songQuery.getObjectInBackgroundWithId(iDArray[SelectedSongNumber], block: { 
     (object: PFObject?, error : NSError?) -> Void in 


     if let audioFile = object?["SongFile"] as? PFFile { 
      let audioFileUrlString: String = audioFile.url! 
      let audioFileUrl = NSURL(string: audioFileUrlString)! 

      myAVPlayer = AVPlayer(URL: audioFileUrl) 
      myAVPlayer.play() 

      currentUser?.setObject(audioFileUrlString, forKey: "CurrentSongURL") 
      currentUser?.saveInBackground() 
     } 
    }) 
} 

khi tôi chạy điều này, tôi chọn một hàng và bài hát bắt đầu phát. Nếu sau đó tôi đợi một vài giây và chọn một hàng khác, AVPlayer sẽ phát bài hát từ ô mới mà tôi đã chọn và không phát một bài hát nào khác. AVPlayer của tôi được khai báo là một biến công cộng cho tất cả các lớp để xem.

+0

Như tôi đã nói, không truy cập đối tượng AVPlayer sau khi bạn tạo; thay vào đó, chỉ làm việc với currentItem của nó. –

+0

@JamesBush Thật vậy, bạn là một phương pháp tốt hơn. Một tùy chọn khác là sử dụng AVQueuePlayer, thêm tất cả các URL có thể là một mảng AVPlayerItems và sau đó chèn mảng đó vào hàng đợi và sắp xếp lại mảng đó khi đang di chuyển. Điều này sẽ cho phép video tiếp theo xếp hàng để bắt đầu lưu vào bộ đệm trong khi video trước đó vẫn đang phát – MikeG

+0

Hoặc: [self.player prerollAtRate: 1.0 completionHandler:^(BOOL hoàn thành) { [self.player play]; [self.player setRate: 1.0]; }]; –

3

Sử dụng AVPlayerItem để thêm và xóa kết quả đầu ra cho đối tượng AVPlayer.

Thay vì thêm video vào AVPlayer khi bạn tạo video, tạo một bản sao AVPlayer trống và sau đó sử dụng phương thức addOutput của lớp AVPlayerItem để thêm video.

Để xóa video và thêm video mới, hãy sử dụng phương thức removeOutput của lớp AVPlayerItem để xóa video cũ và sau đó thêm phương thức addOutput để chèn video mới.

Mã mẫu có sẵn từ trang web dành cho nhà phát triển của Apple tại;

https://developer.apple.com/library/prerelease/content/samplecode/AVBasicVideoOutput/Introduction/Intro.html

Nó cung cấp cùng một điều tôi sẽ, đã được tôi để gửi mã của riêng tôi.

+0

cảm ơn, tôi có phải sử dụng AVAsset không? – cb428

+0

Tôi hỏi vì tôi không thể khởi tạo AVPlayerItem mà không có URL hoặc AVAsset. Tôi sẽ không thể truy cập biến fileURL trong viewDidLoad nơi tôi đã thiết lập AVPlayer. – cb428

+0

@ James Bush bạn có thể bắt đầu hiển thị một số mã không? – George

12

Không sử dụng AVPlayer.

Thay vì sử dụng AVQueuePlayer cho phép bạn chèn và xóa các mục khỏi hàng đợi.

//create local player in setup methods 
self.localPlayer = AVQueuePlayer.init() 

để thêm các mục bạn chỉ có thể sử dụng

//optional: clear current queue if playing straight away 
self.localPlayer.removeAllItems() 

//get url of track 
let url : URL? = URL.init(string: "http://urlOfItem") 
if url != nil { 
    let playerItem = AVPlayerItem.init(url: url!) 

    //you can use the after property to insert 
    //it at a specific location or leave it nil 
    self.localPlayer.insert(playerItem, after: nil) 
    self.localPlayer.play() 
} 

AVQueuePlayer hỗ trợ tất cả các chức năng của AVPlayer nhưng có tính năng bổ sung thêm và loại bỏ các mục từ một hàng đợi.

+0

Bạn đã lưu ngày của tôi. cảm ơn nhiều. –

Các vấn đề liên quan