1. 默认不支持https的问题
使用默认的配置生成的.framework是不支持https播放链接的,如果要支持,需要重新编译ijk。(重新编译后为动态库,支持iOS8+)
// cd 到ijkplayer的文件夹
./init-ios-openssl.sh
./init-ios.sh
cd ./ios
./compile-openssl.sh clean
./compile-ffmpeg.sh clean
./compile-openssl.sh all
./compile-ffmpeg.sh all
编译完成后,打开IJKMediaPlayer
选中其中的IJKMediaFrameworkWithSSL
target,修改工程配置中的bitCode配置为NO。注意Release模式。
编译成功后即可得到支持https的framework。
2. 播放音视频后,再次回到前台会中断其他APP的后台音乐播放
这个问题的原因是ijkplayer代码中有个IJKAudioKit
是单例,会监听AVAudioSessionInterruptionNotification
通知,并修改AVAudioSession的Active. 我们要做的就是在shutDown播放器后,移除这个监听。
在IJKAudioKit.h
中添加方法
// fix: 进入前台后 打断其它APP播放的音乐
- (void)removeAudioSessionObserver;
IJKAudioKit.m
中添加
- (void)removeAudioSessionObserver {
if (!_audioSessionInitialized) {
return;
}
_audioSessionInitialized = NO;
[self setActive:NO];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:AVAudioSessionInterruptionNotification
object:[AVAudioSession sharedInstance]];
}
由于IJKAudioKit.h
这个头文件并未暴露在framework中,还需要修改IJKFFMoviePlayerController / IJKMPMoviePlayerController / IJKAVMoviePlayerController
的-(void)shutdown;方法中调用一次. 如:
- (void)shutdown
{
if (!_mediaPlayer)
return;
// 这里调用
[[IJKAudioKit sharedInstance] removeAudioSessionObserver];
[self stopHudTimer];
[self unregisterApplicationObservers];
[self setScreenOn:NO];
[self performSelectorInBackground:@selector(shutdownWaitStop:) withObject:self];
}
3. 播放视频时,每次seek后,进度条跳动,不能准确的从seek点开始播放
这个是精准seek的问题,据说是播放器默认会从seek点附近找到关键帧
,然后从关键帧开始播放,在初始化时配置下就可以解决了
IJKFFOptions *options = [IJKFFOptions optionsByDefault];
// 精准seek
[options setPlayerOptionIntValue:1 forKey:@"enable-accurate-seek"];
// 创建播放器
_playerController = [[IJKFFMoviePlayerController alloc] initWithContentURL:url withOptions:options];
4. 完整播放视频时,每次seek后,会重新缓冲
这是因为播放缓冲没有缓存在磁盘,其实FFmpeg
是支持边播边缓存在磁盘的,修改后可以做到,每次seek后,如果已经缓冲会立即播放,完整缓冲完毕后,重新播放可以不依赖网络
IJKFFOptions *options = [IJKFFOptions optionsByDefault];
NSURL *playURL = @"https://xxxx";
// 支持缓存
if (!playURL.isFileURL){
NSString *dir = [NSTemporaryDirectory() stringByAppendingPathComponent:@"ijk_caches_"];
dir = [dir stringByAppendingPathComponent:playURL.lastPathComponent];
[NSFileManager.defaultManager createDirectoryAtPath:dir withIntermediateDirectories:YES attributes:nil error:nil];
// 设置到options
[options setFormatOptionValue:[dir stringByAppendingPathComponent:@"file.tmp"] forKey:@"cache_file_path"];
[options setFormatOptionValue:[dir stringByAppendingPathComponent:@"map.tmp"] forKey:@"cache_map_path"];
[options setFormatOptionIntValue:1 forKey:@"parse_cache_map"];
[options setFormatOptionIntValue:1 forKey:@"auto_save_map"];
// 重新构造URL
NSString *urlstr = [NSString stringWithFormat:@"ijkio:cache:ffio:%@", playURL.absoluteString];
playURL = [NSURL URLWithString:urlstr];
}
// 创建播放器
_playerController = [[IJKFFMoviePlayerController alloc] initWithContentURL:url withOptions:options];
5. DNS缓存问题
项目中没遇到,网上看到的,为了防止出现问题,就也添加上了
IJKFFOptions *options = [IJKFFOptions optionsByDefault];
// 清除DNS缓存
[options setFormatOptionIntValue:1 forKey:@"dns_cache_clear"];
// 创建播放器
_playerController = [[IJKFFMoviePlayerController alloc] initWithContentURL:url withOptions:options];