#import "TVUAlbumAssetViewController.h"
#import <PhotosUI/PhotosUI.h>
@interface TVUAlbumAssetViewController ()
@property (nonatomic, retain) IBOutlet UIImageView *imageView;
@property (nonatomic, strong) AVPlayerLayer *playerLayer;
// 声明视频播放器
@property (nonatomic, strong) AVPlayer *aPlayer;
// 播放或停止按钮
@property (retain, nonatomic) IBOutlet UIButton *videoButton;
// 控制视频播放的控件
@property (retain, nonatomic) IBOutlet UISlider *progressSlider;
// 播放的总时长
@property (nonatomic,assign)CGFloat sumPlayOperation;
// 监控进度
@property (nonatomic,strong)NSTimer *avTimer;
@end
@implementation TVUAlbumAssetViewController
{
// 标记直播/暂停状态
int flag;
}
@synthesize delegate;
- (void)viewDidLoad {
[super viewDidLoad];
flag = 0;
[self.videoButton setBackgroundImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal];
[self.videoButton addTarget:self action:@selector(onClick) forControlEvents:UIControlEventTouchUpInside];
[self.navBar addSubview:self.videoButton];
//监控播放进度
self.avTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(timer)userInfo:nil repeats:YES];
//对滑动条添加事件函数
[self.progressSlider addTarget:self action:@selector(sliderChanged:) forControlEvents:UIControlEventValueChanged];
// 添加视频播放结束通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerItemDidReachEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:self.aPlayer];
}
- (void)createPlayer{
[[PHImageManager defaultManager] requestAVAssetForVideo:self.asset options:nil resultHandler:^(AVAsset *avAsset, AVAudioMix *audioMix, NSDictionary *info) {
dispatch_async(dispatch_get_main_queue(),^{
if (!self.playerLayer) {
CALayer *viewLayer = self.imageView.layer;
//设置播放的项目
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:avAsset];
playerItem.audioMix = audioMix;
//初始化player对象
AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
//设置播放页面
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
//设置画面缩放模式
playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;
//设置播放页面的大小
playerLayer.frame = CGRectMake(0, 0, viewLayer.bounds.size.width, viewLayer.bounds.size.height);
//添加播放视图到self.imageView
[viewLayer addSublayer:playerLayer];
self.playerLayer = playerLayer;
self.aPlayer = player;
}
});
}];
}
- (void)playerItemDidReachEnd:(NSNotification *)notification {
[self.aPlayer seekToTime:kCMTimeZero];
[self.videoButton setBackgroundImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal];
flag = 0;
}
- (void)sliderChanged:(UISlider *)proSlider{
// 获取当前播放的视频或者音频的总时长
self.sumPlayOperation = self.aPlayer.currentItem.duration.value/self.aPlayer.currentItem.duration.timescale;
// 跳转到某个时间节点 CMTimeMake(a,b) a表示当前时间,b表示每秒钟有多少帧
[self.aPlayer seekToTime:CMTimeMakeWithSeconds(self.progressSlider.value*self.sumPlayOperation, self.aPlayer.currentItem.duration.timescale) completionHandler:^(BOOL finished) {
}];
}
//监控播放进度方法
- (void)timer{
self.progressSlider.value = CMTimeGetSeconds(self.aPlayer.currentItem.currentTime) / CMTimeGetSeconds(self.aPlayer.currentItem.duration);
}
//播放/暂停按钮的点击方法
- (void)onClick{
if (flag == 0) {
flag = 1;
[self.videoButton setBackgroundImage:[UIImage imageNamed:@"pause.png"] forState:UIControlStateNormal];
if (self.playerLayer != nil) {
[self.playerLayer.player play];
}else {
[self createPlayer];
[self.playerLayer.player play];
}
}else{
flag = 0;
[self.videoButton setBackgroundImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal];
[self.playerLayer.player pause];
}
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self createPlayer];
if (self.asset.mediaType == PHAssetMediaTypeVideo) {
self.videoButton.hidden = NO;
self.progressSlider.hidden = NO;
if (self.aPlayer != nil) {
[self.aPlayer seekToTime:kCMTimeZero];
}
}
else {
self.videoButton.hidden = YES;
self.progressSlider.hidden = YES;
}
[self showImage];
}
- (BOOL)shouldAutorotate {
return YES;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[self.playerLayer removeFromSuperlayer];
self.playerLayer = nil;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)goBack:(id)sender {
[self dismissViewControllerAnimated:YES completion:nil];
}
- (IBAction)doneWithSelection:(id)sender {
[self.aPlayer pause];
[self.delegate didFinishPickingMediaWithAsset:self.asset];
}
#pragma mark - Image setup methods.
- (CGSize)targetSize {
CGFloat scale = [UIScreen mainScreen].scale;
CGSize targetSize = CGSizeMake(CGRectGetWidth(self.imageView.bounds) * scale, CGRectGetHeight(self.imageView.bounds) * scale);
return targetSize;
}
- (void)showImage {
[[PHImageManager defaultManager] requestImageForAsset:self.asset targetSize:[self targetSize] contentMode:PHImageContentModeAspectFit options:nil resultHandler:^(UIImage *result, NSDictionary *info) {
self.imageView.image = result;
}];
}
- (void)dealloc {
[_videoButton release];
[_progressSlider release];
[super dealloc];
}
@end
关于Slider
最新推荐文章于 2025-06-16 17:18:41 发布