我正在开发基于电子书阅读器的应用程序,PDF书籍包含多个PDF页面。每个页面都有视频图标来播放视频资源。我使用AVPlayer
使用AVPlayerItem
和AVURLAsset
(来自URL
的流)播放视频。它可以在相同页面或不同页面播放相同或不同视频10-15次。但是一段时间后视频没有播放,而是显示带有交叉线的播放图标。
我使用了以下代码。
NSURL *videoUrl = [NSURL URLWithString:@"http://WWW.google.com/media/test_1.mp4"]
NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];
NSDictionary *optionsDic = @{AVURLAssetHTTPCookiesKey : cookies};
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:videoUrl options:optionsDic];
AVPlayerItem *playeritem = [AVPlayerItem playerItemWithAsset:asset];
AVPlayer *player = [[AVPlayer alloc] initWithPlayerItem:playeritem];
AVPlayerViewController *moviePlayerVC = [[AVPlayerViewController alloc]init];
moviePlayerVC.player = player;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self presentViewController:moviePlayerVC animated:NO completion:nil];
});
答案 0 :(得分:2)
Finally from the Apple AVPlayerDemo sample code I have found the code changes required. And replaced this code with the existing and its worked for me.
@interface VideoViewController : UIViewController {
AVPlayerViewController *playerVC;
AVPlayer* mPlayer;
AVPlayerItem * mPlayerItem;
}
@property (strong) AVPlayerItem* mPlayerItem;
@property (readwrite, strong, setter=setPlayer:, getter=player) AVPlayer* mPlayer;
@end
@implementation VideoViewController
@synthesize mPlayer,mPlayerItem;
-(void)viewDidLoad{
playerVC = [[AVPlayerViewController alloc]init];
}
- (void)presentVideoViewController:(NSURL*)linkUrl{
NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];
NSDictionary *optionsDic = @{AVURLAssetHTTPCookiesKey : cookies};
AVURLAsset * asset = [AVURLAsset URLAssetWithURL:linkUrl options:optionsDic];
NSArray *requestedKeys = @[@"playable"];
[asset loadValuesAsynchronouslyForKeys:requestedKeys completionHandler:
^{
dispatch_async( dispatch_get_main_queue(),
^{
for (NSString *thisKey in requestedKeys)
{
NSError *error = nil;
AVKeyValueStatus keyStatus = [asset statusOfValueForKey:thisKey error:&error];
if (keyStatus == AVKeyValueStatusFailed)
{
//Show failed error message without presenting AVPlayerViewController//
return;
}
}
if (!asset.playable)
{
//Show failed error message without presenting AVPlayerViewController//
return;
}
if (self.mPlayerItem)
{
[self.mPlayerItem removeObserver:self forKeyPath:@"status"];
}
[self.mPlayerItem addObserver:self
forKeyPath:@"status"
options:0
context:nil];
if (!self.mPlayer)
{
[self setPlayer:[AVPlayer playerWithPlayerItem:self.mPlayerItem]];
}
if (self.player.currentItem != self.mPlayerItem)
{
[self.mPlayer replaceCurrentItemWithPlayerItem:self.mPlayerItem];
}
playerVC.player = self.mPlayer;
[self presentViewController:playerVC animated:NO completion:nil];
});
}];
}
- (void)dealloc{
if (mPlayer) {
[mPlayer.currentItem removeObserver:self forKeyPath:@"status"];
[self.mPlayer pause];
self.mPlayer = nil;
self.mPlayerItem = nil;
playerVC = nil;
}
}
发布相关参考链接:
AVPlayerItem fails with AVStatusFailed and error code "Cannot Decode" Error Domain=AVFoundationErrorDomain Code=-11821 "Cannot Decode"