1、视频播放器
需导入:
#import
<MediaPlayer/MediaPlayer.h>(用于
MPMoviePlayerViewController
)
#import
<AVFoundation/AVFoundation.h>
#import
<AVKit/AVKit.h>
//
点击是下载视频,然后跳转
QWModel
* model =
self
.
arr
[indexPath.
row
];
NSURL * url = [NSURL URLWithString:model.url];
//
创建的是一个视频播放控制器,跟相册选择器相似
AVPlayerViewController * pVc = [[AVPlayerViewController alloc]init];
pVc.
player
=[
AVPlayer
playerWithURL
:url];
//可以直接当前的tableView拥有一个控制属性,在后面的代码中赋值就可以,那么就可以直接调用下面的代码了
[
xxviewController
presentViewController:vc animated:YES completion:nil]
;
//MPMoviePlayerViewController(可以使用这个来达到同样的效果)
关于视频播放器的其他简介
1
>导入框架 MediaPlayer.framework
提示,从Xcode6开始不再有默认的Frameworks文件夹,导入的框架会单独放置
如果需要可以自行建立一个名为Frameworks的分组
2>监听播放器事件:通知中心
1]播放状态 MPMoviePlayerPlaybackStateDidChangeNotification
MPMoviePlaybackStateStopped, 停止(需要用代码停止才会被触发,正常播放完成只暂停状态)
MPMoviePlaybackStatePlaying, 播放
MPMoviePlaybackStatePaused, 暂停
MPMoviePlaybackStateInterrupted, 中断
MPMoviePlaybackStateSeekingForward, 向前搜索
MPMoviePlaybackStateSeekingBackward 向后搜索
2]播放完成 MPMoviePlayerPlaybackDidFinishNotification
// 如果是全屏,退出全屏
if (self.player.isFullscreen) {
[self.player setFullscreen:NO animated:YES];
}
[self.player.view removeFromSuperview];
3]截屏完成 MPMoviePlayerThumbnailImageRequestDidFinishNotification
// 提示,时间数组中包含的时间必须是浮点数
[self.player requestThumbnailImagesAtTimes:@[@1.0] timeOption:MPMovieTimeOptionNearestKeyFrame];
视频格式(使用不同的编码方案对跟视频文件进行打包):
-
TS
流-实时的流,将视频文件拆分成多个小块,如果丢失一个,只会出现马赛克
-
FS
流-文件流,一旦任何位置被破坏,整个文件都无法播放,适合做片头
&
广告等
苹果目前支持主流的
"
编码方案
"
,都已经封装好了!
以下是部分
m3u8
资源,仅用于演示流媒体服务
http:
//live.3gv.ifeng.com/live/hongkong.m3u8
凤凰卫视
http:
//live.3gv.ifeng.com:80/live/FHZXHD.m3u8
凤凰高清
http:
//live.3gv.ifeng.com:80/live/zhongwen.m3u8
凤凰中文
http:
//210.59.248.53/hls-live/livepkgr/_definst_/liveevent/live-ch1-3.m3u8
好消息
http:
//devstreaming.apple.com/videos/watch/Getting_Started_With_Watchkit/Getting_Started_With_Watchkit.m3u8
注意:要播放
m3u8
,需要使用
MPMoviePlayerController
,否则全屏播放会有问题。
以下是视频播放器的代码实现
.h
#import
<UIKit/UIKit.h>
@interface
HMMoviePlayerView :
UIView
/**
播放指定
URL
的视频
*/
- (
void
)playWithURL:(
NSURL
*)url;
/**
停止播放
*/
- (
void
)stopPlayback;
/**
截取指定时间点的图像
*/
- (
void
)caputreImageAtTime:(
double
)time completion:(
void
(^)(
UIImage
*image))completion;
@end
.m
#import
"HMMoviePlayerView.h"
#import
<MediaPlayer/MediaPlayer.h>
@interface
HMMoviePlayerView()
/** 视频播放器 */
@property (nonatomic, strong) MPMoviePlayerController *player;
/** 播放完成后显示的图像 */
@property (nonatomic, weak) UIImageView *imageView;
/** 截图完成块代码 */
@property (nonatomic, copy) void (^captureCompletion) (UIImage *);
@end
@implementation HMMoviePlayerView
- (UIImageView *)imageView {
if (_imageView == nil) {
UIImageView *iv = [[UIImageViewalloc] initWithFrame:self.bounds];
// 把图像视图插入到最底层
[selfinsertSubview:iv atIndex:0];
_imageView = iv;
}
return_imageView;
}
- (MPMoviePlayerController *)player {
if (_player == nil) {
_player = [[MPMoviePlayerControlleralloc] init];
}
return_player;
}
#pragma mark - 播放相关控制代码
/** 添加监听 */
- (void)setupNotification {
// 监听播放完成通知
[[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(playbackFinished) name:MPMoviePlayerPlaybackDidFinishNotificationobject:nil];
// 监听屏幕截图通知
[[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(captureFinished:) name:MPMoviePlayerThumbnailImageRequestDidFinishNotificationobject:nil];
}
- (void)captureFinished:(NSNotification *)notification {
NSLog(@"截图完成 %@", notification);
UIImage *image = notification.userInfo[MPMoviePlayerThumbnailImageKey];
if (self.captureCompletion) {
self.captureCompletion(image);
}
self.imageView.image = image;
}
- (void)playbackFinished {
NSLog(@"播放完成");
// 如果是全屏播放完成,退回全屏
if (self.player.isFullscreen) {
[self.playersetFullscreen:NOanimated:YES];
}
// 把播放器的视图从屏幕上删除
[self.player.viewremoveFromSuperview];
// 删除通知中心
[[NSNotificationCenterdefaultCenter] removeObserver:self];
}
#pragma mark - 公共方法
- (void)playWithURL:(NSURL *)url {
self.player.contentURL = url;
// 将播放器的视图添加到movieView中
self.player.view.frame = self.bounds;
[selfaddSubview:self.player.view];
// 设置通知
[selfsetupNotification];
// 播放
[self.playerplay];
}
- (void)stopPlayback {
[self.playerstop];
}
- (void)caputreImageAtTime:(double)time completion:(void (^)(UIImage *image))completion {
// 在此方法中,completion不需要执行
// 需要定义一个属性,记录住completion的块代码,然后在需要的时候执行
self.captureCompletion = completion;
[self.playerrequestThumbnailImagesAtTimes:@[@(time)]timeOption:MPMovieTimeOptionNearestKeyFrame];
}
@end
以下是
#import
<AVFoundation/AVFoundation.h>头文件下 视频截屏的代码
//本地视频文件的路径
NSString
*str = [[
NSBundle
mainBundle]pathForResource:@“xxx"ofType:nil];
//素材
AVAsset
*asset = [
AVAsset
assetWithURL:[NSURLfileURLWithPath:str]];
//截取视频图片对象 封装一个视频路径
AVAssetImageGenerator *assetImage = [AVAssetImageGeneratorassetImageGeneratorWithAsset:asset];
//开始截取
//参数1
[assetImage generateCGImagesAsynchronouslyForTimes:@[@160.0]completionHandler:^(CMTime requestedTime, CGImageRef _Nullable image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError * _Nullable error) {
//注意是sync
dispatch_sync
(
dispatch_get_main_queue
(), ^{
NSLog(@"%@",[NSThreadcurrentThread]);
//展示下截屏的图片
self
.
imageview
.
image
= [
UIImage
imageWithCGImage:image];
});
}];