作者:江南西道longge | 来源:互联网 | 2023-07-18 21:56
iOS开发网络篇—实现一个视频播放客户端小应用本文转载于:http:blog.csdn.netgf771115articledetails45074065其它资源参考:iOS开发系列--音
iOS开发网络篇—实现一个视频播放客户端小应用
本文转载于:http://blog.csdn.net/gf771115/article/details/45074065
其它资源参考:iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
一、实现视频播放功能
实现效果:
启动项目后,点击对应的cell,即可播放视频。
96
97 //这里使用了第三方框架
98 [cell.imageView setImageWithURL:[NSURL URLWithString:imageUrl] placeholderImage:[UIImage imageNamed:@"placeholder"]];
99
100 return cell;
101 }
102
103 //设置cell的行高
104 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
105 {
106 return 70;
107 }
108
109 //播放视频
110 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
111 {
112 //取出数据模型
113 YYviodesModel *model=self.videos[indexPath.row];
114
115 //创建视屏播放器
116 // MPMoviePlayerController 可以随意控制播放器的尺寸
117 //MPMoviePlayerViewController只能全屏播放
118
119 NSString *url = [NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/%@", model.url];
120 NSURL *videoUrl=[NSURL URLWithString:url];
121 MPMoviePlayerViewController *movieVc=[[MPMoviePlayerViewController alloc]initWithContentURL:videoUrl];
122 //弹出播放器
123 [self presentMoviePlayerViewControllerAnimated:movieVc];
124
125 }
126 @end
注意:要是有视频播放功能,还需要导入下面的框架。
在主控制器文件中,导入框架的主头文件。
二、实现屏幕方向的控制
说明:iphone支持三个方向的播放。
程序支持三个方向。(不支持向下颠倒-home键在上面)
如果要求只支持竖屏,那么最直接的做法是直接在配置文件中把另外两个勾去掉。
实现屏幕控制的方法(supported)。
1 #pragma mark-实现屏幕方向的控制
2 /**
3 * 控制当前控制器支持那些方向
4 *
5 * 返回值是 UIInterfaceOrientationMask*
6 */
7 -(NSUInteger)supportedInterfaceOrientations
8 {/**
9 *UIInterfaceOrientationMaskPortrait:竖屏(正常)
10 *UIInterfaceOrientationMaskPortraitUpsideDown:竖屏(上下颠倒)
11 *UIInterfaceOrientationMaskLandscapeLeft:横屏向左
12 *UIInterfaceOrientationMaskLandscapeRight:横屏向右
13 *UIInterfaceOrientationMaskLandscape:横屏(左右都支持)
14 *UIInterfaceOrientationMaskAll:所有都支持
15 */
16 return UIInterfaceOrientationMaskAll;
17 }
说明:最外面的控制器不是tableviewcontrol控制器,而是导航控制器。如果要实现“视屏列表界面只支持竖屏方向,而播放界面只支持横屏”的需求,那么应该自定义一个导航控制器,重写实现屏幕方向的方法。
(1)实现“视屏列表界面只支持竖屏方向
自定义一个YYNavigationController,其继承自UINavigationController
1 //
2 // YYNavigationController.m
3 // 01-文顶顶客户端
4 //
5 // Created by apple on 14-6-29.
6 // Copyright (c) 2014年 itcase. All rights reserved.
7 //
8
9 #import "YYNavigationController.h"
10
11 @interface YYNavigationController ()
12
13 @end
14
15 @implementation YYNavigationController
16
17 //视屏列表界面只支持竖屏方向
18 #pragma mark-实现屏幕方向的控制
19 /**
20 * 控制当前控制器支持那些方向
21 *
22 * 返回值是 UIInterfaceOrientationMask*
23 */
24 -(NSUInteger)supportedInterfaceOrientations
25 {/**
26 *UIInterfaceOrientationMaskPortrait:竖屏(正常)
27 *UIInterfaceOrientationMaskPortraitUpsideDown:竖屏(上下颠倒)
28 *UIInterfaceOrientationMaskLandscapeLeft:横屏向左
29 *UIInterfaceOrientationMaskLandscapeRight:横屏向右
30 *UIInterfaceOrientationMaskLandscape:横屏(左右都支持)
31 *UIInterfaceOrientationMaskAll:所有都支持
32 */
33 return UIInterfaceOrientationMaskPortrait;
34 }
35 @end
(2)实现播放界面只支持横屏
自定义一个YYMoviePlayerViewController,其继承自MPMoviePlayerViewController。
1 //
2 // YYMoviePlayerViewController.m
3 // 01-文顶顶客户端
4 //
5 // Created by apple on 14-6-29.
6 // Copyright (c) 2014年 itcase. All rights reserved.
7 //
8
9 #import "YYMoviePlayerViewController.h"
10
11 @interface YYMoviePlayerViewController ()
12
13 @end
14
15 @implementation YYMoviePlayerViewController
16
17
18 //播放界面只支持横屏
19 #pragma mark-实现屏幕方向的控制
20
21 -(NSUInteger)supportedInterfaceOrientations
22 {
23 return UIInterfaceOrientationMaskLandscape;
24 }
25
26 @end
主控制器中播放视频部分的代码修改如下:
导入头文件
1 //播放视频
2 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
3 {
4 //取出数据模型
5 YYviodesModel *model=self.videos[indexPath.row];
6
7 //创建视屏播放器
8 // MPMoviePlayerController 可以随意控制播放器的尺寸
9 //MPMoviePlayerViewController只能全屏播放
10
11 NSString *url = [NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/%@", model.url];
12 NSURL *videoUrl=[NSURL URLWithString:url];
13 YYMoviePlayerViewController *movieVc=[[YYMoviePlayerViewController alloc]initWithContentURL:videoUrl];
14 //弹出播放器
15 [self presentMoviePlayerViewControllerAnimated:movieVc];
16 }
三、细节处理
1.问题:系统自带的MPMoviePlayerViewController,当程序进入后台的时候就会自动销毁。如何让其保持状态进入后台前的状态?
原因:当系统进入后台的时候会发出通知:UIApplicationDidEnterBackgroundNotification,而系统的MPMoviePlayerViewController会自动监听该通知,当监听到进入后台的这个通知后,MPMoviePlayerViewController会调用方法销毁。
解决方法:移除通知
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil];
//说明:移除self监听的名称为UIApplicationDidEnterBackgroundNotification的通知,参数为空。
处理代码:
1 //
2 // YYMoviePlayerViewController.m
3 // 01-文顶顶客户端
4 //
5 // Created by apple on 14-6-29.
6 // Copyright (c) 2014年 itcase. All rights reserved.
7 //
8
9 #import "YYMoviePlayerViewController.h"
10
11 @interface YYMoviePlayerViewController ()
12
13 @end
14
15 @implementation YYMoviePlayerViewController
16
17 -(void)viewDidLoad
18 {
19 [super viewDidLoad];
20 //移除程序进入后台的通知
21 [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil];
22 }
23 //播放界面只支持横屏
24 #pragma mark-实现屏幕方向的控制
25
26 -(NSUInteger)supportedInterfaceOrientations
27 {
28 return UIInterfaceOrientationMaskLandscape;
29 }
30
31 @end
补充:1如果模拟器上的应用程序过多,可以把所有的应用程序都进行清除。
2在iOS中之支持一部分格式(通常支持MAC机上支持的格式,如MP4等)
如果要播放一些不支持的格式,可以借助软件解码器。
通常要播放视频,都需要进行解码,解码分为两类:
(1)硬件解码:硬件解码更快,硬件设备默认支持的格式
(2)软件解码:耗电大(通常不支持硬件解码的只能通过软件解码的方式进行播放)如:VLC/ffmpeg(流媒体软件解码工具)