2013-02-18 54 views
6

Tôi sử dụng AVQueuePlayer để phát một chuỗi phim được tải từ URL.
Tôi đã cố gắng khởi chạy phiên bản trình phát với mảng của tất cả AVPlayerItems mà tôi cần phát.Phát lại AVQueuePlayer không có khoảng trống và đóng băng

player = [[AVQueuePlayer queuePlayerWithItems:playerItemsArray] 

Nhưng trong trường hợp này AVQueuePlayer tải một số phần ban đầu của mỗi AVPlayerItem trước khi bắt đầu phát lại. Nó gây ra đóng băng bực bội và ứng dụng không phản hồi trong vài giây.

Chỉ có thể thêm AVPLayerItem vào hàng đợi của người chơi, quan sát trạng thái của nó và thêm mục thứ hai vào hàng đợi khi lần đầu tiên kết thúc, nhưng trong trường hợp này sẽ có khoảng cách giữa phát lại hai mục gây ra bằng cách khởi tạo và đệm thứ hai AVPlayerItem.

Có cách nào để tổ chức phát lại không có nhiều video không bị đóng băng không?
Tôi có nên sử dụng một số trình phát khác cho mục đích này không?

Xin cảm ơn trước.

Trả lời

14

Giải pháp được tìm thấy.

Khi thêm mới AVPlayerItem trong hàng đợi AVQueuePlayer trình phát sẽ đồng bộ chờ cho đến khi phần đầu của mục trình phát sẽ được lưu vào bộ đệm.

Vì vậy, trong trường hợp này, mục trình phát sẽ được đệm không đồng bộ và sau đó nó có thể được thêm vào hàng đợi.
Nó có thể được thực hiện bằng [AVURLAsset loadValuesAsynchronouslyForKeys: completionHandler:]

Ví dụ:

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil]; 
NSArray *keys = [NSArray arrayWithObject:@"playable"]; 

[asset loadValuesAsynchronouslyForKeys:keys completionHandler:^() 
{ 
    dispatch_async(dispatch_get_main_queue(),^
    { 
     AVPlayerItem *playerItem = [[[AVPlayerItem alloc] initWithAsset:asset] autorelease];   
     [player insertItem:playerItem afterItem:nil]; 
    }); 

}]; 

Sử dụng hàng đợi giải pháp này của AVQueuePlayer có thể được dân cư với mục mà không cần bất kỳ khoảng trống và đóng băng.

+3

Hi yury.ku, Chúng tôi có một vấn đề tương tự những gì bạn đã đăng. Chúng tôi đã tạo một ứng dụng mẫu để kiểm tra điều này. Chúng tôi thêm mục trình phát mới khi nó được tải trong API thông báo didEndPlay:. Nhưng chúng tôi vẫn đang đối mặt với một số vấn đề đóng băng giao diện người dùng. Bạn có thể vui lòng cung cấp thêm thông tin về cách bạn giải quyết vấn đề này không? – nkd

+4

Giải pháp này không hoạt động với tôi, vẫn còn một khoảng cách hẹp giữa các bộ ghi âm –

+1

Theo [Hướng dẫn lập trình AVFoundation] (https://developer.apple.com/library/ios/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/ 02_Playback.html # // apple_ref/doc/uid/TP40010188-CH3-SW3): 'Cố gắng khởi tạo một AVURLAsset bằng cách sử dụng URL, sau đó tải phím theo dõi của nó. Nếu các bản nhạc tải thành công, thì bạn tạo một mục trình phát cho nội dung đó. '. Vì vậy, bạn nên sử dụng 'NSArray * keys = [NSArray arrayWithObject: @" tracks "];' thay vào đó. –

-1

Đây là giải pháp.

- (void)_makePlayer{ 
    _player = [[AVQueuePlayer alloc] initWithPlayerItem:[AVPlayerItem playerItemWithAsset:[SSMoviePreviewItemMaker generateAVMovieItem]]]; 
} 

+ (AVAsset *)generateAVMovieItem{ 
    NSArray * array = [SSMovieFileManager getAllMovieResourceURL]; 
    AVMutableComposition *composition = [[AVMutableComposition alloc] init]; 
    for (int i = 0; i < array.count; i++) { 
     AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:array[i] options:nil]; 
     [composition insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) 
          ofAsset:asset 
           atTime:composition.duration error:nil]; 

    } 
    return composition; 
} 
1

trong Swift 2, làm việc ở đây:

func load() { 
    let player = AVQueuePlayer() 
    for url in urls { 
     makeItem(url) 
    } 
} 

func makeItem(url: String) { 
    let avAsset = AVURLAsset(URL: NSURL(string: url)!) 

    avAsset.loadValuesAsynchronouslyForKeys(["playable", "tracks", "duration"], completionHandler: { 
     dispatch_async(dispatch_get_main_queue(), { 
      self.enqueue(avAsset: avAsset) 
     }) 
    }) 
} 

func enqueue(avAsset: AVURLAsset) { 
    let item = AVPlayerItem(asset: avAsset) 
    self.player.insertItem(item, afterItem: nil) 
} 
+4

Điều này "hoạt động" nhưng không tính đến khả năng một số tài sản có thể tải nhanh hơn các loại khác và do đó thứ tự mà chúng được chèn vào không được đảm bảo. Nếu thứ tự phát lại không phải là một mối quan tâm thì nó hoạt động rất tốt! – user1171911

+0

@ user1171911 Tôi đã gặp phải vấn đề tương tự. Bạn có thể đề xuất giải pháp để duy trì thứ tự phát lại không? Cảm ơn trước. – hyd00

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