关闭

iOS中 MediaPlayer framework实现视频播放 韩俊强的博客

标签: 实现视频播放韩俊强的博客MediaPlayeriOS开发ios
1588人阅读 评论(0) 收藏 举报
分类:

  iOS开发中播放音乐可以使用MPMusicPlayerController类来实现,播放视频可以使用MPMoviePlayerController和MPMoviePlayerViewController类来实现,同时MPMediaPickerController 类可以用于从系统媒体库中选择媒体播放。这几个类都包含与MediaPlayer.framework框架中。

这里主要介绍MediaPlayer.framework


指定根视图:

    RootTableViewController *rootTVC = [[RootTableViewController alloc] initWithStyle:UITableViewStylePlain];
    UINavigationController *rootNC = [[UINavigationController alloc] initWithRootViewController:rootTVC];
    self.window.rootViewController = rootNC;


RootTableViewController.m

设置相关属性:

#import "RootTableViewController.h"
#import "TestCell.h"
#import "TestModel.h"
#import "UIImageView+WebCache.h"
#import <MediaPlayer/MediaPlayer.h>

@interface RootTableViewController ()

@property (nonatomic, strong) MPMoviePlayerViewController *mpPVC;

@property (nonatomic, strong) NSMutableArray *dataSourceArray;

@property (nonatomic, strong) NSIndexPath *selectedIndexPath;

@property (nonatomic, assign) CGRect selectedRect;

@end

@implementation RootTableViewController

调用:

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    [self.tableView registerNib:[UINib nibWithNibName:@"TestCell" bundle:nil] forCellReuseIdentifier:@"testCell"];
    self.dataSourceArray = [NSMutableArray array];
    
    [self loadDataAndShow];

}

加载网络数据:

- (void)loadDataAndShow
{
    NSURL *url = [NSURL URLWithString:@"http://c.m.163.com/nc/video/list/V9LG4B3A0/y/1-20.html"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        
        if (data != nil) {
            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
            NSArray *array = dict[@"V9LG4B3A0"];
            for (NSDictionary *aDict in array) {
                TestModel *model = [[TestModel alloc] init];
                [model setValuesForKeysWithDictionary:aDict];
                [self.dataSourceArray addObject:model];
            }
            
            [self.tableView reloadData];
        } else {
            NSLog(@"%@", [connectionError localizedDescription]);
        }
        
    }];
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.dataSourceArray.count;
}


返回cell

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    TestCell *cell = [tableView dequeueReusableCellWithIdentifier:@"testCell" forIndexPath:indexPath];
    TestModel *model = self.dataSourceArray[indexPath.row];
    [cell.movieImageView sd_setImageWithURL:[NSURL URLWithString:model.cover]];
    
    UITapGestureRecognizer *tapGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];
    [cell.movieImageView addGestureRecognizer:tapGR];
    
    return cell;
}

添加手势:

- (void)tapAction:(UITapGestureRecognizer *)sender
{
    if (self.mpPVC.view) {
        [self.mpPVC.view removeFromSuperview];
    }
    UIView *view = sender.view;
    UITableViewCell *cell = (UITableViewCell *)view.superview.superview;
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
    self.selectedIndexPath = indexPath;
    TestModel *model = self.dataSourceArray[indexPath.row];
    self.mpPVC = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:model.mp4_url]];
    
    self.mpPVC.view.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 370);
    [self.mpPVC.moviePlayer setScalingMode:MPMovieScalingModeAspectFill];
    [self.mpPVC.moviePlayer setControlStyle:MPMovieControlStyleEmbedded];
    [cell addSubview:self.mpPVC.view];
    
    
}
返回高:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 370;
}

添加划出屏幕小窗口效果:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    TestCell *cell = (TestCell *)[self.tableView cellForRowAtIndexPath:self.selectedIndexPath];
    // 当前cell在tableView的坐标
    CGRect rectInTableView = [self.tableView rectForRowAtIndexPath:self.selectedIndexPath];
    CGRect rectInWindow = [self.tableView convertRect:rectInTableView toView:[self.tableView superview]];
    self.selectedRect = CGRectMake(rectInTableView.origin.x, rectInTableView.origin.y, cell.movieImageView.bounds.size.width + 20, cell.movieImageView.bounds.size.height + 20);
    
    
    if ([self.mpPVC.moviePlayer isPreparedToPlay]) {
        if (rectInWindow.origin.y <= -370 || rectInWindow.origin.y >= [UIScreen mainScreen].bounds.size.height) {
            [UIView animateWithDuration:.5 animations:^{
               
                self.mpPVC.view.frame = CGRectMake(self.view.bounds.size.width - 170, self.view.bounds.size.height - 170, 170, 170);
                [self.view.window addSubview:self.mpPVC.view];
                self.mpPVC.moviePlayer.controlStyle = MPMovieControlStyleEmbedded;
                
                
            }];
        } else {
            self.mpPVC.view.frame = self.selectedRect;
            [self.tableView addSubview:self.mpPVC.view];
            self.mpPVC.moviePlayer.controlStyle = MPMovieControlStyleDefault;
        }
    }
    
}

自定义cell

//.h
#import <UIKit/UIKit.h>

@interface TestCell : UITableViewCell

@property (weak, nonatomic) IBOutlet UIImageView *movieImageView;

@end

//.m
- (void)awakeFromNib
{
    self.movieImageView.userInteractionEnabled = YES;
}

cell布局如下




添加model类:

//.h
#import <Foundation/Foundation.h>

@interface TestModel : NSObject

@property (nonatomic, copy) NSString *cover;
@property (nonatomic, copy) NSString *mp4_url;

@end

//.m
- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
    
}

最终效果:


每日更新关注:http://weibo.com/hanjunqiang  新浪微博



1
0
查看评论

iOS 多媒体(一)音频播放

1 System Sound Services System Sound Services 方式只适合播放一些很小的提示或警告音频。有一些限制: 声音长度不超过30s。不能控制播放进度声音文件必须是PCM或IMA4格式。打包成.caf、.aif或.wav的文件无循环播放和立体声控制调用方法后立即...
  • VNanyesheshou
  • VNanyesheshou
  • 2016-10-22 13:37
  • 1443

IOS上MediaPlayer.framework实现视频播放

播放电影文件:     iOS sdk中可以使用MPMoviePlayerController来播放电影文件。但是在iOS设备上播放电影文件有严格的格式要求,只能播放下面两个格式的电影文件。 • H.264 (Baseline Profile Level 3.0) ...
  • zhukaiboai
  • zhukaiboai
  • 2015-04-22 11:45
  • 1068

iOS的影片播放 MediaPlayer 和 AVPlayer

在iOS開發上,如果遇到需要播放影片,如開機動畫…,我們很習慣地會使用MediaPlayer來播放影片,因為很方便使用,所以就一直使用下去。但是隨著客戶的要求越來越嚴苛,尤其是過場動畫或互動效果上的表現。所以如果在一些動畫中還挾帶影片一起運算,那勢必機器會跑不動。所以在iOS 4之後,我們可以使用A...
  • think12
  • think12
  • 2013-01-28 16:19
  • 41467

IOS学习——IOS上MediaPlayer framework实现视频播放

播放电影文件:     iOS sdk中可以使用MPMoviePlayerController来播放电影文件。但是在iOS设备上播放电影文件有严格的格式要求,只能播放下面两个格式的电影文件。 • H.264 (Baseline Profile Level 3...
  • blue_jjw
  • blue_jjw
  • 2013-06-20 18:57
  • 18541

(ios实战)MediaPlayer播放视频

1MediaPlayer内嵌的方式播放视频  1.1 导入头文件  #import "MediaPlayer/MediaPlayer.h"  1.2 定义MoviePlayerController类 创建MoviePlayerControll...
  • dyllove98
  • dyllove98
  • 2013-06-08 20:35
  • 2095

ios-播放器开发-锁屏、循环播放

#import #import @interface AudioTool : NSObject /** * 播放音效 * * @param filename */ +(void)playSound:(NSString *)filename; /** * 销毁音效 * * ...
  • u012701023
  • u012701023
  • 2015-09-09 22:29
  • 1813

Webkit中HTML5 Video的实现分析-HTMLMediaElement & MediaPlayer

以下为针对Webkit中HTML5 Video实现原理的分析和学习总结。至于其中的UML图档,可以到下面的github链接中下载。 首先预览一下Webkit中和Video相关的主要的类的层次结构: 其中主要的类为HTMLMediaElement, MediaPlayer以及RenderVi...
  • coloriy
  • coloriy
  • 2015-08-20 10:07
  • 1559

iOS中 MediaPlayer framework实现视频播放 韩俊强的博客

iOS开发中播放音乐可以使用MPMusicPlayerController类来实现,播放视频可以使用MPMoviePlayerController和MPMoviePlayerViewController类来实现,同时MPMediaPickerController 类可以用于从系统媒体库中选择媒体播放...
  • qq_31810357
  • qq_31810357
  • 2015-11-17 21:21
  • 1588

[ios]关于MediaPlayer 播放进度的存取

关于MediaPlayer 播放进度的存取
  • w250130255
  • w250130255
  • 2014-11-26 10:08
  • 703

韩俊强新浪博客语录

不要期待,不要假想,顺其自然,如果注定,就一定会发生。人生没有那么多莺莺燕燕,什么是好的生活,什么是好的伴侣,无非就是,你饿了,做给你吃,你渴了,端给你喝,你冷了,给你盖被,你病了,给你拿药,哪怕你心烦了,也能骂他几句不是。脚踏实地的,比什么都强。【读懂这几句话胜读十年书】1,蜘蛛:能坐享其成,靠的...
  • qq_31810357
  • qq_31810357
  • 2015-10-08 09:03
  • 662
    个人资料
    • 访问:594592次
    • 积分:7025
    • 等级:
    • 排名:第3891名
    • 原创:240篇
    • 转载:10篇
    • 译文:1篇
    • 评论:214条
    我的微信公众号

    iOS开发者交流群: 官方付费群
    ①群:446310206
    ②群:426087546


    QQ: 点击这里给我发消息


    关注我的技术公众号,每天都有优质技术文章推送。
    微信关注我的公众号
    关注我的微博
    博客专栏
    我的小仓鼠

    有空帮我喂下仓鼠,谢谢!