Latest 2.1.3.1
Homepage https://github.com/pili-engineering/PLPlayerKit
License Apache License, Version 2.0
Platforms ios 7.0, requires ARC
Dependencies pili-librtmp
Frameworks UIKit, Foundation, CoreGraphics, MediaPlayer, CoreAudio, AudioToolbox, Accelerate, QuartzCore, OpenGLES, AVFoundation
Authors

PLPlayerKit

PLPlayerKit 是一个适用于 iOS 的音视频播放器 SDK,可高度定制化和二次开发,特色是支持 RTMP 和 HLS 直播流媒体播放。

功能特性

  • [x] RTMP 直播流播放
  • [x] HLS 播放
  • [x] 高可定制
  • [x] 音频后台播放
  • [x] RTMP 直播首屏秒开支持
  • [x] RTMP 直播累积延迟消除技术

内容摘要

快速开始

配置工程

  • 配置你的 Podfile 文件,添加如下配置信息
pod 'PLPlayerKit'
  • 安装 CocoaPods 依赖
pod update

or

pod install
  • Done! 运行你工程的 workspace

示例代码

在需要的地方添加

#import <PLPlayerKit/PLPlayer.h>

初始化 PLPlayerOption

// 初始化 PLPlayerOption 对象
PLPlayerOption *option = [PLPlayerOption defaultOption];

// 更改需要修改的 option 属性键所对应的值
[option setOptionValue:@15 forKey:PLPlayerOptionKeyTimeoutIntervalForMediaPackets];

初始化 PLPlayer

// 初始化 PLPlayer
self.player = [PLPlayer playerWithURL:self.URL option:option];

// 设定代理 (optional)
self.player.delegate = self;

获取播放器的视频输出的 UIView 对象并添加为到当前 UIView 对象的 Subview

//获取视频输出视图并添加为到当前 UIView 对象的 Subview
[self.view addSubview:player.playerView];

开始/暂停操作


// 播放
[self.player play];

// 停止
[self.player stop];

// 暂停
[self.player pause];

// 继续播放
[self.player resume];

播放器状态获取

// 实现 <PLPlayerDelegate> 来控制流状态的变更
- (void)player:(nonnull PLPlayer *)player statusDidChange:(PLPlayerStatus)state {
    // 这里会返回流的各种状态,你可以根据状态做 UI 定制及各类其他业务操作
    // 除了 Error 状态,其他状态都会回调这个方法
}

- (void)player:(nonnull PLPlayer *)player stoppedWithError:(nullable NSError *)error {
    // 当发生错误时,会回调这个方法
}

音频部分的特别说明

因为 iOS 的音频资源被设计为单例资源,所以如果在 player 中做的任何修改,对外都可能造成影响,并且带来不能预估的各种问题。

为了应对这一情况,PLPlayerKit 采取的方式是检查是否可以播放及是否可以进入后台,而在内部不做任何设置。具体是通过扩展 AVAudioSession 来做到的,提供了两个方法,如下:

/*!
 * @description 检查当前 AVAudioSession 的 category 配置是否可以播放音频. 当为 AVAudioSessionCategoryAmbient,
 * AVAudioSessionCategorySoloAmbient, AVAudioSessionCategoryPlayback, AVAudioSessionCategoryPlayAndRecord
 * 中的一种时为 YES, 否则为 NO.
 */
+ (BOOL)isPlayable;

/*!
 * @description 检查当前 AVAudioSession 的 category 配置是否可以后台播放. 当为 AVAudioSessionCategoryPlayback,
 * AVAudioSessionCategoryPlayAndRecord 中的一种时为 YES, 否则为 NO.
 */
+ (BOOL)canPlayInBackground;

分辨可以检查是否可以播放以及当前 category 的设置是否可以后台播放。

手动导入 SDK

我们建议使用 CocoaPods 导入,如果由于特殊原因需要手动导入,可以按照如下步骤进行:

  • 将 Pod 目录下的文件加入到工程中;
  • 在工程对应 TARGET 中,右侧 Tab 选择 "Build Phases",在 "Link Binary With Libraries" 中加入 CoreGraphics、 MediaPlayer、CoreAudio、AudioToolbox、Accelerate、QuartzCore、OpenGLES、AVFoundation 这些 framework,并加入 libc++.tdb、libz.tdb、libbz2.tbd 及 libiconv.tbd;
  • 在工程对应 TARGET 中,右侧 Tab 选择 "Build Settings",在 "Other Linker Flags" 中加入 "-ObjC" 选项;

版本历史

  • 2.1.3 (Release Notes && API Diffs)
    • 修复播放 OBS 及 FFmpeg 推的流黑屏的问题
    • 修复播放结束后无法重播的问题
    • 修复播放过程中内存暴增的问题
    • 拆分 pili-librtmp 为公共依赖,解决模拟器环境下与 PLStreamingKit 冲突的问题
  • 2.1.2 (Release Notes && API Diffs)
    • 增加确切的错误枚举,方便定位错误类型
    • 增加 mute, currentTime, totalDuration, seekTo 等接口
    • 修复首屏开启以及播放过程中出现缓存后网络恢复是可能出现的 UI 卡顿问题
    • 修复 contentMode 偶尔设置无效的问题
    • 修复重新设置播放 url 播放的问题
    • 修复快速 -stop 以及 -play 出现的内存泄露问题
  • 2.1.1 (Release Notes && API Diffs)
    • 首屏开启速度优化,在网络状况良好的情况下能实现秒开效果
    • 弱网情况下的累积延迟问题优化,较好控制累积延迟在数秒以内
    • 解决了上一版遇到的无法设置 playerView.contentMode 以及 playerOption 的问题
    • 解决了不标准流可能出现的音频断续,播放器内存异常增长问题
    • 后台播放体验优化,修复了后台播放被其他音频打断后出现的一系列问题
    • 解决了应用切换时出现的 UI 卡死问题
  • 2.1.0 (Release Notes && API Diffs)
    • 此次更新为重大版本升级,更改了大量 API 并重构了包括解码渲染在内的多项内容,建议所有用户进行升级,并且根据快速开始使用新版 API 对工程重新进行配置。
    • 更改了播放器的音频解码和渲染方式
    • 更改了播放器的时钟同步机制
    • 重构了内部逻辑,使播放器更稳定
    • 重构了播放器 API ,使播放器的使用更加简单明了,去除了使用起来不方便的部分 API
    • 解决了播放过程中可能出现声音消失的问题
    • 解决了退后台返回后音视频无法正常同步的问题
    • 修改播放器音视频同步机制
    • 解决持续播放过程中出现部分内存没有正确释放的问题
    • 解决了 iOS 版本小于 8.0 时 Demo 出现的crash问题
  • 2.0.4 (Release Notes && API Diffs)
    • 解决 RTMP 播放时可能黑屏的问题
  • 2.0.3 (Release Notes && API Diffs)
    • 解决 RTMP 播放没有声音
    • 解决 RTMP 无法播放导致内存急增最终 App crash
    • 解决 RTMP 无法播放画面只有声音
    • 解决播放 RTMP 时相关的 crash 问题
  • 2.0.2 (Release Notes && API Diffs)
    • 添加 RTMP Cache 机制
    • 添加数据超时属性
    • 修复 RTMP 播放内存 leak
    • 修复 RTMP 播放音频错误问题
    • 修复 RTMP 播放主线程卡死问题
    • 优化架构,减少内存和 cpu 占用
  • 2.0.1 (Release Notes && API Diffs)
    • 修复 contentMode 设置无效的问题
    • 修复 rtmp 无法播放或播放超时时无 error 抛出的问题
    • 修复 rtmp 播放失败时触发的 cpu 飙升问题
    • 修复 stop 可能触发的 crash 问题
    • 更新 demo 确保在 iOS 9.1 下运行正常
  • 2.0.0 (Release Notes && API Diffs)
    • 添加全新的 PLPlayer,弃用 PLVideoPlayerControllerPLAudioPlayerController
    • 播放 RTMP 音视频流时,进入后台后声音继续播放,不会断开,返回前台追帧显示最新视频帧
    • 针对 RTMP 直播彻底优化,首屏秒开,最小化缓存
    • 完全无 ffmpeg 依赖,包体积再次缩小
    • 优化资源占用,比 1.x 版本内存占用减少 50% 以上
  • 1.2.22 (Release Notes && API Diffs)
    • 修复因收到内存警告而引起的崩溃问题
    • 修复停止播放时,可能进入错误 play state 的问题
  • 1.2.21 (Release Notes && API Diffs)
    • 修复 PLVideoParameterFrameViewContentModePLVideoParameterDisableDeinterlacing 设置无效的问题
  • 1.2.20 (Release Notes && API Diffs)
    • 修复 seekTo: 不准确的问题
    • 添加 PLPlayerStateSeeking 类型
  • 1.2.19 (Release Notes && API Diffs)
    • 修复播放无返回状态的问题(针对无直播的流、hls 回放)
    • 修复 hls 回放结束时无 stopped 回调的问题
    • 修复 hls 回放开始的 duration 不为 0 的问题
  • 1.2.18 (Release Notes && API Diffs)
    • 修复在 prepare 状态前释放 player 导致的音频仍然会播放的问题
    • 修复 player 状态返回的类型不正确的问题
    • 优化推出时资源释放
  • 1.2.17 (Release Notes && API Diffs)
    • 修复超时时导致的崩溃的问题
  • 1.2.16 (Release Notes && API Diffs)
    • 添加了音频播放器后台播放的支持
    • 添加了音频播放器后台播放任务开始和结束的回调
    • 添加了音视频播放器超时时长的设定
    • 添加了音视频播放器准备的方法
    • 添加了音视频完全停止播放器的方法
    • 修复播放器不可释放的问题
  • 1.2.15 (Release Notes && API Diffs)
    • 修复 AudioPlayer 无法播放带有视频流的 RTMP 流的问题
  • 1.2.14 (Release Notes && API Diffs)
    • 添加 AudioManager
  • 1.2.13 (Release Notes && API Diffs)
    • 添加纯音频播放控件
    • 更新参数字段及类型,确保通用类型可以在音频及视频播放器使用
    • 更新类型名称,增加易读性,减少歧义
  • 1.2.12 (Release Notes && API Diffs)
    • 更改 repo 地址
  • 1.2.11 (Release Notes && API Diffs)
    • 添加对应用状态的判断,减少因进入后台通知延时未能及时暂停播放导致的 crash
  • 1.2.10 (Release Notes && API Diffs)
    • 添加音频外设更改时的通知
    • 添加音量变更时的通知
    • 添加打进电话等其他事件导致音频中断的通知
  • 1.2.9 (Release Notes && API Diffs)
    • 修复进入后台后崩溃的问题
    • 更新 example 中 player 代码,支持横竖屏旋转操作
  • 1.2.8 (Release Notes && API Diffs)
    • 添加播放进度回调方法
    • 修复 seekTo 后流状态不正确的问题
  • 1.2.7 (Release Notes && API Diffs)
    • 添加播放器状态属性
    • 添加解码器初始化完成后回调
    • 添加播放器状态回调
    • 添加初始化后自动播放参数
  • 1.2.6 (Release Notes && API Diffs)
    • 添加设置播放位置的操作
    • 添加了快进、快退的操作
    • 添加总播放时长的属性
    • 添加获取音量的属性
    • 添加获取当前播放位置的属性
    • 添加静音操作
  • 1.2.5 (Release Notes && API Diffs)
    • 修复与部分其他库头文件冲突的问题
  • 1.2.4 (Release Notes && API Diffs)
    • 添加了 PLMovieParameterFrameViewContentMode 参数
    • 修复与部分其他库头文件冲突的问题
    • 修复 Player contentMode 无法更改的问题
  • 1.2.3 (Release Notes && API Diffs)
    • 修复初始化占用主线程导致卡顿的问题
    • 修复错误回调无效的问题
  • 1.2.2 (Release Notes && API Diffs)
    • 修复 lib 未更新导致的 crash
  • 1.2.1 (Release Notes && API Diffs)
    • 添加 failue 情况下的回调,返回 NSError 对象
    • 移除 PLVideoPlayerViewController,请直接使用 PLVideoPlayerController 进行定制
  • 1.2.0 (Release Notes && API Diffs)
    • 极大缩小 lib 大小
    • 增加可定制的播放控件 PLVideoPlayerController
  • 1.1.2
    • 拆分 Flat lib
    • 添加了 x86_64 支持,便于在 iPhone 6 Plus 模拟器下调试使用
  • 1.1.1
    • 对库引用做了些修改
  • 1.1.0
    • 发布 CocoaPods 版本

Latest podspec

{
    "name": "PLPlayerKit_Beta",
    "version": "2.1.3.1",
    "summary": "Pili iOS video player SDK, RTMP, HLS video streaming supported.",
    "homepage": "https://github.com/pili-engineering/PLPlayerKit",
    "license": "Apache License, Version 2.0",
    "authors": {
        "hzwangsiyu": "[email protected]"
    },
    "source": {
        "git": "https://github.com/pili-engineering/PLPlayerKit.git",
        "branch": "Beta",
        "tag": "v2.1.3.1"
    },
    "platforms": {
        "ios": "7.0"
    },
    "requires_arc": true,
    "public_header_files": "Pod/Library/include/PLPlayerKit/*.h",
    "source_files": "Pod/Library/include/**/*.h",
    "dependencies": {
        "pili-librtmp": []
    },
    "frameworks": [
        "UIKit",
        "Foundation",
        "CoreGraphics",
        "MediaPlayer",
        "CoreAudio",
        "AudioToolbox",
        "Accelerate",
        "QuartzCore",
        "OpenGLES",
        "AVFoundation"
    ],
    "libraries": [
        "c++",
        "z",
        "bz2",
        "iconv"
    ],
    "default_subspecs": "precompiled",
    "subspecs": [
        {
            "name": "precompiled",
            "preserve_paths": [
                "Pod/Library/include/PLPlayerKit/*.h",
                "Pod/Library/lib/*.a"
            ],
            "vendored_libraries": "Pod/Library/lib/*.a",
            "xcconfig": {
                "HEADER_SEARCH_PATHS": "${PODS_ROOT}/PLPlayerKit_Beta/PLPlayerKit/lib/include"
            }
        }
    ]
}

Pin It on Pinterest

Share This