文章目录
引言
上周接触到一个用手机链接车载记录仪来实时查看视频的项目,涉及到VLC,发现这个库很强大。这周开始入手简单研究下。
VLC 简述
VLC 是一款强大的本地播放器。
- 支持几乎所有的主流媒体格式。可以播放来自网络、摄像头、磁盘、光驱的文件,支持包括MPEG 1/2/4, H264, VC-1, DivX, WMV, Vorbis, AC3, AAC等格式的解码。
- 可播放那些没有下载完整的视频文件。
- 可以扫描本地端口,然后通过输入用户名和密码浏览电脑的文件,点击视频和音频还能直接播放。
- 只要本地开启SMB的文件共享服务,同一个局域网内的设备就能通过它访问电脑上的文件了。
在 Windows 和 Linux 上的 VLC 是使用C++/Qt写成,提供了一致的用户体验。同时 VLC 还专门为 OS X 提供了原生版本,OS X 版的 VLC 的用户界面使用Cocoa框架编写,在 OS X 下拥有卓越的原生体验。
SMB协议
Mac OS上,Windows和Linux都支持这种协议。
SMB的格式,长这样:
smb://{hostname}:{password}@{ip}/path
hostname是域名,一般创建SMB共享协议的时候,就需要指定;password是密码,ip是服务器的ip。
比如桌面上的一个mp4文件就应该长这样:
smb://xiaoming:123456@192.168.1.100/xiaoming/Desktop/233.mp4
优质 SMB 第三方:TOSMBClient
使用
一、导入 VLC 库
1、pod MobileVLCKit
在项目的podfile 中加入 pod 'MobileVLCKit', '~> 2.2.2'
,并 pod install
来讲库加入到项目中。
2、导入 libstdc++
否则会报一下错误。如果还报错,则导入 libstdc++ 6.0.9
3、在使用到 VLC的地方,添加 #import <MobileVLCKit/MobileVLCKit.h>
二、使用 VLCMediaPlayer
1、申明 VLCMediaPlayer
@property(nonatomic,strong) VLCMediaPlayer *player;//播放器
@property (nonatomic,strong) UIView *playView;//展示的View
2、初始化,
下面使用懒加载,你可以使用我的懒加载工具:
http://blog.csdn.net/lovechris00/article/details/77448356
- (UIView *)playView
{
if(!_playView){
_playView = [[UIView alloc] initWithFrame:CGRectMake(30, 100, 300, 300)];
_playView.backgroundColor = [UIColor yellowColor];
[self.view addSubview:_playView];
}
return _playView;
}
- (VLCMediaPlayer *)player
{
if(!_player){
_player = [[VLCMediaPlayer alloc]init];
_player.delegate = self;
}
return _player;
}
3、添加多媒体文件
将mp4文件拖拽到工程中。并获取地址,创建 VLCMedia
文件。
NSString *path=[[NSBundle mainBundle] pathForResource:@"我飘向北方" ofType:@"mp4"];
VLCMedia *media = [VLCMedia mediaWithPath:path];
VLCMedia
-
mediaWithPath
使用本地的文件 -
mediaWithURL
使用远程链接初始化。如果后面跟的是本地地址的话,可能会崩溃。
3、播放
self.player.drawable = self.playView;
self.player.media = media;
[self.player play];
实现上述步骤,就可以播放这个mp4了。
三、VLCMediaPlayer 其他方法
播放
-(BOOL)play;
暂停
- (void)pause;
停止
- (void)stop;
下一帧
- (void)gotoNextFrame;
倒回
- (void)rewind;
- (void)rewindAtRate:(float)rate;
快进
- (void)fastForward;
- (void)fastForwardAtRate:(float)rate;//快退,rate 速率
- (void)jumpForward:(int)interval; //快进,时间为 interval,单位为秒
- (void)shortJumpForward;
- (void)extraShortJumpForward;
- (void)mediumJumpForward;
- (void)longJumpForward;
快退
- (void)jumpBackward:(int)interval; //快退,时间为 interval,单位为秒
- (void)extraShortJumpBackward;
- (void)shortJumpBackward;
- (void)mediumJumpBackward;
- (void)longJumpBackward;
四、VLCMediaPlayerDelegate
#pragma mark - VLCMediaPlayerDelegate
//播放状态改变的回调
- (void)mediaPlayerStateChanged:(NSNotification *)aNotification{
// aNotification.userInfo
NSLog(@"mediaPlayerStateChanged --- ");
}
//播放时间改变的回调
- (void)mediaPlayerTimeChanged:(NSNotification *)aNotification{
// NSLog(@"mediaPlayerTimeChanged --- "); //会一直掉用
}
常见问题
运行后,你的控制台会打印一堆信息,没关系,他依然可以跑起来
-
Output of vertex shader ‘TexCoord1’ not read by fragment shader
-
core vout display error: Failed to set on top
-
if we’re in the real pre-commit handler we can’t actually add any new fences due to CA restriction
翻译:由于CA限购,如果我们在真实预提交处理下,不能添加任何新的围栏。
这个问题是xcode 编译器设置的问题,其实并不影响app使用:
参考:http://blog.csdn.net/ws1836300/article/details/52957056
你的demo可以更精致一点
- 可以把暂停、停止等按钮封装到 设置 drawable 的view中。
- App退到后台,或者跳转到另外一个界面时,可以暂停音乐。
- 快进和快退时,界面可以短暂提示 “快进xx秒”。
- 添加时间显示。
我的demo(左) & 别人的demo(右)
我的demo 就不献丑了,别人的demo 下载地址:
https://code.videolan.org/videolan/VLCKit
别人demo的教程:
Pocket:VLC集成与使用
http://www.jianshu.com/p/178627b085c3
以及别人 iOS VLC-音乐播放(列表式播放封装)教程
http://www.jianshu.com/p/5519aa0f59c7