AVKit & MediaPlayer简写
@import AVKit;
@import AVFoundation;
NSString *address = [[NSBundle mainBundle]pathForResource:@"show" ofType:@"mp4"];
NSURL *urlPath = [NSURL fileURLWithPath:address];
self.playerController = [[AVPlayerViewController alloc]init];
self.playerController.player = [AVPlayer playerWithURL:urlPath];
self.playerController.showsPlaybackControls = NO; //不显示播放器控件
self.playerController.videoGravity = AVLayerVideoGravityResizeAspectFill; //设置拉伸模式
self.playerController.view.frame = CGRectMake(0, 0, KWidth, KHeight);
[self.navigationController.view addSubview:self.playerController.view];
[self.playerController.player play];
@import AVFoundation;
@import MediaPlayer;
self.mPlayer = [[MPMoviePlayerController alloc]initWithContentURL:[NSURL URLWithString:@"http://192.168.42.1/DCIM/100MEDIA/FILE0001.mp4"]];
self.mPlayer.view.frame = CGRectMake(0, 150, self.view.frame.size.width, 220);
[self.view addSubview:self.mPlayer.view];
self.mPlayer.scalingMode = MPMovieScalingModeAspectFill;
[self.mPlayer play];
[self.mPlayer requestThumbnailImagesAtTimes:@[@1.2,@2.1] timeOption:MPMovieTimeOptionNearestKeyFrame];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(noti:) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:nil];
- (void)noti:(NSNotification*)noti{
static int a = 1;
if (a == 1) {
_img1.image = noti.userInfo[MPMoviePlayerThumbnailImageKey];
}else{
_img2.image = noti.userInfo[MPMoviePlayerThumbnailImageKey];
}
a ++;
}
NSURL *videoUrl = [NSURL URLWithString:@"http://192.168.42.1/DCIM/100MEDIA/FILE0140.mp4"];
self.playerItem = [AVPlayerItem playerItemWithURL:videoUrl];
[self.playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];// 监听status属性
[self.playerItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];// 监听loadedTimeRanges属性
self.player = [AVPlayer playerWithPlayerItem:self.playerItem];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(moviePlayDidEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:self.playerItem];
self.layer = [AVPlayerLayer playerLayerWithPlayer:self.player];
_layer.frame = self.view.layer.frame;
[self.view.layer addSublayer:_layer];
[self.player setVolume:0.8];
[self.player play];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
AVPlayerItem *playerItem = (AVPlayerItem *)object;
if ([keyPath isEqualToString:@"status"]) {
if ([playerItem status] == AVPlayerStatusReadyToPlay) {
NSLog(@"AVPlayerStatusReadyToPlay");
// self.stateButton.enabled = YES;
CMTime duration = self.playerItem.duration;// 获取视频总长度
CGFloat totalSecond = playerItem.duration.value / playerItem.duration.timescale;// 转换成秒
// _totalTime = [self convertTime:totalSecond];// 转换成播放时间
//[self customVideoSlider:duration];// 自定义UISlider外观
NSLog(@"movie total duration:%f",CMTimeGetSeconds(duration));
[self monitoringPlayback:self.playerItem];// 监听播放状态
} else if ([playerItem status] == AVPlayerStatusFailed) {
NSLog(@"AVPlayerStatusFailed");
}
} else if ([keyPath isEqualToString:@"loadedTimeRanges"]) {
NSTimeInterval timeInterval = [self availableDuration];// 计算缓冲进度
NSLog(@"Time Interval:%f",timeInterval);
CMTime duration = self.playerItem.duration;
CGFloat totalDuration = CMTimeGetSeconds(duration);
[self.gress setProgress:timeInterval/totalDuration animated:YES];
NSLog(@"%f",timeInterval / totalDuration);
}
}
- (NSTimeInterval)availableDuration {
NSArray *loadedTimeRanges = [[self.player currentItem] loadedTimeRanges];
CMTimeRange timeRange = [loadedTimeRanges.firstObject CMTimeRangeValue];// 获取缓冲区域
float startSeconds = CMTimeGetSeconds(timeRange.start);
float durationSeconds = CMTimeGetSeconds(timeRange.duration);
NSTimeInterval result = startSeconds + durationSeconds;// 计算缓冲总进度
return result;
}
- (NSString *)convertTime:(CGFloat)second{
NSDate *d = [NSDate dateWithTimeIntervalSince1970:second];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
if (second/3600 >= 1) {
[formatter setDateFormat:@"HH:mm:ss"];
} else {
[formatter setDateFormat:@"mm:ss"];
}
NSString *showtimeNew = [formatter stringFromDate:d];
return showtimeNew;
}
- (void)monitoringPlayback:(AVPlayerItem *)playerItem {
[self.player addPeriodicTimeObserverForInterval:CMTimeMake(1, 1) queue:NULL usingBlock:^(CMTime time) {
CGFloat currentSecond = playerItem.currentTime.value/playerItem.currentTime.timescale;// 计算当前在第几秒
[self updateVideoSlider:currentSecond];
NSString *timeString = [self convertTime:currentSecond];
//self.timeLabel.text = [NSString stringWithFormat:@"%@/%@",timeString,_totalTime];
NSLog(@"%f,%@",currentSecond,timeString);
}];
}
-(void)updateVideoSlider:(CGFloat)f{
CMTime duration = self.playerItem.duration;// 获取视频总长度
CGFloat totalSecond = self.playerItem.duration.value / self.playerItem.duration.timescale;
self.playerSlider.value = f / totalSecond;
}
-(void)moviePlayDidEnd:(NSNotification*)noti{
}
AVKit & MediaPlayer简写的更多相关文章
- cocoaPods 创建自己的依赖库
1.先在github上创建一个仓库 和一般创建一样,就是证书一定要选,我选的是MIT,不要问我因为啥, 我也不知道, 哈哈 2.check到本地或者本地创建,反正最后都要上传到这个仓库,以个人习惯吧 ...
- Mediaplayer error (-19,0)
Android MediaPlayer 发生 error (-19,0) 错误解决方法. 引起原因:由于多次实例化MediaPlayer.start() 进行播放操作引起的.由于没有及时释放内存资源导 ...
- 关于从Activity A跳转到Activity B ,其中Activity A中有一个VideoView,Activity B中有一个MediaPlayer。
两个不同的视频的跳转, 前面我是在onStop()方法中销毁VideoView(因为MediaPlayer是全局共用的,而VideoView内包含MediaPlayer),但是每次进入Activity ...
- [LeetCode] Generalized Abbreviation 通用简写
Write a function to generate the generalized abbreviations of a word. Example: Given word = "wo ...
- Android四大组件--MediaPlayer详解(转)
一. MediaPlayer 状态机 介绍 Android MediaPlayer 状态即图例 : 1. Idle (闲置) 状态 和 End (结束) 状态 MediaPlayer 对象声明周期 : ...
- Android音视频之MediaPlayer音视频播放
前言: 昨天总结了视频录制,今天来学习一下视频的播放,Android的视频播放主要采用MediaPlayer类. MediaPlayer介绍 MediaPlayer类可用于控制音频/视频文件或流的播放 ...
- Android音频开发之MediaRecorder/MediaPlayer
前言: 上次我们介绍了实时采集音频数据以及播放,今天我们来认识一下直接录制文件的方式. 直接上代码:录制管理类 public class MediaRecorderManager { public s ...
- WPF语音播放MediaPlayer
private MediaPlayer player; public MainWindow() { InitializeComponent(); player = new MediaPlayer(); ...
- CSS属性简写
盒模型简写: 如果top.right.bottom.left的值相同,如下面代码:margin:10px 10px 10px 10px; 缩写为:margin:10px; 如果top和bottom值相 ...
随机推荐
- 线性探测再散列 建立HASH表
根据数据元素的关键字和哈希函数建立哈希表并初始化哈希表,用开放定址法处理冲突,按屏幕输出的功能表选择所需的功能实现用哈希表对数据元素的插入,显示,查找,删除. 初始化哈希表时把elem[MAXSIZE ...
- freebsd|odoo - 为odoo报表 安装文泉译中文字体
来源: Odoo8.0中使用文泉译中文字体 http://blog.csdn.net/vnsoft/article/details/40056935 FreeBSD wkhtmltop ...
- 【行业交流】2016 TiD质量竞争力大会——移动互联网测试到质量的转变之路
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5691233.html TiD质量大会在北京召开,有幸去参加 ...
- Excel Interior.ColorIndex色彩列表
Microsoft.Office.Interop.Excel.Range range; ; i < dt.Columns.Count; i++) { worksheet.Cells[, i + ...
- RDIFramework.NET ━ 9.5 组织机构管理 ━ Web部分
RDIFramework.NET ━ .NET快速信息化系统开发框架 9.5 组织机构管理 -Web部分 组织机构管理模块提供直观方便的组织机构管理,以树型结构显示单位和部门的机构体系,可根据需要进行 ...
- Linux系统编程--文件IO操作
Linux思想即,Linux系统下一切皆文件. 一.对文件操作的几个函数 1.打开文件open函数 int open(const char *path, int oflags); int open(c ...
- 视觉中的深度学习方法CVPR 2012 Tutorial Deep Learning Methods for Vision
Deep Learning Methods for Vision CVPR 2012 Tutorial 9:00am-5:30pm, Sunday June 17th, Ballroom D (Fu ...
- SD卡读写遇到的一些函数
SD_SPI_ReadWriteByte(0XFF): 你的数据线写0xff,就是一直保持高,clk就有了8个,可以说只是发送的数据是0xff,这又不是SD的命令,但是它必须要靠控制器提供时钟才能工作 ...
- Android--Retrofit+RxJava的简单封装(三)
1,继续接着上一篇的讲讲,话说如果像上一篇这样的话,那么我们每一次请求一个结构都要创建一堆的Retrofit对象,而且代码都是相同的,我们可以试试封装一下 先创建一个HttpMethods类,将Ret ...
- 深入理解Android之Gradle
深入理解Android之Gradle 格式更加精美的PDF版请到:http://vdisk.weibo.com/s/z68f8l0xTYrZt 下载 Gradle是当前非常"劲爆" ...