wenweiwei 3 years ago
parent
commit
3f31fa3ed3
37 changed files with 2722 additions and 47 deletions
  1. 2 2
      BFFramework.podspec
  2. 1 2
      BFFramework/Classes/BFFramework_custom_umbrella.h
  3. 13 13
      BFFramework/Classes/Categorys/UIView+Ext.swift
  4. 1 1
      BFFramework/Classes/Enums/Enums.swift
  5. 4 1
      BFFramework/Classes/PModels/PQVideoListModel.swift
  6. 5 5
      BFFramework/Classes/PModels/editDarftModels/PQEditVisionTrackMaterialsModel.swift
  7. 4 4
      BFFramework/Classes/PQGPUImage/akfilters/PQImageFilter.swift
  8. 4 4
      BFFramework/Classes/Stuckpoint/Controller/PQStuckPointMaterialDetailController.swift
  9. 14 15
      BFFramework/Classes/Utils/PQCommonMethodUtil.swift
  10. 238 0
      BFFramework/Classes/Utils/PQSingletoVideoPlayer.swift
  11. 6 0
      Example/Pods/Local Podspecs/BFFramework.podspec.json
  12. 38 0
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXAudioCustomProcessDelegate.h
  13. 38 0
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXAudioRawDataDelegate.h
  14. 23 0
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXBitrateItem.h
  15. 27 0
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXImageSprite.h
  16. 49 0
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLiteAVBuffer.h
  17. 425 0
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLiteAVCode.h
  18. 54 0
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLiteAVEncodedDataProcessingListener.h
  19. 30 0
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLiteAVSDK.h
  20. 40 0
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLiveAudioSessionDelegate.h
  21. 75 0
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLiveBase.h
  22. 105 0
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLivePlayConfig.h
  23. 31 0
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLivePlayListener.h
  24. 372 0
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLivePlayer.h
  25. 27 0
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLiveRecordListener.h
  26. 36 0
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLiveRecordTypeDef.h
  27. 103 0
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLiveSDKEventDef.h
  28. 357 0
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLiveSDKTypeDef.h
  29. 41 0
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXPlayerAuthParams.h
  30. 51 0
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXVideoCustomProcessDelegate.h
  31. 172 0
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXVodDownloadManager.h
  32. 77 0
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXVodPlayConfig.h
  33. 41 0
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXVodPlayListener.h
  34. 214 0
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXVodPlayer.h
  35. BIN
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Info.plist
  36. 4 0
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Modules/module.modulemap
  37. BIN
      Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/TXLiteAVSDK_Player

+ 2 - 2
BFFramework.podspec

@@ -62,7 +62,7 @@ TODO: Add long description of the pod here.
     s.dependency 'FDFullscreenPopGesture' ,'1.1'
     s.dependency 'LMJHorizontalScrollText' ,'2.0.2'
     s.dependency 'Bugly','2.5.71' # 奔溃分析组件
+    s.dependency 'TXLiteAVSDK_Player','8.4.9944' # 腾讯播放器组件
     s.dependency "NXFramework-Swift"
-
-    # s.dependency 'KingfisherWebP','0.4.2' # 加载WebP格式图片库 使用https://github.com/webmproject/libwebp.git地址可以不翻
+    s.dependency 'KingfisherWebP','0.4.2' # 加载WebP格式图片库 使用https://github.com/webmproject/libwebp.git地址可以不翻
 end

+ 1 - 2
BFFramework/Classes/BFFramework_custom_umbrella.h

@@ -17,6 +17,5 @@
 #import "LMJHorizontalScrollText/LMJHorizontalScrollText.h"
 #import "FBShimmeringView.h"
 #import "UIControl+NXCategory.h"
-//#import <UMCommon/UMCommon.h>
-//#import <UMCommon/MobClick.h>
+#import <TXLiteAVSDK_Player/TXLiteAVSDK.h>
 #endif /* AliyunOSSiOS_Bridging_Header */

+ 13 - 13
BFFramework/Classes/Categorys/UIView+Ext.swift

@@ -6,7 +6,7 @@
 //  Copyright © 2020 BytesFlow. All rights reserved.
 //
 
-//import KingfisherWebP
+import KingfisherWebP
 import UIKit
 
 // MARK: - UIView的分类扩展
@@ -414,10 +414,10 @@ extension UIImageView {
             BFLog(message: "设置按钮网络图片地址为空")
             return
         }
-//        kf.setImage(with: URL(string: url!), placeholder: placeholder, options: url?.suffix(5) == ".webp" ? [.processor(WebPProcessor.default), .cacheSerializer(WebPSerializer.default)] : nil, progressBlock: { _, _ in
-//
-//        }) { _, _, _, _ in
-//        }
+        kf.setImage(with: URL(string: url!), placeholder: placeholder, options: url?.suffix(5) == ".webp" ? [.processor(WebPProcessor.default), .cacheSerializer(WebPSerializer.default)] : nil, progressBlock: { _, _ in
+
+        }) { _, _, _, _ in
+        }
     }
 
     /// 展示加载中动画
@@ -466,19 +466,19 @@ extension UIButton {
             BFLog(message: "设置按钮网络图片地址为空")
             return
         }
-//        kf.setImage(with: URL(string: url!), for: .normal, placeholder: placeholder, options: url?.suffix(5) == ".webp" ? [.processor(WebPProcessor.default), .cacheSerializer(WebPSerializer.default)] : nil, progressBlock: { _, _ in
-//
-//        }) { _, _, _, _ in
-//        }
+        kf.setImage(with: URL(string: url!), for: .normal, placeholder: placeholder, options: url?.suffix(5) == ".webp" ? [.processor(WebPProcessor.default), .cacheSerializer(WebPSerializer.default)] : nil, progressBlock: { _, _ in
+
+        }) { _, _, _, _ in
+        }
     }
 
     /// UIButton加载网络背景图片
     /// - Parameters:
     ///   - url: 网络url
      public func setNetBackgroundImage(url: String, placeholder: UIImage = UIImage(named: "placehold_image")!) {
-//        kf.setBackgroundImage(with: URL(string: url), for: .normal, placeholder: placeholder, options: url.suffix(5) == ".webp" ? [.processor(WebPProcessor.default), .cacheSerializer(WebPSerializer.default)] : nil, progressBlock: { _, _ in
-//
-//        }) { _, _, _, _ in
-//        }
+        kf.setBackgroundImage(with: URL(string: url), for: .normal, placeholder: placeholder, options: url.suffix(5) == ".webp" ? [.processor(WebPProcessor.default), .cacheSerializer(WebPSerializer.default)] : nil, progressBlock: { _, _ in
+
+        }) { _, _, _, _ in
+        }
     }
 }

+ 1 - 1
BFFramework/Classes/Enums/Enums.swift

@@ -28,7 +28,7 @@ enum PQVIDEOPAGETYPE {
 // MARK: - 视频播放状态
 
 /// 视频播放状态
-enum PQVIDEO_PLAY_STATUS {
+public enum PQVIDEO_PLAY_STATUS {
     case PQVIDEO_PLAY_STATUS_LOADING // 加载中
     case PQVIDEO_PLAY_STATUS_BEGIN // 开始播放
     case PQVIDEO_PLAY_STATUS_END // 播放结束

+ 4 - 1
BFFramework/Classes/PModels/PQVideoListModel.swift

@@ -126,8 +126,11 @@ public class PQVideoListModel: PQBaseModel {
     public var autoType: autoType? // autoType 自动动作的类型
     // add by ak 发布视频来源类型
     public var videoFromScene: videoFromScene = .UploadNormal
+    
+    //视频的分类
+    public var categoryName:String = ""
 
-    override init(jsonDict: [String: Any]) {
+    override public init(jsonDict: [String: Any]) {
         super.init(jsonDict: jsonDict)
 
         if jsonDict.keys.contains("videoPath") {

+ 5 - 5
BFFramework/Classes/PModels/editDarftModels/PQEditVisionTrackMaterialsModel.swift

@@ -13,7 +13,7 @@
 
 import Foundation
 import Kingfisher
-//import KingfisherWebP
+import KingfisherWebP
 import Photos
 
 import ObjectMapper
@@ -246,10 +246,10 @@ class PQEditVisionTrackMaterialsModel: PQEditBaseModel {
                 if fileIsExists(filePath: documensDirectory + locationPath) {
                     fileData = try! Data(contentsOf: URL(fileURLWithPath: documensDirectory + locationPath))
                 }
-//                if fileData != nil && (fileData?.count ?? 0) > 0 && fileData?.isWebPFormat ?? false {
-//                    BFLog(message: "这个资源为web!")
-//                    coverImage = WebPProcessor.default.process(item: ImageProcessItem.data(fileData!), options: [.onlyLoadFirstFrame, .scaleFactor(1)])
-//                }
+                if fileData != nil && (fileData?.count ?? 0) > 0 && fileData?.isWebPFormat ?? false {
+                    BFLog(message: "这个资源为web!")
+                    coverImage = WebPProcessor.default.process(item: ImageProcessItem.data(fileData!), options: [.onlyLoadFirstFrame, .scaleFactor(1)])
+                }
             }
 
             return coverImage

+ 4 - 4
BFFramework/Classes/PQGPUImage/akfilters/PQImageFilter.swift

@@ -8,7 +8,7 @@
 
 import Foundation
 import Kingfisher
-//import KingfisherWebP
+import KingfisherWebP
 import UIKit
 
 open class PQImageFilter: PQBaseFilter {
@@ -63,9 +63,9 @@ open class PQImageFilter: PQBaseFilter {
                 if FileManager.default.fileExists(atPath: filePath) {
                     // 有可能是 WEBP
                     let fileData: Data = try! Data(contentsOf: URL(fileURLWithPath: filePath))
-//                    if fileData.count != 0, fileData.isWebPFormat {
-//                        newImage = WebPProcessor.default.process(item: ImageProcessItem.data(fileData), options: [.onlyLoadFirstFrame, .scaleFactor(1)])
-//                    }
+                    if fileData.count != 0, fileData.isWebPFormat {
+                        newImage = WebPProcessor.default.process(item: ImageProcessItem.data(fileData), options: [.onlyLoadFirstFrame, .scaleFactor(1)])
+                    }
                 } else { FilterLog(message: "文件不存在") }
             }
         }

+ 4 - 4
BFFramework/Classes/Stuckpoint/Controller/PQStuckPointMaterialDetailController.swift

@@ -7,7 +7,7 @@
 //
 
 import Kingfisher
-//import KingfisherWebP
+import KingfisherWebP
 import UIKit
 
 class PQStuckPointMaterialDetailController: PQBaseViewController {
@@ -228,9 +228,9 @@ class PQStuckPointMaterialDetailController: PQBaseViewController {
                 if coverImage == nil {
                     // 有可能是 WEBP
                     let fileData: Data = try! Data(contentsOf: URL(fileURLWithPath: documensDirectory + (materialData?.locationPath)!))
-//                    if fileData.count != 0, fileData.isWebPFormat {
-//                        coverImage = WebPProcessor.default.process(item: ImageProcessItem.data(fileData), options: [.onlyLoadFirstFrame, .scaleFactor(1)])
-//                    }
+                    if fileData.count != 0, fileData.isWebPFormat {
+                        coverImage = WebPProcessor.default.process(item: ImageProcessItem.data(fileData), options: [.onlyLoadFirstFrame, .scaleFactor(1)])
+                    }
                 }
                 preImageView.image = coverImage
                 materialData?.coverImageUI = coverImage

+ 14 - 15
BFFramework/Classes/Utils/PQCommonMethodUtil.swift

@@ -11,8 +11,7 @@ import Alamofire
 import Foundation
 import KeychainAccess
 import Kingfisher
-//import KingfisherWebP
-//import NXFramework_Swift
+import KingfisherWebP
 import Photos
 import RealmSwift
 import Toast_Swift
@@ -99,17 +98,17 @@ public func cIPHONE_X() -> Bool {
 ///   - url: 网络url
 ///   - mainView: 需要加载的视图
 public func netImage(url: String, mainView: Any, placeholder: UIImage = UIImage(named: "placehold_image")!) {
-//    if mainView is UIImageView {
-//        (mainView as! UIImageView).kf.setImage(with: URL(string: url), placeholder: placeholder, options: url.suffix(5) == ".webp" ? [.processor(WebPProcessor.default), .cacheSerializer(WebPSerializer.default)] : nil, progressBlock: { _, _ in
-//
-//        }) { _, _, _, _ in
-//        }
-//    } else if mainView is UIButton {
-//        (mainView as! UIButton).kf.setImage(with: URL(string: url), for: .normal, placeholder: placeholder, options: url.suffix(5) == ".webp" ? [.processor(WebPProcessor.default), .cacheSerializer(WebPSerializer.default)] : nil, progressBlock: { _, _ in
-//
-//        }) { _, _, _, _ in
-//        }
-//    }
+    if mainView is UIImageView {
+        (mainView as! UIImageView).kf.setImage(with: URL(string: url), placeholder: placeholder, options: url.suffix(5) == ".webp" ? [.processor(WebPProcessor.default), .cacheSerializer(WebPSerializer.default)] : nil, progressBlock: { _, _ in
+
+        }) { _, _, _, _ in
+        }
+    } else if mainView is UIButton {
+        (mainView as! UIButton).kf.setImage(with: URL(string: url), for: .normal, placeholder: placeholder, options: url.suffix(5) == ".webp" ? [.processor(WebPProcessor.default), .cacheSerializer(WebPSerializer.default)] : nil, progressBlock: { _, _ in
+
+        }) { _, _, _, _ in
+        }
+    }
 }
 
 /** 获取Kingfisher缓存的图片的data */
@@ -150,8 +149,8 @@ public func commonParams() -> [String: Any] {
         "versionCode": versionCode,
         "system": systemName + " " + systemVersion,
         "systemVersion": systemName + " " + systemVersion,
-        "appType": "13",
-        "appId": "1509463838",
+        "appType": "15",
+        "appId": "1570572849",
         "machineCode": getMachineCode(),
         "networkType": networkStatus(),
         "ipAddress": ipAddress(),

+ 238 - 0
BFFramework/Classes/Utils/PQSingletoVideoPlayer.swift

@@ -0,0 +1,238 @@
+
+//
+//  PQVideoPlayer.swift
+//  PQSpeed
+//
+//  Created by SanW on 2020/6/3.
+//  Copyright © 2020 BytesFlow. All rights reserved.
+//
+
+import UIKit
+
+public class PQSingletoVideoPlayer: NSObject {
+    static public let shared = PQSingletoVideoPlayer()
+    public var isPlayEnd: Bool = false // 是否已播放完成
+    var isRealPlay: Bool = false // 是否已真实播放
+    var isSemiRealPlay: Bool = false // 是否已播放到十秒
+    var isPlayBegin: Bool = false // 是否已缓冲完成开始播放
+    var isFirstFrame: Bool = false // 是否已显示第一帧加载完成
+    var isPlayerError: Bool = false // 是否播放失败
+    var loadingTime: TimeInterval = 0 // 加载时长
+
+    var playId: String = getUniqueId(desc: "playId") // 播放ID
+    /// 进度回调
+    var progressBloc: ((_ loadProgress: Float, _ playProgress: Float, _ duration: Float) -> Void)?
+    /// 播放状态回调
+    public var playStatusBloc: ((_ playStatus: PQVIDEO_PLAY_STATUS) -> Void)?
+    public var playControllerView: UIView?
+    public var playVideoData: PQVideoListModel?
+
+    lazy public var player: TXVodPlayer = {
+        let player = TXVodPlayer()
+        let config = TXVodPlayConfig()
+        config.cacheFolderPath = videoCacheDirectory
+        config.maxCacheItems = 5
+        player.config = config
+        player.vodDelegate = self
+        player.setRenderMode(.RENDER_MODE_FILL_EDGE)
+        return player
+    }()
+
+    public func configPlyer(videoData: PQVideoListModel, controllerView: UIView) {
+        isPlayEnd = false
+        isRealPlay = false
+        isSemiRealPlay = false
+        isPlayBegin = false
+        isFirstFrame = false
+        isPlayerError = false
+        loadingTime = Date().timeIntervalSince1970 * 1000
+
+        player.stopPlay()
+        player.removeVideoWidget()
+
+        player.setupVideoWidget(controllerView, insert: 0)
+        player.enableHWAcceleration = true
+        playControllerView = controllerView
+        playVideoData = videoData
+        if playVideoData!.playProgress >= 0.0 {
+            //
+            var progress: CGFloat = playVideoData!.playProgress
+            if progress > 5.0, progress < 20 {
+                progress = progress - 5.0
+                if progress <= 0 {
+                    progress = 0
+                }
+            }
+            BFLog(message: "xxx.playProgress =\(playVideoData!.playProgress),\(progress)")
+            player.setStartTime(progress)
+        }
+        playId = getUniqueId(desc: "playId")
+        BFLog(message: "\(String(describing: videoData.title)) 开始播放 \(videoData.videoPath ?? "")")
+        player.startPlay(videoData.videoPath)
+         
+        if PQSingletoMemoryUtil.shared.playCount < 4 {
+            PQSingletoMemoryUtil.shared.playCount = PQSingletoMemoryUtil.shared.playCount + 1
+        }
+    }
+
+    func resetPlayer() {
+        if (playControllerView != nil) {
+            player.removeVideoWidget()
+            player.setupVideoWidget(playControllerView, insert: 0)
+            if playVideoData!.playProgress >= 0.0 {
+                //
+                var progress: CGFloat = playVideoData!.playProgress
+                if progress > 5.0, progress < 20 {
+                    progress = progress - 5.0
+                    if progress <= 0 {
+                        progress = 0
+                    }
+                }
+                BFLog(message: "xxx.playProgress =\(playVideoData!.playProgress),\(progress)")
+                player.setStartTime(progress)
+            }
+            playId = getUniqueId(desc: "playId")
+            player.startPlay(playVideoData!.videoPath)
+           
+        }
+    }
+
+    public func stopPlayer(isRemove: Bool = true) {
+        player.stopPlay()
+        if isRemove {
+            player.removeVideoWidget()
+            playControllerView = nil
+            playVideoData = nil
+        }
+    }
+
+    override private init() {
+        super.init()
+    }
+
+    override public func copy() -> Any {
+        return self
+    }
+
+    override public func mutableCopy() -> Any {
+        return self
+    }
+}
+
+extension PQSingletoVideoPlayer: TXVodPlayListener {
+    /// 播放进度回调
+    /// - Parameters:
+    ///   - player: <#player description#>
+    ///   - EvtID: <#EvtID description#>
+    ///   - param: <#param description#>
+    public func onPlayEvent(_ player: TXVodPlayer!, event EvtID: Int32, withParam param: [AnyHashable: Any]!) {
+        switch EvtID {
+        case PLAY_EVT_PLAY_PROGRESS.rawValue: // 播放进度
+            // 加载进度, 单位是秒
+            let loadProgress: Float = param[EVT_PLAYABLE_DURATION] as! Float
+            // 播放进度, 单位是秒
+            let playProgress: Float = param[EVT_PLAY_PROGRESS] as! Float
+            // 总长度, 单位是秒
+            let duration: Float = param[EVT_PLAY_DURATION] as! Float
+            if player.currentPlaybackTime() >= 10.0, player.currentPlaybackTime() <= 10.1 {
+                // 10.0上报
+                if !isSemiRealPlay, playVideoData != nil {
+                    isSemiRealPlay = true
+                    // 播放上报
+                    PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Action, videoData: playVideoData, pageSource: nil, businessType: .bt_videoSemiRealPlay, objectType: nil, extParams: nil, shareId: nil, videoIds: nil, playId: playId)
+                }
+            }
+            if player.currentPlaybackTime() >= 20.0 || ((playProgress / duration) >= 0.3) {
+                // 视频播放到20s或播放到总时长30%,哪个先到为准
+                if !isRealPlay, playVideoData != nil {
+                    isRealPlay = true
+                    // 播放上报
+                    PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_realPlay, videoData: playVideoData, pageSource: nil, businessType: .bt_videoRealPlay, objectType: nil, extParams: nil, shareId: nil, videoIds: nil, playId: playId)
+                }
+            }
+            if progressBloc != nil {
+                progressBloc!(loadProgress, playProgress, duration)
+            }
+        case PLAY_EVT_RCV_FIRST_I_FRAME.rawValue:
+            // 首帧完成开始播放
+            if !isPlayBegin, playVideoData != nil {
+                isPlayBegin = true
+                // 播放上报
+                PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Action, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlaySuccess, objectType: nil, extParams: nil, shareId: nil, videoIds: nil, playId: playId)
+            }
+
+        case PLAY_EVT_PLAY_LOADING.rawValue: // 视频播放loading
+            if playStatusBloc != nil {
+                playStatusBloc!(.PQVIDEO_PLAY_STATUS_LOADING)
+            }
+        case PLAY_EVT_PLAY_BEGIN.rawValue: // 开始播放
+            if playStatusBloc != nil {
+                playStatusBloc!(.PQVIDEO_PLAY_STATUS_BEGIN)
+            }
+            // 首帧加载完成
+            if !isFirstFrame, playVideoData != nil {
+                isFirstFrame = true
+                // 播放上报
+                PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_play, videoData: playVideoData, pageSource: nil, businessType: nil, objectType: nil, extParams: nil, shareId: nil, videoIds: nil, playId: playId)
+                let duration = Int((Date().timeIntervalSince1970 * 1000) - loadingTime)
+                BFLog(message: "加载时长:\(duration)")
+                // 加载时间上报
+                PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Frontend, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlaySuccessTime, objectType: nil, extParams: ["duration": duration, "proxyEnable": "0", "url": playVideoData?.videoPath ?? "", "videoId": playVideoData?.uniqueId ?? "0"], shareId: nil, videoIds: nil, playId: playId)
+            }
+            BFLog(message: "首帧加载完成")
+        case PLAY_EVT_PLAY_END.rawValue: // 播放结束
+            player.pause()
+            playId = getUniqueId(desc: "playId")
+            if playStatusBloc != nil {
+                playStatusBloc!(.PQVIDEO_PLAY_STATUS_END)
+            }
+            if !isPlayEnd, playVideoData != nil {
+                isPlayEnd = true
+                // 播放结束上报
+                PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Action, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlayEnd, objectType: nil, extParams: nil, shareId: nil, videoIds: nil, playId: playId)
+            }
+        case PLAY_ERR_NET_DISCONNECT.rawValue: // 重连失败
+            if playStatusBloc != nil {
+                playStatusBloc!(.PQVIDEO_PLAY_STATUS_DISCONNECT)
+            }
+            if !isPlayerError, playVideoData != nil {
+                isPlayerError = true
+                // 播放失败
+                PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Frontend, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlayError, objectType: nil, extParams: ["pageSource": playVideoData!.pageSource.rawValue, "networkType": networkStatus(), "extra": "0", "hasRetry": true, "url": playVideoData?.videoPath ?? "", "videoId": playVideoData?.uniqueId ?? "0", "what": EvtID], shareId: nil, videoIds: nil, playId: playId)
+            }
+        case PLAY_ERR_FILE_NOT_FOUND.rawValue: // 播放文件不存在
+            if playStatusBloc != nil {
+                playStatusBloc!(.PQVIDEO_PLAY_STATUS_NOT_FOUND)
+            }
+            if !isPlayerError, playVideoData != nil {
+                isPlayerError = true
+                // 播放失败
+                PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Frontend, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlayError, objectType: nil, extParams: ["pageSource": playVideoData!.pageSource.rawValue, "networkType": networkStatus(), "extra": "0", "hasRetry": false, "url": playVideoData?.videoPath ?? "", "videoId": playVideoData?.uniqueId ?? "0", "what": EvtID], shareId: nil, videoIds: nil, playId: playId)
+            }
+        case PLAY_ERR_HEVC_DECODE_FAIL.rawValue, PLAY_ERR_HLS_KEY.rawValue, PLAY_ERR_GET_PLAYINFO_FAIL.rawValue, PLAY_WARNING_VIDEO_DECODE_FAIL.rawValue, PLAY_WARNING_AUDIO_DECODE_FAIL.rawValue: // H265解码失败,HLS解码key获取失败,获取点播文件信息失败,当前视频解码失败,当前音频解码失败
+
+            if !isPlayerError, playVideoData != nil {
+                isPlayerError = true
+                // 播放失败
+                PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Frontend, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlayError, objectType: nil, extParams: ["pageSource": playVideoData!.pageSource.rawValue, "networkType": networkStatus(), "extra": "0", "hasRetry": false, "url": playVideoData?.videoPath ?? "", "videoId": playVideoData?.uniqueId ?? "0", "what": EvtID], shareId: nil, videoIds: nil, playId: playId)
+            }
+        case PLAY_WARNING_RECONNECT.rawValue: // 断线重连已启动重新连接
+            if playStatusBloc != nil {
+                playStatusBloc!(.PQVIDEO_PLAY_STATUS_RECONNECT)
+            }
+        case PLAY_WARNING_RECV_DATA_LAG.rawValue, PLAY_WARNING_VIDEO_PLAY_LAG.rawValue: // 网络来包不稳:可能是下行带宽不足 | 当前视频播放出现卡顿(用户直观感受)
+            // 播放失败
+            PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Frontend, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlaySlow, objectType: nil, extParams: ["pageSource": playVideoData!.pageSource.rawValue, "networkType": networkStatus(), "url": playVideoData?.videoPath ?? "", "videoId": playVideoData?.uniqueId ?? "0", "what": EvtID, "position": player.currentPlaybackTime()], shareId: nil, videoIds: nil, playId: playId)
+        default:
+            break
+        }
+    }
+
+    /// 网络状态回调
+    /// - Parameters:
+    ///   - player: <#player description#>
+    ///   - param: <#param description#>
+    public func onNetStatus(_: TXVodPlayer!, withParam _: [AnyHashable: Any]!) {
+        // BFLog(message: "onNetStatus:\(param)")
+    }
+}

+ 6 - 0
Example/Pods/Local Podspecs/BFFramework.podspec.json

@@ -82,8 +82,14 @@
     "Bugly": [
       "2.5.71"
     ],
+    "TXLiteAVSDK_Player": [
+      "8.4.9944"
+    ],
     "NXFramework-Swift": [
 
+    ],
+    "KingfisherWebP": [
+      "0.4.2"
     ]
   },
   "swift_version": "5.0"

+ 38 - 0
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXAudioCustomProcessDelegate.h

@@ -0,0 +1,38 @@
+//
+//  TXAudioCustomProcessDelegate.h
+//  TXLiteAVSDK
+//
+//  Created by realingzhou on 2018/1/15.
+//  Copyright © 2018年 Tencent. All rights reserved.
+//
+
+#ifndef TXAudioCustomProcessDelegate_h
+#define TXAudioCustomProcessDelegate_h
+#import <Foundation/Foundation.h>
+
+@protocol TXAudioCustomProcessDelegate <NSObject>
+
+/**
+ * 原始声音的回调
+ * @param data pcm数据
+ * @param timeStamp 时间戳
+ * @param sampleRate 采样率
+ * @param channels 声道数
+ * @param withBgm 回调的数据是否包含bgm,当不开启回声消除时,回调的raw pcm会包含bgm
+ */
+@optional
+- (void)onRecordRawPcmData:(NSData *)data timeStamp:(unsigned long long)timeStamp sampleRate:(int)sampleRate channels:(int)channels withBgm:(BOOL)withBgm;
+
+/**
+ * 经过特效处理的声音回调
+ * @param data pcm数据
+ * @param timeStamp 时间戳
+ * @param sampleRate 采样率
+ * @param channels 声道数
+ */
+@optional
+- (void)onRecordPcmData:(NSData *)data timeStamp:(unsigned long long)timeStamp sampleRate:(int)sampleRate channels:(int)channels;
+
+@end
+
+#endif /* TXAudioCustomProcessDelegate_h */

+ 38 - 0
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXAudioRawDataDelegate.h

@@ -0,0 +1,38 @@
+//
+//  TXAudioRawDataDelegate.h
+//  TXLiteAVSDK
+//
+//  Created by realingzhou on 2018/2/24.
+//  Copyright © 2018年 Tencent. All rights reserved.
+//
+
+#ifndef TXAudioRawDataDelegate_h
+#define TXAudioRawDataDelegate_h
+
+@protocol TXAudioRawDataDelegate <NSObject>
+
+/**
+ * 音频播放信息回调
+ *
+ * @param sampleRate 采样率
+ * @param channels 声道数
+ */
+@optional
+- (void)onAudioInfoChanged:(int)sampleRate channels:(int)channels;
+
+/**
+ * 音频播放数据回调,数据格式 :PCM
+ *
+ * <!!!注意!!!> 该函数内不要做耗时操作<!!!注意!!!>
+ * 音频播放器会在播放数据的前一刻,调用此函数,同步回调将要播放的数据。因此在函数内部做耗时操作可能会影响播放
+ *
+ *
+ * @param data         pcm数据
+ * @param timestamp    时间戳。注 :会有连续相同的时间戳回调出来,超过2048字节,时间戳才会变化。
+ */
+@optional
+- (void)onPcmDataAvailable:(NSData *)data pts:(unsigned long long)timestamp;
+
+@end
+
+#endif /* TXAudioRawDataDelegate_h */

+ 23 - 0
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXBitrateItem.h

@@ -0,0 +1,23 @@
+//
+//  TXBitrateItem.h
+//  TXLiteAVSDK
+//
+//  Created by annidyfeng on 2017/11/15.
+//  Copyright © 2017年 Tencent. All rights reserved.
+//
+
+#ifndef TXBitrateItem_h
+#define TXBitrateItem_h
+
+/// @addtogroup TXVodPlayConfig_ios
+/// @{
+
+/// HLS多码率信息
+@interface TXBitrateItem : NSObject
+@property (nonatomic, assign) NSInteger index;   ///< m3u8 文件中的序号
+@property (nonatomic, assign) NSInteger width;   ///< 此流的视频宽度
+@property (nonatomic, assign) NSInteger height;  ///< 此流的视频高度
+@property (nonatomic, assign) NSInteger bitrate; ///< 此流的视频码率
+@end
+/// @}
+#endif /* TXBitrateItem_h */

+ 27 - 0
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXImageSprite.h

@@ -0,0 +1,27 @@
+//
+//  TXImageSprite.h
+//  TXLiteAVSDK
+//
+//  Created by annidyfeng on 2018/8/23.
+//  Copyright © 2018年 Tencent. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+
+/// 雪碧图解析工具
+@interface TXImageSprite : NSObject
+/**
+ * 设置雪碧图地址
+ * @param vttUrl VTT链接
+ * @param images 雪碧图大图列表
+ */
+- (void)setVTTUrl:(NSURL *)vttUrl imageUrls:(NSArray<NSURL *> *)images;
+
+/**
+ * 获取缩略图
+ * @param time 时间点,单位秒
+ * @return 获取失败返回nil
+ */
+- (UIImage *)getThumbnail:(GLfloat)time;
+@end

+ 49 - 0
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLiteAVBuffer.h

@@ -0,0 +1,49 @@
+
+
+#ifndef TXLiteAVBuffer_h
+#define TXLiteAVBuffer_h
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+namespace liteav {
+
+/**
+ * Buffer 数据类型
+ */
+class TXLiteAVBuffer {
+
+public:
+    virtual ~TXLiteAVBuffer() {}
+    
+    /**
+     * 获取 buffer 的内存地址
+     */
+    virtual uint8_t * data() = 0;
+
+    /**
+     * 获取 buffer 的内存地址
+     */
+    virtual const uint8_t * cdata() const = 0;
+
+    /**
+     * 获取 buffer 的内存size
+     */
+    virtual size_t size() const = 0;
+    
+    /**
+     * 设置 buffe 的有效数据 size
+     * 如果此 size 超过当前 capacity,会造成重新分配内存,并复制数据
+     */
+    virtual void SetSize(size_t size) = 0;
+    
+    /**
+     * 确保 buffer 分配的内存空间足够,不用多次分配拷贝内存。此方法会引起内存分配,data / cdata 方法获取的指针失效
+     * @param capacity buffer 预分配的内存size
+     */
+    virtual void EnsureCapacity(size_t capacity) = 0;
+};
+}
+
+#endif /* TXLiteAVBuffer_h */

+ 425 - 0
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLiteAVCode.h

@@ -0,0 +1,425 @@
+#ifndef __TXLITEAVCODE_H__
+#define __TXLITEAVCODE_H__
+
+/////////////////////////////////////////////////////////////////////////////////
+//
+//                     错误码
+//
+/////////////////////////////////////////////////////////////////////////////////
+
+typedef enum TXLiteAVError
+{
+    /////////////////////////////////////////////////////////////////////////////////
+    //
+    //       基础错误码
+    //
+    /////////////////////////////////////////////////////////////////////////////////
+    ERR_NULL                                        = 0,        ///< 无错误
+
+    /////////////////////////////////////////////////////////////////////////////////
+    //
+    //       进房(enterRoom)相关错误码
+    //       NOTE: 通过回调函数 TRTCCloudDelegate##onEnterRoom() 和 TRTCCloudDelegate##OnError() 通知
+    //
+    /////////////////////////////////////////////////////////////////////////////////
+    ERR_ROOM_ENTER_FAIL                             = -3301,    ///< 进入房间失败
+    ERR_ENTER_ROOM_PARAM_NULL                       = -3316,    ///< 进房参数为空,请检查 enterRoom:appScene: 接口调用是否传入有效的 param
+    ERR_SDK_APPID_INVALID                           = -3317,    ///< 进房参数 sdkAppId 错误
+    ERR_ROOM_ID_INVALID                             = -3318,    ///< 进房参数 roomId 错误
+    ERR_USER_ID_INVALID                             = -3319,    ///< 进房参数 userID 不正确
+    ERR_USER_SIG_INVALID                            = -3320,    ///< 进房参数 userSig 不正确
+    ERR_ROOM_REQUEST_ENTER_ROOM_TIMEOUT             = -3308,    ///< 请求进房超时,请检查网络
+    ERR_SERVER_INFO_SERVICE_SUSPENDED               = -100013,  ///< 服务不可用。请检查:套餐包剩余分钟数是否大于0,腾讯云账号是否欠费
+
+
+    /////////////////////////////////////////////////////////////////////////////////
+    //
+    //       退房(exitRoom)相关错误码
+    //       NOTE: 通过回调函数 TRTCCloudDelegate##OnError() 通知
+    //
+    /////////////////////////////////////////////////////////////////////////////////
+    ERR_ROOM_REQUEST_QUIT_ROOM_TIMEOUT              = -3325,    ///< 请求退房超时
+
+
+    /////////////////////////////////////////////////////////////////////////////////
+    //
+    //       设备(摄像头、麦克风、扬声器)相关错误码
+    //       NOTE: 通过回调函数 TRTCCloudDelegate##OnError() 通知
+    //             区段:-6000 ~ -6999
+    //
+    /////////////////////////////////////////////////////////////////////////////////
+    ERR_CAMERA_START_FAIL                           = -1301,    ///< 打开摄像头失败,例如在 Windows 或 Mac 设备,摄像头的配置程序(驱动程序)异常,禁用后重新启用设备,或者重启机器,或者更新配置程序
+    ERR_CAMERA_NOT_AUTHORIZED                       = -1314,    ///< 摄像头设备未授权,通常在移动设备出现,可能是权限被用户拒绝了
+    ERR_CAMERA_SET_PARAM_FAIL                       = -1315,    ///< 摄像头参数设置出错(参数不支持或其它)
+    ERR_CAMERA_OCCUPY                               = -1316,    ///< 摄像头正在被占用中,可尝试打开其他摄像头
+    ERR_MIC_START_FAIL                              = -1302,    ///< 打开麦克风失败,例如在 Windows 或 Mac 设备,麦克风的配置程序(驱动程序)异常,禁用后重新启用设备,或者重启机器,或者更新配置程序
+    ERR_MIC_NOT_AUTHORIZED                          = -1317,    ///< 麦克风设备未授权,通常在移动设备出现,可能是权限被用户拒绝了
+    ERR_MIC_SET_PARAM_FAIL                          = -1318,    ///< 麦克风设置参数失败
+    ERR_MIC_OCCUPY                                  = -1319,    ///< 麦克风正在被占用中,例如移动设备正在通话时,打开麦克风会失败
+    ERR_MIC_STOP_FAIL                               = -1320,    ///< 停止麦克风失败
+    ERR_SPEAKER_START_FAIL                          = -1321,    ///< 打开扬声器失败,例如在 Windows 或 Mac 设备,扬声器的配置程序(驱动程序)异常,禁用后重新启用设备,或者重启机器,或者更新配置程序
+    ERR_SPEAKER_SET_PARAM_FAIL                      = -1322,    ///< 扬声器设置参数失败
+    ERR_SPEAKER_STOP_FAIL                           = -1323,    ///< 停止扬声器失败
+    
+    /////////////////////////////////////////////////////////////////////////////////
+    //
+    //       系统声音采集相关错误码
+    //       NOTE: 通过回调函数 TRTCCloudDelegate##onSystemAudioLoopbackError() 通知
+    //
+    /////////////////////////////////////////////////////////////////////////////////
+    ERR_AUDIO_PLUGIN_START_FAIL                     = -1330,    ///< 开启系统声音录制失败,例如音频驱动插件不可用
+    ERR_AUDIO_PLUGIN_INSTALL_NOT_AUTHORIZED         = -1331,    ///< 安装音频驱动插件未授权
+    ERR_AUDIO_PLUGIN_INSTALL_FAILED                 = -1332,    ///< 安装音频驱动插件失败
+
+    /////////////////////////////////////////////////////////////////////////////////
+    //
+    //       屏幕分享相关错误码
+    //       NOTE: 通过回调函数 TRTCCloudDelegate##OnError() 通知
+    //
+    /////////////////////////////////////////////////////////////////////////////////
+    ERR_SCREEN_CAPTURE_START_FAIL                   = -1308,    ///< 开始录屏失败,如果在移动设备出现,可能是权限被用户拒绝了,如果在 Windows 或 Mac 系统的设备出现,请检查录屏接口的参数是否符合要求
+    ERR_SCREEN_CAPTURE_UNSURPORT                    = -1309,    ///< 录屏失败,在 Android 平台,需要5.0以上的系统,在 iOS 平台,需要11.0以上的系统
+    ERR_SERVER_CENTER_NO_PRIVILEDGE_PUSH_SUB_VIDEO  = -102015,  ///< 没有权限上行辅路
+    ERR_SERVER_CENTER_ANOTHER_USER_PUSH_SUB_VIDEO   = -102016,  ///< 其他用户正在上行辅路
+    ERR_SCREEN_CAPTURE_STOPPED                      = -7001,    ///< 录屏被系统中止
+
+    /////////////////////////////////////////////////////////////////////////////////
+    //
+    //       编解码相关错误码
+    //       NOTE: 通过回调函数 TRTCCloudDelegate##OnError() 通知
+    //
+    /////////////////////////////////////////////////////////////////////////////////
+    ERR_VIDEO_ENCODE_FAIL                           = -1303,    ///< 视频帧编码失败,例如 iOS 设备切换到其他应用时,硬编码器可能被系统释放,再切换回来时,硬编码器重启前,可能会抛出
+    ERR_UNSUPPORTED_RESOLUTION                      = -1305,    ///< 不支持的视频分辨率
+    ERR_AUDIO_ENCODE_FAIL                           = -1304,    ///< 音频帧编码失败,例如传入自定义音频数据,SDK 无法处理
+    ERR_UNSUPPORTED_SAMPLERATE                      = -1306,    ///< 不支持的音频采样率
+
+    /////////////////////////////////////////////////////////////////////////////////
+    //
+    //       自定义采集相关错误码
+    //       NOTE: 通过回调函数 TRTCCloudDelegate##OnError() 通知
+    //
+    /////////////////////////////////////////////////////////////////////////////////
+    ERR_PIXEL_FORMAT_UNSUPPORTED                    = -1327,    ///< 设置的 pixel format 不支持
+    ERR_BUFFER_TYPE_UNSUPPORTED                     = -1328,    ///< 设置的 buffer type 不支持
+
+
+    /////////////////////////////////////////////////////////////////////////////////
+    //
+    //       CDN 绑定和混流相关错误码
+    //       NOTE: 通过回调函数 TRTCCloudDelegate##onStartPublishing() 和  TRTCCloudDelegate##onSetMixTranscodingConfig 通知。
+    //
+    /////////////////////////////////////////////////////////////////////////////////
+    ERR_PUBLISH_CDN_STREAM_REQUEST_TIME_OUT         = -3321,    ///< 旁路转推请求超时
+    ERR_CLOUD_MIX_TRANSCODING_REQUEST_TIME_OUT      = -3322,    ///< 云端混流请求超时
+    ERR_PUBLISH_CDN_STREAM_SERVER_FAILED            = -3323,    ///< 旁路转推回包异常
+    ERR_CLOUD_MIX_TRANSCODING_SERVER_FAILED         = -3324,    ///< 云端混流回包异常
+    ERR_ROOM_REQUEST_START_PUBLISHING_TIMEOUT       = -3333,    ///< 开始向腾讯云的直播 CDN 推流信令超时
+    ERR_ROOM_REQUEST_START_PUBLISHING_ERROR         = -3334,    ///< 开始向腾讯云的直播 CDN 推流信令异常
+    ERR_ROOM_REQUEST_STOP_PUBLISHING_TIMEOUT        = -3335,    ///< 停止向腾讯云的直播 CDN 推流信令超时
+    ERR_ROOM_REQUEST_STOP_PUBLISHING_ERROR          = -3336,    ///< 停止向腾讯云的直播 CDN 推流信令异常
+    
+
+    /////////////////////////////////////////////////////////////////////////////////
+    //
+    //       跨房连麦(ConnectOtherRoom)相关错误码
+    //       NOTE: 通过回调函数 TRTCCloudDelegate##onConnectOtherRoom() 通知。
+    //
+    /////////////////////////////////////////////////////////////////////////////////
+    ERR_ROOM_REQUEST_CONN_ROOM_TIMEOUT              = -3326,    ///< 请求连麦超时
+    ERR_ROOM_REQUEST_DISCONN_ROOM_TIMEOUT           = -3327,    ///< 请求退出连麦超时
+    ERR_ROOM_REQUEST_CONN_ROOM_INVALID_PARAM        = -3328,    ///< 无效参数
+    ERR_CONNECT_OTHER_ROOM_AS_AUDIENCE              = -3330,    ///< 当前是观众角色,不能请求或断开跨房连麦,需要先 switchRole() 到主播
+    ERR_SERVER_CENTER_CONN_ROOM_NOT_SUPPORT         = -102031,  ///< 不支持跨房间连麦
+    ERR_SERVER_CENTER_CONN_ROOM_REACH_MAX_NUM       = -102032,  ///< 达到跨房间连麦上限
+    ERR_SERVER_CENTER_CONN_ROOM_REACH_MAX_RETRY_TIMES   = -102033,  ///< 跨房间连麦重试次数耗尽
+    ERR_SERVER_CENTER_CONN_ROOM_REQ_TIMEOUT         = -102034,  ///< 跨房间连麦请求超时
+    ERR_SERVER_CENTER_CONN_ROOM_REQ                 = -102035,  ///< 跨房间连麦请求格式错误
+    ERR_SERVER_CENTER_CONN_ROOM_NO_SIG              = -102036,  ///< 跨房间连麦无签名
+    ERR_SERVER_CENTER_CONN_ROOM_DECRYPT_SIG         = -102037,  ///< 跨房间连麦签名解密失败
+    ERR_SERVER_CENTER_CONN_ROOM_NO_KEY              = -102038,  ///< 未找到跨房间连麦签名解密密钥
+    ERR_SERVER_CENTER_CONN_ROOM_PARSE_SIG           = -102039,  ///< 跨房间连麦签名解析错误
+    ERR_SERVER_CENTER_CONN_ROOM_INVALID_SIG_TIME    = -102040,  ///< 跨房间连麦签名时间戳错误
+    ERR_SERVER_CENTER_CONN_ROOM_SIG_GROUPID         = -102041,  ///< 跨房间连麦签名不匹配
+    ERR_SERVER_CENTER_CONN_ROOM_NOT_CONNED          = -102042,  ///< 本房间无连麦
+    ERR_SERVER_CENTER_CONN_ROOM_USER_NOT_CONNED     = -102043,  ///< 本用户未发起连麦
+    ERR_SERVER_CENTER_CONN_ROOM_FAILED              = -102044,  ///< 跨房间连麦失败
+    ERR_SERVER_CENTER_CONN_ROOM_CANCEL_FAILED       = -102045,  ///< 取消跨房间连麦失败
+    ERR_SERVER_CENTER_CONN_ROOM_CONNED_ROOM_NOT_EXIST   = -102046,  ///< 被连麦房间不存在
+    ERR_SERVER_CENTER_CONN_ROOM_CONNED_REACH_MAX_ROOM   = -102047,  ///< 被连麦房间达到连麦上限
+    ERR_SERVER_CENTER_CONN_ROOM_CONNED_USER_NOT_EXIST   = -102048,  ///< 被连麦用户不存在
+    ERR_SERVER_CENTER_CONN_ROOM_CONNED_USER_DELETED     = -102049,  ///< 被连麦用户已被删除
+    ERR_SERVER_CENTER_CONN_ROOM_CONNED_USER_FULL        = -102050,  ///< 被连麦用户达到资源上限
+    ERR_SERVER_CENTER_CONN_ROOM_INVALID_SEQ             = -102051,  ///< 连麦请求序号错乱
+    
+    
+    /////////////////////////////////////////////////////////////////////////////////
+    //
+    //       客户无需关心的内部错误码
+    //
+    /////////////////////////////////////////////////////////////////////////////////
+
+    // - Remove From Head
+    ERR_RTMP_PUSH_NET_DISCONNECT                    = -1307,    ///< 直播,推流出现网络断开,且经过多次重试无法恢复
+    ERR_RTMP_PUSH_INVALID_ADDRESS                   = -1313,    ///< 直播,推流地址非法,例如不是 RTMP 协议的地址
+    ERR_RTMP_PUSH_NET_ALLADDRESS_FAIL               = -1324,    ///< 直播,连接推流服务器失败(若支持智能选路,IP 全部失败)
+    ERR_RTMP_PUSH_NO_NETWORK                        = -1325,    ///< 直播,网络不可用,请确认 Wi-Fi、移动数据或者有线网络是否正常
+    ERR_RTMP_PUSH_SERVER_REFUSE                     = -1326,    ///< 直播,服务器拒绝连接请求,可能是该推流地址已经被占用,或者 TXSecret 校验失败,或者是过期了,或者是欠费了
+    
+    ERR_PLAY_LIVE_STREAM_NET_DISCONNECT             = -2301,    ///< 直播,网络断连,且经多次重连抢救无效,可以放弃治疗,更多重试请自行重启播放
+    ERR_GET_RTMP_ACC_URL_FAIL                       = -2302,    ///< 直播,获取加速拉流的地址失败
+    ERR_FILE_NOT_FOUND                              = -2303,    ///< 播放的文件不存在
+    ERR_HEVC_DECODE_FAIL                            = -2304,    ///< H265 解码失败
+    ERR_VOD_DECRYPT_FAIL                            = -2305,    ///< 点播,音视频流解密失败
+    ERR_GET_VODFILE_MEDIAINFO_FAIL                  = -2306,    ///< 点播,获取点播文件信息失败
+    ERR_PLAY_LIVE_STREAM_SWITCH_FAIL                = -2307,    ///< 直播,切流失败(切流可以播放不同画面大小的视频)
+    ERR_PLAY_LIVE_STREAM_SERVER_REFUSE              = -2308,    ///< 直播,服务器拒绝连接请求
+    ERR_RTMP_ACC_FETCH_STREAM_FAIL                  = -2309,    ///< 直播,RTMPACC 低延时拉流失败,且经过多次重试无法恢复
+
+    ERR_ROOM_HEARTBEAT_FAIL                         = -3302,    ///< 心跳失败,客户端定时向服务器发送数据包,告诉服务器自己活着,这个错误通常是发包超时
+    ERR_ROOM_REQUEST_IP_FAIL                        = -3303,    ///< 拉取接口机服务器地址失败
+    ERR_ROOM_CONNECT_FAIL                           = -3304,    ///< 连接接口机服务器失败
+    ERR_ROOM_REQUEST_AVSEAT_FAIL                    = -3305,    ///< 请求视频位失败
+    ERR_ROOM_REQUEST_TOKEN_HTTPS_TIMEOUT            = -3306,    ///< 请求 token HTTPS 超时,请检查网络是否正常,或网络防火墙是否放行 HTTPS 访问 official.opensso.tencent-cloud.com:443
+    ERR_ROOM_REQUEST_IP_TIMEOUT                     = -3307,    ///< 请求 IP 和 sig 超时,请检查网络是否正常,或网络防火墙是否放行 UDP 访问下列 IP 和域名 query.tencent-cloud.com:8000 162.14.23.140:8000 162.14.7.49:8000
+    ERR_ROOM_REQUEST_VIDEO_FLAG_TIMEOUT             = -3309,    ///< 请求视频位超时
+    ERR_ROOM_REQUEST_VIDEO_DATA_ROOM_TIMEOUT        = -3310,    ///< 请求视频数据超时
+    ERR_ROOM_REQUEST_CHANGE_ABILITY_TIMEOUT         = -3311,    ///< 请求修改视频能力项超时
+    ERR_ROOM_REQUEST_STATUS_REPORT_TIMEOUT          = -3312,    ///< 请求状态上报超时
+    ERR_ROOM_REQUEST_CLOSE_VIDEO_TIMEOUT            = -3313,    ///< 请求关闭视频超时
+    ERR_ROOM_REQUEST_SET_RECEIVE_TIMEOUT            = -3314,    ///< 请求接收视频项超时
+    ERR_ROOM_REQUEST_TOKEN_INVALID_PARAMETER        = -3315,    ///< 请求 token 无效参数,请检查 TRTCParams.userSig 是否填写正确
+
+    ERR_ROOM_REQUEST_AES_TOKEN_RETURN_ERROR         = -3329,    ///< 请求 AES TOKEN 时,server 返回的内容是空的
+    ERR_ACCIP_LIST_EMPTY                            = -3331,    ///< 请求接口机 IP 返回的列表为空的
+    ERR_ROOM_REQUEST_SEND_JSON_CMD_TIMEOUT          = -3332,    ///< 请求发送Json 信令超时
+    
+    // Info 服务器(查询接口机 IP), 服务器错误码,数值范围[-100000, -110000]
+    ERR_SERVER_INFO_UNPACKING_ERROR                 = -100000,  ///< server 解包错误,可能请求数据被篡改
+    ERR_SERVER_INFO_TOKEN_ERROR                     = -100001,  ///< TOKEN 错误
+    ERR_SERVER_INFO_ALLOCATE_ACCESS_FAILED          = -100002,  ///< 分配接口机错误
+    ERR_SERVER_INFO_GENERATE_SIGN_FAILED            = -100003,  ///< 生成签名错误
+    ERR_SERVER_INFO_TOKEN_TIMEOUT                   = -100004,  ///< HTTPS token 超时
+    ERR_SERVER_INFO_INVALID_COMMAND                 = -100005,  ///< 无效的命令字
+    ERR_SERVER_INFO_PRIVILEGE_FLAG_ERROR            = -100006,  ///< 权限位校验失败
+    ERR_SERVER_INFO_GENERATE_KEN_ERROR              = -100007,  ///< HTTPS 请求时,生成加密 key 错误
+    ERR_SERVER_INFO_GENERATE_TOKEN_ERROR            = -100008,  ///< HTTPS 请求时,生成 token 错误
+    ERR_SERVER_INFO_DATABASE                        = -100009,  ///< 数据库查询失败(房间相关存储信息)
+    ERR_SERVER_INFO_BAD_ROOMID                      = -100010,  ///< 房间号错误
+    ERR_SERVER_INFO_BAD_SCENE_OR_ROLE               = -100011,  ///< 场景或角色错误
+    ERR_SERVER_INFO_ROOMID_EXCHANGE_FAILED          = -100012,  ///< 房间号转换出错
+    ERR_SERVER_INFO_STRGROUP_HAS_INVALID_CHARS      = -100014,  ///< 房间号非法
+    ERR_SERVER_INFO_LACK_SDKAPPID                   = -100015,  ///< 非法SDKAppid
+    ERR_SERVER_INFO_INVALID                         = -100016,  ///< 无效请求, 分配接口机失败
+    ERR_SERVER_INFO_ECDH_GET_KEY                    = -100017,  ///< 生成公钥失败
+    ERR_SERVER_INFO_ECDH_GET_TINYID                 = -100018,  ///< userSig 校验失败,请检查 TRTCParams.userSig 是否填写正确
+    
+    // Access 接口机
+    ERR_SERVER_ACC_TOKEN_TIMEOUT                    = -101000,  ///< token 过期
+    ERR_SERVER_ACC_SIGN_ERROR                       = -101001,  ///< 签名错误
+    ERR_SERVER_ACC_SIGN_TIMEOUT                     = -101002,  ///< 签名超时
+    ERR_SERVER_ACC_ROOM_NOT_EXIST                   = -101003,  ///< 房间不存在
+    ERR_SERVER_ACC_ROOMID                           = -101004,  ///< 后台房间标识 roomId 错误
+    ERR_SERVER_ACC_LOCATIONID                       = -101005,  ///< 后台用户位置标识 locationId 错误
+    ERR_SERVER_ACC_TOKEN_EORROR                     = -101006,  ///< token里面的tinyid和进房信令tinyid不同 或是 进房信令没有token
+
+    // Center 服务器(信令和流控处理等任务)
+    ERR_SERVER_CENTER_SYSTEM_ERROR                  = -102000,  ///< 后台错误
+    
+    ERR_SERVER_CENTER_INVALID_ROOMID                = -102001,  ///< 无效的房间 Id
+    ERR_SERVER_CENTER_CREATE_ROOM_FAILED            = -102002,  ///< 创建房间失败
+    ERR_SERVER_CENTER_SIGN_ERROR                    = -102003,  ///< 签名错误
+    ERR_SERVER_CENTER_SIGN_TIMEOUT                  = -102004,  ///< 签名过期
+    ERR_SERVER_CENTER_ROOM_NOT_EXIST                = -102005,  ///< 房间不存在
+    ERR_SERVER_CENTER_ADD_USER_FAILED               = -102006,  ///< 房间添加用户失败
+    ERR_SERVER_CENTER_FIND_USER_FAILED              = -102007,  ///< 查找用户失败
+    ERR_SERVER_CENTER_SWITCH_TERMINATION_FREQUENTLY = -102008,  ///< 频繁切换终端
+    ERR_SERVER_CENTER_LOCATION_NOT_EXIST            = -102009,  ///< locationid 错误
+    ERR_SERVER_CENTER_NO_PRIVILEDGE_CREATE_ROOM     = -102010,  ///< 没有权限创建房间
+    ERR_SERVER_CENTER_NO_PRIVILEDGE_ENTER_ROOM      = -102011,  ///< 没有权限进入房间
+    ERR_SERVER_CENTER_INVALID_PARAMETER_SUB_VIDEO   = -102012,  ///< 辅路抢视频位、申请辅路请求类型参数错误
+    ERR_SERVER_CENTER_NO_PRIVILEDGE_PUSH_VIDEO      = -102013,  ///< 没有权限上视频
+    ERR_SERVER_CENTER_ROUTE_TABLE_ERROR             = -102014,  ///< 没有空闲路由表
+    ERR_SERVER_CENTER_NOT_PUSH_SUB_VIDEO            = -102017,  ///< 当前用户没有上行辅路
+    ERR_SERVER_CENTER_USER_WAS_DELETED              = -102018,  ///< 用户被删除状态
+    ERR_SERVER_CENTER_NO_PRIVILEDGE_REQUEST_VIDEO   = -102019,  ///< 没有权限请求视频
+    ERR_SERVER_CENTER_INVALID_PARAMETER             = -102023,  ///< 进房参数 bussInfo 错误
+    ERR_SERVER_CENTER_I_FRAME_UNKNOW_TYPE           = -102024,  ///< 请求 I 帧未知 opType
+    ERR_SERVER_CENTER_I_FRAME_INVALID_PACKET        = -102025,  ///< 请求 I 帧包格式错误
+    ERR_SERVER_CENTER_I_FRAME_DEST_USER_NOT_EXIST   = -102026,  ///< 请求 I 帧目标用户不存在
+    ERR_SERVER_CENTER_I_FRAME_ROOM_TOO_BIG          = -102027,  ///< 请求 I 帧房间用户太多
+    ERR_SERVER_CENTER_I_FRAME_RPS_INVALID_PARAMETER = -102028,  ///< 请求 I 帧参数错误
+    ERR_SERVER_CENTER_INVALID_ROOM_ID               = -102029,  ///< 房间号非法
+    ERR_SERVER_CENTER_ROOM_ID_TOO_LONG              = -102030,  ///< 房间号超过限制
+    ERR_SERVER_CENTER_ROOM_FULL                     = -102052,  ///< 房间满员
+    ERR_SERVER_CENTER_DECODE_JSON_FAIL              = -102053,  ///< JSON 串解析失败
+    ERR_SERVER_CENTER_UNKNOWN_SUB_CMD               = -102054,  ///< 未定义命令字
+    ERR_SERVER_CENTER_INVALID_ROLE                  = -102055,  ///< 未定义角色
+    ERR_SERVER_CENTER_REACH_PROXY_MAX               = -102056,  ///< 代理机超出限制
+    ERR_SERVER_CENTER_RECORDID_STORE                = -102057,  ///< 无法保存用户自定义 recordId
+    ERR_SERVER_CENTER_PB_SERIALIZE                  = -102058,  ///< Protobuf 序列化错误
+    
+    ERR_SERVER_SSO_SIG_EXPIRED                      = -70001,   ///< sig 过期,请尝试重新生成。如果是刚生成,就过期,请检查有效期填写的是否过小,或者填的 0
+    ERR_SERVER_SSO_SIG_VERIFICATION_FAILED_1        = -70003,   ///< sig 校验失败,请确认下 sig 内容是否被截断,如缓冲区长度不够导致的内容截断
+    ERR_SERVER_SSO_SIG_VERIFICATION_FAILED_2        = -70004,   ///< sig 校验失败,请确认下 sig 内容是否被截断,如缓冲区长度不够导致的内容截断
+    ERR_SERVER_SSO_SIG_VERIFICATION_FAILED_3        = -70005,   ///< sig 校验失败,可用工具自行验证生成的 sig 是否正确
+    ERR_SERVER_SSO_SIG_VERIFICATION_FAILED_4        = -70006,   ///< sig 校验失败,可用工具自行验证生成的 sig 是否正确
+    ERR_SERVER_SSO_SIG_VERIFICATION_FAILED_5        = -70007,   ///< sig 校验失败,可用工具自行验证生成的 sig 是否正确
+    ERR_SERVER_SSO_SIG_VERIFICATION_FAILED_6        = -70008,   ///< sig 校验失败,可用工具自行验证生成的 sig 是否正确
+    ERR_SERVER_SSO_SIG_VERIFICATION_FAILED_7        = -70009,   ///< 用业务公钥验证 sig 失败,请确认生成的 usersig 使用的私钥和 sdkAppId 是否对应
+    ERR_SERVER_SSO_SIG_VERIFICATION_FAILED_8        = -70010,   ///< sig 校验失败,可用工具自行验证生成的 sig 是否正确
+    ERR_SERVER_SSO_SIG_VERIFICATION_ID_NOT_MATCH    = -70013,   ///< sig 中 identifier 与请求时的 identifier 不匹配,请检查登录时填写的 identifier 与 sig 中的是否一致
+    ERR_SERVER_SSO_APPID_NOT_MATCH                  = -70014,   ///< sig 中 sdkAppId 与请求时的 sdkAppId 不匹配,请检查登录时填写的 sdkAppId 与 sig 中的是否一致
+    ERR_SERVER_SSO_VERIFICATION_EXPIRED             = -70017,   ///< 内部第三方票据验证超时,请重试,如多次重试不成功,请@TLS 帐号支持,QQ 3268519604
+    ERR_SERVER_SSO_VERIFICATION_FAILED              = -70018,   ///< 内部第三方票据验证超时,请重试,如多次重试不成功,请@TLS 帐号支持,QQ 3268519604
+
+    ERR_SERVER_SSO_APPID_NOT_FOUND                  = -70020,   ///< sdkAppId 未找到,请确认是否已经在腾讯云上配置
+    ERR_SERVER_SSO_ACCOUNT_IN_BLACKLIST             = -70051,   ///< 帐号已被拉入黑名单,请联系 TLS 帐号支持 QQ 3268519604
+    ERR_SERVER_SSO_SIG_INVALID                      = -70052,   ///< usersig 已经失效,请重新生成,再次尝试
+    ERR_SERVER_SSO_LIMITED_BY_SECURITY              = -70114,   ///< 安全原因被限制
+    ERR_SERVER_SSO_INVALID_LOGIN_STATUS             = -70221,   ///< 登录状态无效,请使用 usersig 重新鉴权
+    ERR_SERVER_SSO_APPID_ERROR                      = -70252,   ///< sdkAppId 填写错误
+    ERR_SERVER_SSO_TICKET_VERIFICATION_FAILED       = -70346,   ///< 票据校验失败,请检查各项参数是否正确
+    ERR_SERVER_SSO_TICKET_EXPIRED                   = -70347,   ///< 票据因过期原因校验失败
+    ERR_SERVER_SSO_ACCOUNT_EXCEED_PURCHASES         = -70398,   ///< 创建账号数量超过已购买预付费数量限制
+    ERR_SERVER_SSO_INTERNAL_ERROR                   = -70500,   ///< 服务器内部错误,请重试
+    
+    //秒级监控上报错误码
+    ERR_REQUEST_QUERY_CONFIG_TIMEOUT           = -4001,    ///< 请求通用配置超时
+    ERR_CUSTOM_STREAM_INVALID                  = -4002,    ///< 自定义流id错误
+    ERR_USER_DEFINE_RECORD_ID_INVALID          = -4003,    ///< userDefineRecordId错误
+    ERR_MIX_PARAM_INVALID                      = -4004,    ///< 混流参数校验失败
+    ERR_REQUEST_ACC_BY_HOST_IP                 = -4005,    ///< 通过域名进行0x1请求
+    // - /Remove From Head
+} TXLiteAVError;
+
+/////////////////////////////////////////////////////////////////////////////////
+//
+//                     警告码
+//
+//> 不需要特别关注,但您可以根据其中某些感兴趣的警告码,对当前用户进行相应的提示
+//
+/////////////////////////////////////////////////////////////////////////////////
+
+typedef enum TXLiteAVWarning
+{
+    WARNING_HW_ENCODER_START_FAIL                   = 1103,     ///< 硬编码启动出现问题,自动切换到软编码
+    WARNING_VIDEO_ENCODER_SW_TO_HW                  = 1107,     ///<  当前 CPU 使用率太高,无法满足软件编码需求,自动切换到硬件编码
+    WARNING_INSUFFICIENT_CAPTURE_FPS                = 1108,     ///<  摄像头采集帧率不足,部分自带美颜算法的 Android 手机上会出现
+    WARNING_SW_ENCODER_START_FAIL                   = 1109,     ///<  软编码启动失败
+    WARNING_REDUCE_CAPTURE_RESOLUTION               = 1110,     ///<  摄像头采集分辨率被降低,以满足当前帧率和性能最优解。
+    WARNING_CAMERA_DEVICE_EMPTY                     = 1111,     ///<  没有检测到可用的摄像头设备
+    WARNING_CAMERA_NOT_AUTHORIZED                   = 1112,     ///<  用户未授权当前应用使用摄像头
+    WARNING_MICROPHONE_DEVICE_EMPTY                 = 1201,     ///<  没有检测到可用的麦克风设备
+    WARNING_SPEAKER_DEVICE_EMPTY                    = 1202,     ///<  没有检测到可用的扬声器设备
+    WARNING_MICROPHONE_NOT_AUTHORIZED               = 1203,     ///<  用户未授权当前应用使用麦克风
+    WARNING_MICROPHONE_DEVICE_ABNORMAL              = 1204,     ///<  音频采集设备不可用(例如被占用或者PC判定无效设备)
+    WARNING_SPEAKER_DEVICE_ABNORMAL                 = 1205,     ///<  音频播放设备不可用(例如被占用或者PC判定无效设备)
+    WARNING_VIDEO_FRAME_DECODE_FAIL                 = 2101,     ///<  当前视频帧解码失败
+    WARNING_AUDIO_FRAME_DECODE_FAIL                 = 2102,     ///<  当前音频帧解码失败
+    WARNING_VIDEO_PLAY_LAG                          = 2105,     ///<  当前视频播放出现卡顿
+    WARNING_HW_DECODER_START_FAIL                   = 2106,     ///<  硬解启动失败,采用软解码
+    WARNING_VIDEO_DECODER_HW_TO_SW                  = 2108,     ///<  当前流硬解第一个 I 帧失败,SDK 自动切软解
+    WARNING_SW_DECODER_START_FAIL                   = 2109,     ///<  软解码器启动失败
+    WARNING_VIDEO_RENDER_FAIL                       = 2110,     ///<  视频渲染失败
+    WARNING_START_CAPTURE_IGNORED                   = 4000,     ///<  已经在采集,启动采集被忽略
+    WARNING_AUDIO_RECORDING_WRITE_FAIL              = 7001,     ///<  音频录制写入文件失败
+    WARNING_ROOM_DISCONNECT                         = 5101,     ///<  网络断开连接
+    WARNING_IGNORE_UPSTREAM_FOR_AUDIENCE            = 6001,     ///<  当前是观众角色,忽略上行音视频数据
+    
+    // - Remove From Head
+    WARNING_NET_BUSY                                = 1101,     ///< 网络状况不佳:上行带宽太小,上传数据受阻
+    WARNING_RTMP_SERVER_RECONNECT                   = 1102,     ///<  直播,网络断连, 已启动自动重连(自动重连连续失败超过三次会放弃)
+    WARNING_LIVE_STREAM_SERVER_RECONNECT            = 2103,     ///<  直播,网络断连, 已启动自动重连(自动重连连续失败超过三次会放弃)
+    WARNING_RECV_DATA_LAG                           = 2104,     ///<  网络来包不稳:可能是下行带宽不足,或由于主播端出流不均匀
+    WARNING_RTMP_DNS_FAIL                           = 3001,     ///<  直播,DNS 解析失败
+    WARNING_RTMP_SEVER_CONN_FAIL                    = 3002,     ///<  直播,服务器连接失败
+    WARNING_RTMP_SHAKE_FAIL                         = 3003,     ///<  直播,与 RTMP 服务器握手失败
+    WARNING_RTMP_SERVER_BREAK_CONNECT               = 3004,     ///<  直播,服务器主动断开
+    WARNING_RTMP_READ_WRITE_FAIL                    = 3005,     ///<  直播,RTMP 读/写失败,将会断开连接
+    WARNING_RTMP_WRITE_FAIL                         = 3006,     ///<  直播,RTMP 写失败(SDK 内部错误码,不会对外抛出)
+    WARNING_RTMP_READ_FAIL                          = 3007,     ///<  直播,RTMP 读失败(SDK 内部错误码,不会对外抛出)
+    WARNING_RTMP_NO_DATA                            = 3008,     ///<  直播,超过30s 没有数据发送,主动断开连接
+    WARNING_PLAY_LIVE_STREAM_INFO_CONNECT_FAIL      = 3009,     ///<  直播,connect 服务器调用失败(SDK 内部错误码,不会对外抛出)
+    WARNING_NO_STEAM_SOURCE_FAIL                    = 3010,     ///<  直播,连接失败,该流地址无视频(SDK 内部错误码,不会对外抛出)
+    WARNING_ROOM_RECONNECT                          = 5102,     ///<  网络断连,已启动自动重连
+    WARNING_ROOM_NET_BUSY                           = 5103,     ///<  网络状况不佳:上行带宽太小,上传数据受阻
+    // - /Remove From Head
+} TXLiteAVWarning;
+
+// - Remove From Head
+/////////////////////////////////////////////////////////////////////////////////
+//
+//                     (三)事件列表
+//
+/////////////////////////////////////////////////////////////////////////////////
+
+typedef enum TXLiteAVEvent
+{
+    EVT_RTMP_PUSH_CONNECT_SUCC                      = 1001,     ///<  直播,已经连接 RTMP 推流服务器
+    EVT_RTMP_PUSH_BEGIN                             = 1002,     ///<  直播,已经与 RTMP 服务器握手完毕,开始推流
+    EVT_CAMERA_START_SUCC                           = 1003,     ///<  打开摄像头成功
+    EVT_SCREEN_CAPTURE_SUCC                         = 1004,     ///<  录屏启动成功
+    EVT_UP_CHANGE_RESOLUTION                        = 1005,     ///<  上行动态调整分辨率
+    EVT_UP_CHANGE_BITRATE                           = 1006,     ///<  码率动态调整
+    EVT_FIRST_FRAME_AVAILABLE                       = 1007,     ///<  首帧画面采集完成
+    EVT_START_VIDEO_ENCODER                         = 1008,     ///<  编码器启动成功
+    EVT_SNAPSHOT_COMPLETE                           = 1022,     ///<  一帧截图完成
+    EVT_CAMERA_REMOVED                              = 1023,     ///<  摄像头设备已被移出(Windows 和 Mac 版 SDK 使用)
+    EVT_CAMERA_AVAILABLE                            = 1024,     ///<  摄像头设备重新可用(Windows 和 Mac 版 SDK 使用)
+    EVT_CAMERA_CLOSE                                = 1025,     ///<  关闭摄像头完成(Windows 和 Mac 版 SDK 使用)
+    EVT_RTMP_PUSH_PUBLISH_START                     = 1026,     ///<  直播,与 RTMP 服务器连接后,收到 NetStream.Publish.Start 消息,表明流发布成功(SDK 内部事件,不会对外抛出)
+    EVT_HW_ENCODER_START_SUCC                       = 1027,     ///<  硬编码器启动成功
+    EVT_SW_ENCODER_START_SUCC                       = 1028,     ///<  软编码器启动成功
+    EVT_LOCAL_RECORD_RESULT                         = 1029,     ///<  本地录制结果
+    EVT_LOCAL_RECORD_PROGRESS                       = 1030,     ///<  本地录制状态通知
+
+    EVT_PLAY_LIVE_STREAM_CONNECT_SUCC               = 2001,     ///<  直播,已经连接 RTMP 拉流服务器
+    EVT_PLAY_LIVE_STREAM_BEGIN                      = 2002,     ///<  直播,已经与 RTMP 服务器握手完毕,开始拉流
+    EVT_RENDER_FIRST_I_FRAME                        = 2003,     ///<  渲染首个视频数据包(IDR)
+    EVT_VIDEO_PLAY_BEGIN                            = 2004,     ///<  视频播放开始
+    EVT_VIDEO_PLAY_PROGRESS                         = 2005,     ///<  视频播放进度
+    EVT_VIDEO_PLAY_END                              = 2006,     ///<  视频播放结束
+    EVT_VIDEO_PLAY_LOADING                          = 2007,     ///<  视频播放 loading
+    EVT_START_VIDEO_DECODER                         = 2008,     ///<  解码器启动
+    EVT_DOWN_CHANGE_RESOLUTION                      = 2009,     ///<  下行视频分辨率改变
+    EVT_GET_VODFILE_MEDIAINFO_SUCC                  = 2010,     ///<  点播,获取点播文件信息成功
+    EVT_VIDEO_CHANGE_ROTATION                       = 2011,     ///<  视频旋转角度发生改变
+    EVT_PLAY_GET_MESSAGE                            = 2012,     ///<  消息事件
+    EVT_VOD_PLAY_PREPARED                           = 2013,     ///<  点播,视频加载完毕
+    EVT_VOD_PLAY_LOADING_END                        = 2014,     ///<  点播,loading 结束
+    EVT_PLAY_LIVE_STREAM_SWITCH_SUCC                = 2015,     ///<  直播,切流成功(切流可以播放不同画面大小的视频)
+    EVT_VOD_PLAY_TCP_CONNECT_SUCC                   = 2016,     ///<  点播,TCP 连接成功(SDK 内部事件,不会对外抛出)
+    EVT_VOD_PLAY_FIRST_VIDEO_PACKET                 = 2017,     ///<  点播,收到首帧数据(SDK 内部事件,不会对外抛出)
+    EVT_VOD_PLAY_DNS_RESOLVED                       = 2018,     ///<  点播,DNS 解析完成(SDK 内部事件,不会对外抛出)
+    EVT_VOD_PLAY_SEEK_COMPLETE                      = 2019,     ///<  点播,视频播放 Seek 完成(SDK 内部事件,不会对外抛出)
+    EVT_VIDEO_DECODER_CACHE_TOO_MANY_FRAMES         = 2020,     ///<  视频解码器缓存帧数过多,超过40帧(SDK 内部事件,不会对外抛出)
+    EVT_HW_DECODER_START_SUCC                       = 2021,     ///<  硬解码器启动成功(SDK 内部事件,不会对外抛出)
+    EVT_SW_DECODER_START_SUCC                       = 2022,     ///<  软解码器启动成功(SDK 内部事件,不会对外抛出)
+    EVT_AUDIO_JITTER_STATE_FIRST_LOADING            = 2023,     ///<  音频首次加载(SDK 内部事件,不会对外抛出)
+    EVT_AUDIO_JITTER_STATE_LOADING                  = 2024,     ///<  音频正在加载(SDK 内部事件,不会对外抛出)
+    EVT_AUDIO_JITTER_STATE_PLAYING                  = 2025,     ///<  音频正在播放(SDK 内部事件,不会对外抛出)
+    EVT_AUDIO_JITTER_STATE_FIRST_PLAY               = 2026,     ///<  音频首次播放(SDK 内部事件,不会对外抛出)
+    EVT_MIC_START_SUCC                              = 2027,     ///<  麦克风启动成功
+    EVT_PLAY_GET_METADATA                           = 2028,     ///<  视频流MetaData事件
+    EVT_MIC_RELEASE_SUCC                            = 2029,     ///<  释放麦克风占用
+    EVT_AUDIO_DEVICE_ROUTE_CHANGED                  = 2030,     ///<  音频设备的route发生改变,即当前的输入输出设备发生改变,比如耳机被拔出
+    EVT_PLAY_GET_FLVSESSIONKEY                      = 2031,     ///<  TXLivePlayer 接收到http响应头中的 flvSessionKey 信息
+
+    EVT_ROOM_ENTER                                  = 1018,     ///<  进入房间成功
+    EVT_ROOM_EXIT                                   = 1019,     ///<  退出房间
+    EVT_ROOM_USERLIST                               = 1020,     ///<  下发房间成员列表(不包括自己)
+    EVT_ROOM_NEED_REENTER                           = 1021,     ///<  WiFi 切换到4G 会触发断线重连,此时需要重新进入房间(拉取最优的服务器地址)
+    EVT_ROOM_ENTER_FAILED                           = 1022,     ///<  自己进入房间失败
+    EVT_ROOM_USER_ENTER                             = 1031,     ///<  进房通知
+    EVT_ROOM_USER_EXIT                              = 1032,     ///<  退房通知
+    EVT_ROOM_USER_VIDEO_STATE                       = 1033,     ///<  视频状态位变化通知
+    EVT_ROOM_USER_AUDIO_STATE                       = 1034,     ///<  音频状态位变化通知
+    
+    EVT_ROOM_REQUEST_IP_SUCC                        = 8001,     ///<  拉取接口机服务器地址成功
+    EVT_ROOM_CONNECT_SUCC                           = 8002,     ///<  连接接口机服务器成功
+    EVT_ROOM_REQUEST_AVSEAT_SUCC                    = 8003,     ///<  请求视频位成功
+} TXLiteAVEvent;
+// - /Remove From Head
+
+#endif /* __TXLITEAVCODE_H__ */

+ 54 - 0
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLiteAVEncodedDataProcessingListener.h

@@ -0,0 +1,54 @@
+/*
+* Module:   live 编码数据回调
+*
+* Function: 回调推流端编码完,和 播放端解码前的数据
+*
+*/
+
+
+#ifndef TXLiteAVEncodedDataProcessingListener_h
+#define TXLiteAVEncodedDataProcessingListener_h
+
+#include <stdio.h>
+#include "TXLiteAVBuffer.h"
+
+namespace liteav {
+
+struct TXLiteAVEncodedData {
+    const char * userId; // didEncodeVideo 和 didEncodeAudio 回调时,此字段为null;
+    int streamType; // 视频流类型,参考 TRTCVideoStreamType,audio时,此字段为0
+    const liteav::TXLiteAVBuffer * originData; // 原始数据
+    liteav::TXLiteAVBuffer * processedData; // 写回处理后的数据
+};
+
+class ITXLiteAVEncodedDataProcessingListener {
+public:
+    virtual ~ITXLiteAVEncodedDataProcessingListener() {}
+    
+    /**
+     * 回调编码完的视频数据。
+     *  @note videoData.userId = nullptr
+     */
+    virtual bool didEncodeVideo(TXLiteAVEncodedData & videoData) { return false; }
+    
+    /**
+    * 回调解码前的视频数据。
+    *  @note videoData.userId 表示对应的user,当userId 为 nullptr时,表示此时先接收到数据了,对应的userId还未完成同步。获取到userId之后会回调正确的userId
+    */
+    virtual bool willDecodeVideo(TXLiteAVEncodedData & videoData) { return false; }
+
+    /**
+     * 回调编码完的音频数据。
+     *  @note audioData.userId = nullptr
+     */
+    virtual bool didEncodeAudio(TXLiteAVEncodedData & audioData) { return false; }
+    
+    /**
+    * 回调解码前的音频数据。
+    *  @note audioData.userId 表示对应的user,当userId 为 nullptr时,表示此时先接收到数据了,对应的userId还未完成同步。获取到userId之后会回调正确的userId
+    */
+    virtual bool willDecodeAudio(TXLiteAVEncodedData & audioData) { return false; }
+};
+}
+
+#endif /* TXLiteAVEncodedDataProcessingListener_h */

+ 30 - 0
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLiteAVSDK.h

@@ -0,0 +1,30 @@
+//
+//  TXLiteAVSDK.h
+//  TXLiteAVSDK
+//
+//  Created by alderzhang on 2017/6/9.
+//  Copyright © 2017年 Tencent. All rights reserved.
+//
+
+
+
+#import <TXLiteAVSDK_Player/TXAudioCustomProcessDelegate.h>
+#import <TXLiteAVSDK_Player/TXAudioRawDataDelegate.h>
+#import <TXLiteAVSDK_Player/TXBitrateItem.h>
+#import <TXLiteAVSDK_Player/TXImageSprite.h>
+#import <TXLiteAVSDK_Player/TXLiteAVCode.h>
+#import <TXLiteAVSDK_Player/TXLiveAudioSessionDelegate.h>
+#import <TXLiteAVSDK_Player/TXLiveBase.h>
+#import <TXLiteAVSDK_Player/TXLivePlayConfig.h>
+#import <TXLiteAVSDK_Player/TXLivePlayListener.h>
+#import <TXLiteAVSDK_Player/TXLivePlayer.h>
+#import <TXLiteAVSDK_Player/TXLiveRecordListener.h>
+#import <TXLiteAVSDK_Player/TXLiveRecordTypeDef.h>
+#import <TXLiteAVSDK_Player/TXLiveSDKEventDef.h>
+#import <TXLiteAVSDK_Player/TXLiveSDKTypeDef.h>
+#import <TXLiteAVSDK_Player/TXPlayerAuthParams.h>
+#import <TXLiteAVSDK_Player/TXVideoCustomProcessDelegate.h>
+#import <TXLiteAVSDK_Player/TXVodDownloadManager.h>
+#import <TXLiteAVSDK_Player/TXVodPlayConfig.h>
+#import <TXLiteAVSDK_Player/TXVodPlayListener.h>
+#import <TXLiteAVSDK_Player/TXVodPlayer.h>

+ 40 - 0
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLiveAudioSessionDelegate.h

@@ -0,0 +1,40 @@
+#ifndef TXLiveAudioSessionDelegate_h
+#define TXLiveAudioSessionDelegate_h
+
+#import <AVFoundation/AVFoundation.h>
+
+@protocol TXLiveAudioSessionDelegate <NSObject>
+#if TARGET_OS_IPHONE
+
+@optional
+- (BOOL)setActive:(BOOL)active error:(NSError **)outError;
+
+@optional
+- (BOOL)setActive:(BOOL)active withOptions:(AVAudioSessionSetActiveOptions)options error:(NSError **)outError;
+
+@optional
+- (BOOL)setMode:(NSString *)mode error:(NSError **)outError;
+
+@optional
+- (BOOL)setCategory:(NSString *)category error:(NSError **)outError;
+
+@optional
+- (BOOL)setCategory:(NSString *)category withOptions:(AVAudioSessionCategoryOptions)options error:(NSError **)outError;
+
+@optional
+- (BOOL)setCategory:(NSString *)category mode:(NSString *)mode options:(AVAudioSessionCategoryOptions)options error:(NSError **)outError;
+@optional
+- (BOOL)setPreferredIOBufferDuration:(NSTimeInterval)duration error:(NSError **)outError;
+
+@optional
+- (BOOL)setPreferredSampleRate:(double)sampleRate error:(NSError **)outError;
+
+@optional
+- (BOOL)setPreferredOutputNumberOfChannels:(NSInteger)count error:(NSError **)outError;
+
+@optional
+- (BOOL)overrideOutputAudioPort:(AVAudioSessionPortOverride)portOverride error:(NSError **)outError;
+
+#endif
+@end
+#endif /* TXLiveAudioSessionDelegate_h */

+ 75 - 0
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLiveBase.h

@@ -0,0 +1,75 @@
+#import "TXLiveAudioSessionDelegate.h"
+
+typedef NS_ENUM(NSInteger, TX_Enum_Type_LogLevel) {
+    ///输出所有级别的log
+    LOGLEVEL_VERBOSE = 0,
+    /// 输出 DEBUG,INFO,WARNING,ERROR 和 FATAL 级别的log
+    LOGLEVEL_DEBUG = 1,
+    /// 输出 INFO,WARNING,ERROR 和 FATAL 级别的log
+    LOGLEVEL_INFO = 2,
+    /// 只输出WARNING,ERROR 和 FATAL 级别的log
+    LOGLEVEL_WARN = 3,
+    /// 只输出ERROR 和 FATAL 级别的log
+    LOGLEVEL_ERROR = 4,
+    /// 只输出 FATAL 级别的log
+    LOGLEVEL_FATAL = 5,
+    /// 不输出任何sdk log
+    LOGLEVEL_NULL = 6, 
+};
+
+@protocol TXLiveBaseDelegate <NSObject>
+@optional
+
+/**
+ @brief Log回调 
+ @discussion 
+ 1.实现TXLiveBaseDelegate,建议在一个比较早的初始化类中如AppDelegate
+ 2.在初始化中设置此回调,eg:[TXLiveBase sharedInstance].delegate = self;
+ 3.level类型参见TX_Enum_Type_LogLevel
+ 4.module值暂无具体意义,目前为固定值TXLiteAVSDK
+ */
+-(void) onLog:(NSString*)log LogLevel:(int)level WhichModule:(NSString*)module;
+
+@end
+
+@interface TXLiveBase : NSObject
+
+/// 通过这个delegate将全部log回调给SDK使用者,由SDK使用者来决定log如何处理
+@property (nonatomic, weak) id<TXLiveBaseDelegate> delegate;
+
++ (instancetype) sharedInstance;
+
+/**  设置log输出级别
+ *  @param level 参见 LOGLEVEL
+ *
+ */
++ (void) setLogLevel:(TX_Enum_Type_LogLevel)level;
+
+/**
+ * 启用或禁用控制台日志打印
+ * @param enabled 指定是否启用
+ */
++ (void) setConsoleEnabled:(BOOL)enabled;
+
++ (void) setAppVersion:(NSString *)verNum;
+
++ (void)setAudioSessionDelegate:(id<TXLiveAudioSessionDelegate>)delegate;
+
+/// 获取SDK版本信息
++ (NSString *)getSDKVersionStr;
+
+///  获取pitu版本信息
++ (NSString *)getPituSDKVersion;
+
+/// 设置appID,云控使用
++ (void)setAppID:(NSString*)appID;
+
+/// 设置sdk的licence下载url和key
++ (void)setLicenceURL:(NSString *)url key:(NSString *)key;
+
+/// 设置userId,用于数据上报
++ (void)setUserId:(NSString *)userId;
+
+/// 获取 Licence 信息
++ (NSString *)getLicenceInfo;
+@end

+ 105 - 0
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLivePlayConfig.h

@@ -0,0 +1,105 @@
+/*
+ * Module:   TXLivePlayConfig @ TXLiteAVSDK
+ *
+ * Function: 腾讯云直播播放器的参数配置模块
+ *
+ * Version: <:Version:>
+ */
+
+#import <Foundation/Foundation.h>
+
+/// @defgroup TXLivePlayConfig_ios TXLivePlayConfig
+/// 腾讯云直播播放器的参数配置模块
+/// @{
+
+/**
+ * 腾讯云直播播放器的参数配置模块
+ *
+ * 主要负责 TXLivePlayer 对应的参数设置,其中绝大多数设置项在播放开始之后再设置是无效的。
+ */
+@interface TXLivePlayConfig : NSObject
+
+/////////////////////////////////////////////////////////////////////////////////
+//
+//                      常用设置项
+//
+/////////////////////////////////////////////////////////////////////////////////
+
+///【字段含义】播放器缓存时间,单位秒,取值需要大于0,默认值:5
+@property(nonatomic, assign) float cacheTime;
+
+///【字段含义】是否自动调整播放器缓存时间,默认值:YES
+/// YES:启用自动调整,自动调整的最大值和最小值可以分别通过修改 maxCacheTime 和 minCacheTime 来设置
+/// NO:关闭自动调整,采用默认的指定缓存时间(1s),可以通过修改 cacheTime 来调整缓存时间
+@property(nonatomic, assign) BOOL bAutoAdjustCacheTime;
+
+///【字段含义】播放器缓存自动调整的最大时间,单位秒,取值需要大于0,默认值:5
+@property(nonatomic, assign) float maxAutoAdjustCacheTime;
+
+///【字段含义】播放器缓存自动调整的最小时间,单位秒,取值需要大于0,默认值为1
+@property(nonatomic, assign) float minAutoAdjustCacheTime;
+
+///【字段含义】播放器视频卡顿报警阈值,单位毫秒
+///【推荐取值】800
+///【特别说明】只有渲染间隔超过这个阈值的卡顿才会有 PLAY_WARNING_VIDEO_PLAY_LAG 通知
+@property(nonatomic, assign) int videoBlockThreshold;
+
+///【字段含义】播放器遭遇网络连接断开时 SDK 默认重试的次数,取值范围1 - 10,默认值:3。
+@property(nonatomic, assign) int connectRetryCount;
+
+///【字段含义】网络重连的时间间隔,单位秒,取值范围3 - 30,默认值:3。
+@property(nonatomic, assign) int connectRetryInterval;
+
+///【字段含义】是否开启回声消除, 默认值为 NO
+@property(nonatomic, assign) BOOL enableAEC;
+
+///【字段含义】是否开启消息通道, 默认值为 NO
+@property(nonatomic, assign) BOOL enableMessage;
+
+///【字段含义】是否开启 MetaData 数据回调,默认值为 NO。
+/// YES:SDK 通过 EVT_PLAY_GET_METADATA 消息抛出视频流的 MetaData 数据;
+/// NO:SDK 不抛出视频流的 MetaData 数据。
+/// 标准直播流都会在最开始的阶段有一个 MetaData 数据头,该数据头支持定制。
+/// 您可以通过 TXLivePushConfig 中的 metaData 属性设置一些自定义数据,再通过 TXLivePlayListener 中的
+/// onPlayEvent(EVT_PLAY_GET_METADATA) 消息接收到这些数据。
+///【特别说明】每条音视频流中只能设置一个 MetaData 数据头,除非断网重连,否则 TXLivePlayer 的 EVT_PLAY_GET_METADATA 消息也只会收到一次。
+@property(nonatomic, assign) BOOL enableMetaData;
+
+///【字段含义】是否开启 HTTP 头信息回调,默认值为 @“”
+/// HTTP 响应头中除了“content-length”、“content-type”等标准字段,不同云服务商还可能会添加一些非标准字段。
+/// 比如腾讯云会在直播 CDN 的 HTTP-FLV 格式的直播流中增加 “X-Tlive-SpanId” 响应头,并在其中设置一个随机字符串,用来唯一标识一次直播。
+/// 
+/// 如果您在使用腾讯云的直播 CDN,可以设置 flvSessionKey 为 @“X-Tlive-SpanId”,SDK 会在 HTTP 响应头里解析这个字段,
+/// 并通过 TXLivePlayListener 中的 onPlayEvent(EVT_PLAY_GET_FLVSESSIONKEY) 事件通知给您的 App。
+///
+///【特别说明】每条音视频流中只能解析一个 flvSessionKey,除非断网重连,否则 EVT_PLAY_GET_FLVSESSIONKEY 只会抛送一次。
+@property(nonatomic, copy) NSString* flvSessionKey;
+
+///【字段含义】视频渲染对象回调的视频格式,默认值:kCVPixelFormatType_420YpCbCr8Planar
+///【特别说明】支持:kCVPixelFormatType_420YpCbCr8Planar 和 kCVPixelFormatType_420YpCbCr8BiPlanarFullRange
+@property(nonatomic, assign) OSType playerPixelFormatType;
+
+
+/////////////////////////////////////////////////////////////////////////////////
+//
+//                      待废弃设置项
+//
+/////////////////////////////////////////////////////////////////////////////////
+
+///【字段含义】是否开启就近选路,待废弃,默认值:YES
+@property(nonatomic, assign) BOOL enableNearestIP;
+
+///【字段含义】RTMP 传输通道的类型,待废弃,默认值为:RTMP_CHANNEL_TYPE_AUTO
+@property (nonatomic, assign) int rtmpChannelType;
+
+#if TARGET_OS_IPHONE
+///【字段含义】视频缓存目录,点播 MP4、HLS 有效
+@property NSString *cacheFolderPath;
+///【字段含义】最多缓存文件个数,默认值:0
+@property int maxCacheItems;
+///【字段含义】自定义 HTTP Headers
+@property NSDictionary *headers;
+#endif
+
+@end
+/// @}

+ 31 - 0
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLivePlayListener.h

@@ -0,0 +1,31 @@
+/*
+ * Module:   TXLivePlayListener @ TXLiteAVSDK
+ *
+ * Function: 腾讯云直播播放的回调通知
+ *
+ * Version: <:Version:>
+ */
+
+#import <Foundation/Foundation.h>
+#import "TXLiveSDKTypeDef.h"
+
+/// @defgroup TXLivePlayListener_ios TXLivePlayListener
+/// 腾讯云直播播放的回调通知
+/// @{
+@protocol TXLivePlayListener <NSObject>
+
+/**
+ * 直播事件通知
+ * @param EvtID 参见 TXLiveSDKEventDef.h
+ * @param param 参见 TXLiveSDKTypeDef.h
+ */
+- (void)onPlayEvent:(int)EvtID withParam:(NSDictionary *)param;
+
+/**
+ * 网络状态通知
+ * @param param 参见 TXLiveSDKTypeDef.h
+ */
+- (void)onNetStatus:(NSDictionary *)param;
+
+@end
+/// @}

+ 372 - 0
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLivePlayer.h

@@ -0,0 +1,372 @@
+/*
+ *
+ * Module:   TXLivePlayer @ TXLiteAVSDK
+ *
+ * Function: 腾讯云直播播放器
+ *
+ * Version: <:Version:>
+ */
+
+#import <Foundation/Foundation.h>
+#import "TXLiveSDKTypeDef.h"
+#import "TXLivePlayListener.h"
+#import "TXLivePlayConfig.h"
+#import "TXVideoCustomProcessDelegate.h"
+#import "TXLiveRecordTypeDef.h"
+#import "TXLiveRecordListener.h"
+#import "TXAudioRawDataDelegate.h"
+
+/// @defgroup TXLivePlayer_ios TXLivePlayer
+/// 腾讯云直播播放器接口类
+/// @{
+
+/**
+ * 支持的直播和点播类型
+ *
+ * @note 新版本的点播 SDK,推荐参考 TXVodPlayer.h
+ */
+typedef NS_ENUM(NSInteger, TX_Enum_PlayType) {
+    /// RTMP 直播
+    PLAY_TYPE_LIVE_RTMP = 0,
+    /// FLV 直播
+    PLAY_TYPE_LIVE_FLV = 1,
+#if TARGET_OS_IPHONE
+    /// FLV 点播
+    PLAY_TYPE_VOD_FLV = 2,
+    /// HLS 点播
+    PLAY_TYPE_VOD_HLS = 3,
+    /// MP4点播
+    PLAY_TYPE_VOD_MP4 = 4,
+#endif
+    /// RTMP 直播加速播放
+    PLAY_TYPE_LIVE_RTMP_ACC = 5,
+#if TARGET_OS_IPHONE
+    /// 本地视频文件
+    PLAY_TYPE_LOCAL_VIDEO = 6,
+#endif
+};
+
+
+/**
+ * 视频播放器
+ *
+ * 主要负责将直播流的音视频画面进行解码和本地渲染,包含如下技术特点:
+ * - 针对腾讯云的拉流地址,可使用低延时拉流,实现直播连麦等相关场景。
+ * - 针对腾讯云的拉流地址,可使用直播时移功能,能够实现直播观看与时移观看的无缝切换。
+ * - 支持自定义的音视频数据处理,让您可以根据项目需要处理直播流中的音视频数据后,进行渲染以及播放。
+ */
+@interface TXLivePlayer : NSObject
+
+/////////////////////////////////////////////////////////////////////////////////
+//
+//                      (一)SDK 基础函数
+//
+/////////////////////////////////////////////////////////////////////////////////
+
+/// @name SDK 基础函数
+/// @{
+/**
+ * 1.1 设置播放回调,见 “TXLivePlayListener.h” 文件中的详细定义
+ */
+@property(nonatomic, weak) id <TXLivePlayListener> delegate;
+
+/**
+ * 1.2 设置视频处理回调,见 “TXVideoCustomProcessDelegate.h” 文件中的详细定义
+ */
+@property(nonatomic, weak) id <TXVideoCustomProcessDelegate> videoProcessDelegate;
+
+/**
+ * 1.3 设置音频处理回调,见 “TXAudioRawDataDelegate.h” 文件中的详细定义
+ */
+@property(nonatomic, weak) id <TXAudioRawDataDelegate> audioRawDataDelegate;
+
+/**
+ * 1.4 是否开启硬件加速,默认值:NO
+ */
+@property(nonatomic, assign) BOOL enableHWAcceleration;
+
+/**
+ * 1.5 设置 TXLivePlayConfig 播放配置项,见 “TXLivePlayConfig.h” 文件中的详细定义
+ */
+@property(nonatomic, copy) TXLivePlayConfig *config;
+
+
+#if TARGET_OS_IPHONE
+/**
+ * 1.6 设置短视频录制回调,见 “TXLiveRecordListener.h” 文件中的详细定义
+ */
+@property (nonatomic, weak) id<TXLiveRecordListener> recordDelegate;
+
+/**
+ * 1.7 startPlay 后是否立即播放,默认 YES,只有点播有效
+ */
+@property (nonatomic) BOOL isAutoPlay;
+
+#endif
+
+/// @}
+
+/////////////////////////////////////////////////////////////////////////////////
+//
+//                      (二)播放基础接口
+//
+/////////////////////////////////////////////////////////////////////////////////
+
+/// @name 播放基础接口
+/// @{
+/**
+ * 2.1 创建 Video 渲染 View,该控件承载着视频内容的展示。
+ *
+ * 变更历史:1.5.2版本将参数 frame 废弃,设置此参数无效,控件大小与参数 view 的大小保持一致,如需修改控件的大小及位置,请调整父 view 的大小及位置。 参考文档:[绑定渲染界面](https://www.qcloud.com/doc/api/258/4736#step-3.3A-.E7.BB.91.E5.AE.9A.E6.B8.B2.E6.9F.93.E7.95.8C.E9.9D.A2)
+ *
+ * @param frame Widget 在父 view 中的 frame
+ * @param view  父 view
+ * @param idx   Widget 在父 view 上 的层级位置
+ */
+- (void)setupVideoWidget:(CGRect)frame containView:(TXView *)view insertIndex:(unsigned int)idx;
+
+/*
+ * 修改 VideoWidget frame
+ * 变更历史:1.5.2版本将此方法废弃,调用此方法无效,如需修改控件的大小及位置,请调整父 view 的大小及位置
+ * 参考文档:https://www.qcloud.com/doc/api/258/4736#step-3.3A-.E7.BB.91.E5.AE.9A.E6.B8.B2.E6.9F.93.E7.95.8C.E9.9D.A2
+ */
+//- (void)resetVideoWidgetFrame:(CGRect)frame;
+
+/**
+ * 2.2 移除 Video 渲染 Widget
+ */
+- (void)removeVideoWidget;
+
+/**
+ * 2.3 启动从指定 URL 播放 RTMP 音视频流
+ *
+ * @param url 完整的 URL(如果播放的是本地视频文件,这里传本地视频文件的完整路径)
+ * @param playType 播放类型
+ * @return 0表示成功,其它为失败
+ */
+- (int)startPlay:(NSString *)url type:(TX_Enum_PlayType)playType;
+
+/**
+ * 2.4 停止播放音视频流
+ *
+ * @return 0:成功;其它:失败
+ */
+- (int)stopPlay;
+
+/**
+ * 2.5 是否正在播放
+ *
+ * @return YES 拉流中,NO 没有拉流
+ */
+- (BOOL)isPlaying;
+
+/**
+ * 2.6 暂停播放
+ *
+ * 适用于点播,直播(此接口会暂停数据拉流,不会销毁播放器,暂停后,播放器会显示最后一帧数据图像)
+ */
+- (void)pause;
+
+/**
+ * 2.6 继续播放,适用于点播,直播
+ */
+- (void)resume;
+
+/// @}
+
+/////////////////////////////////////////////////////////////////////////////////
+//
+//                      (三)视频相关接口
+//
+/////////////////////////////////////////////////////////////////////////////////
+
+/// @name 视频相关接口
+/// @{
+/**
+ * 3.1 设置画面的方向
+ *
+ * @param rotation 方向
+ * @see TX_Enum_Type_HomeOrientation
+ */
+- (void)setRenderRotation:(TX_Enum_Type_HomeOrientation)rotation;
+
+/**
+ * 3.2 设置画面的裁剪模式
+ *
+ * @param renderMode 裁剪
+ * @see TX_Enum_Type_RenderMode
+ */
+- (void)setRenderMode:(TX_Enum_Type_RenderMode)renderMode;
+
+/**
+ * 3.3 截屏
+ *
+ * @param snapshotCompletionBlock 通过回调返回当前图像
+ */
+- (void)snapshot:(void (^)(TXImage *))snapshotCompletionBlock;
+
+/// @}
+
+/////////////////////////////////////////////////////////////////////////////////
+//
+//                      (四)音频相关接口
+//
+/////////////////////////////////////////////////////////////////////////////////
+
+/// @name 音频相关接口
+/// @{
+/**
+ * 4.1 设置静音
+ */
+- (void)setMute:(BOOL)bEnable;
+
+/**
+ * 4.2 设置音量
+ *
+ * @param volume 音量大小,取值范围0 - 100
+ */
+- (void)setVolume:(int)volume;
+
+#if TARGET_OS_IPHONE
+/**
+ * 4.3 设置声音播放模式(切换扬声器,听筒)
+ * @param audioRoute 声音播放模式
+ */
++ (void)setAudioRoute:(TXAudioRouteType)audioRoute;
+#endif
+
+/**
+ * 4.4 设置音量大小回调接口
+ *
+ * @param volumeEvaluationListener 音量大小回调接口,音量取值范围0 - 100
+ */
+- (void)setAudioVolumeEvaluationListener:(void(^)(int))volumeEvaluationListener;
+
+/**
+ * 4.5 启用音量大小提示
+ *
+ * 开启后会在 volumeEvaluationListener 中获取到 SDK 对音量大小值的评估。
+ *
+ * @param interval 决定了 volumeEvaluationListener 回调的触发间隔,单位为ms,最小间隔为100ms,如果小于等于0则会关闭回调,建议设置为300ms;
+ */
+- (void)enableAudioVolumeEvaluation:(NSUInteger)interval;
+
+/// @}
+
+/////////////////////////////////////////////////////////////////////////////////
+//
+//                      (五)直播时移相关接口
+//
+/////////////////////////////////////////////////////////////////////////////////
+
+/// @name 直播时移相关接口
+/// @{
+/**
+ * 5.1 直播时移准备,拉取该直播流的起始播放时间。
+ *
+ * 使用时移功能需在播放开始后调用此方法,否则时移失败。时移的使用请参考文档 [超级播放器](https://cloud.tencent.com/document/product/881/20208#.E6.97.B6.E7.A7.BB.E6.92.AD.E6.94.BE)
+ *
+ * @warning 非腾讯云直播地址不能时移
+ *
+ * @param domain 时移域名
+ * @param bizId 流 bizId
+ *
+ * @return 0:OK;-1:无播放地址;-2:appId 未配置
+ */
+- (int)prepareLiveSeek:(NSString*)domain bizId:(NSInteger)bizId;
+
+/**
+ * 5.2 停止时移播放,返回直播
+ *
+ * @return 0:成功;其它:失败
+ */
+- (int)resumeLive;
+
+#if TARGET_OS_IPHONE
+/**
+ * 5.3 播放跳转到音视频流某个时间
+ * @param time 流时间,单位为秒
+ * @return 0:成功;其它:失败
+ */
+- (int)seek:(float)time;
+#endif
+
+/// @}
+
+/////////////////////////////////////////////////////////////////////////////////
+//
+//                      (六)视频录制相关接口
+//
+/////////////////////////////////////////////////////////////////////////////////
+
+/// @name 视频录制相关接口
+/// @{
+#if TARGET_OS_IPHONE
+/**
+ * 6.1 开始录制短视频
+ *
+ * @param recordType 参见 TXRecordType 定义
+ * @return 0:成功;1:正在录制短视频;-2:videoRecorder 初始化失败。
+ */
+- (int)startRecord:(TXRecordType)recordType;
+
+/**
+ * 6.2 结束录制短视频
+ *
+ * @return 0:成功;1:不存在录制任务;-2:videoRecorder 未初始化。
+ */
+- (int)stopRecord;
+
+/**
+ * 6.3 设置播放速率
+ *
+ * @param rate 正常速度为1.0;小于为慢速;大于为快速。最大建议不超过2.0
+ */
+- (void)setRate:(float)rate;
+#endif
+
+/// @}
+
+/////////////////////////////////////////////////////////////////////////////////
+//
+//                      (七)更多实用接口
+//
+/////////////////////////////////////////////////////////////////////////////////
+
+/// @name 更多实用接口
+/// @{
+/**
+ * 7.1 设置状态浮层 view 在渲染 view 上的边距
+ *
+ * @param margin 边距
+ */
+- (void)setLogViewMargin:(TXEdgeInsets)margin;
+
+/**
+ * 7.2 是否显示播放状态统计及事件消息浮层 view
+ *
+ * @param isShow 是否显示
+ */
+- (void)showVideoDebugLog:(BOOL)isShow;
+
+/**
+ * 7.3 FLV 直播无缝切换
+ *
+ * @param playUrl 播放地址
+ * @return 0:成功;其它:失败
+ * @warning playUrl 必须是当前播放直播流的不同清晰度,切换到无关流地址可能会失败
+ */
+- (int)switchStream:(NSString *)playUrl;
+
+/**
+ * 7.4 调用实验性 API 接口
+ *
+ * @note 该接口用于调用一些实验性功能
+ * @param jsonStr 接口及参数描述的 JSON 字符串
+ */
+- (void)callExperimentalAPI:(NSString*)jsonStr;
+
+/// @}
+
+@end
+/// @}

+ 27 - 0
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLiveRecordListener.h

@@ -0,0 +1,27 @@
+#import "TXLiveRecordTypeDef.h"
+
+
+/**
+ * 短视频录制回调定义
+ */
+@protocol TXLiveRecordListener <NSObject>
+@optional
+
+/**
+ * 短视频录制进度
+ */
+-(void) onRecordProgress:(NSInteger)milliSecond;
+
+/**
+ * 短视频录制完成
+ */
+-(void) onRecordComplete:(TXRecordResult*)result;
+
+/**
+ * 短视频录制事件通知
+ */
+-(void) onRecordEvent:(NSDictionary*)evt;
+
+@end
+
+

+ 36 - 0
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLiveRecordTypeDef.h

@@ -0,0 +1,36 @@
+#import <Foundation/Foundation.h>
+#import "TXLiveSDKTypeDef.h"
+
+/// PlayRecord 录制类型定义
+typedef NS_ENUM(NSInteger, TXRecordType)
+{
+    ///视频源为正在播放的视频流
+    RECORD_TYPE_STREAM_SOURCE                       = 1,            
+};
+
+
+
+/// 录制结果错误码定义
+typedef NS_ENUM(NSInteger, TXRecordResultCode)
+{
+    /// 录制成功(业务层主动结束录制)
+    RECORD_RESULT_OK                                = 0,    
+    /// 录制成功(sdk自动结束录制,可能原因:1,app进入后台,2,app被闹钟或电话打断,3,网络断连接)
+    RECORD_RESULT_OK_INTERRUPT                      = 1,    
+    /// 录制失败
+    RECORD_RESULT_FAILED                            = 1001, 
+};
+
+
+/// 录制结果
+@interface TXRecordResult : NSObject
+/// 错误码
+@property (nonatomic, assign) TXRecordResultCode    retCode;        
+/// 错误描述信息
+@property (nonatomic, strong) NSString*             descMsg;        
+/// 视频文件path
+@property (nonatomic, strong) NSString*             videoPath;      
+/// 视频封面
+@property (nonatomic, strong) TXImage*              coverImage;     
+@end
+

+ 103 - 0
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLiveSDKEventDef.h

@@ -0,0 +1,103 @@
+#ifndef __TX_LIVE_SDK_EVENT_DEF_H__
+#define __TX_LIVE_SDK_EVENT_DEF_H__
+
+#include "TXLiteAVCode.h"
+
+enum EventID
+{
+    /**********************************************************************************
+     *                               推流事件列表
+     **********************************************************************************/
+    PUSH_EVT_CONNECT_SUCC                       = EVT_RTMP_PUSH_CONNECT_SUCC,           ///< 直播: 已经连接RTMP推流服务器
+    PUSH_EVT_PUSH_BEGIN                         = EVT_RTMP_PUSH_BEGIN,                  ///< 直播: 已经与RTMP服务器握手完毕,开始推流
+    PUSH_EVT_OPEN_CAMERA_SUCC                   = EVT_CAMERA_START_SUCC,                ///< 打开摄像头成功
+    PUSH_EVT_CHANGE_RESOLUTION                  = EVT_UP_CHANGE_RESOLUTION,             ///< 推流动态调整分辨率
+    PUSH_EVT_CHANGE_BITRATE                     = EVT_UP_CHANGE_BITRATE,                ///< 推流动态调整码率
+    PUSH_EVT_FIRST_FRAME_AVAILABLE              = EVT_FIRST_FRAME_AVAILABLE,            ///< 首帧画面采集完成
+    PUSH_EVT_START_VIDEO_ENCODER                = EVT_START_VIDEO_ENCODER,              ///< 编码器启动
+    PUSH_EVT_ROOM_IN                            = EVT_ROOM_ENTER,                       ///< 已经在webrtc房间里面,进房成功后通知
+    PUSH_EVT_ROOM_IN_FAILED                     = EVT_ROOM_ENTER_FAILED,                ///< 进房失败通知
+    PUSH_EVT_ROOM_OUT                           = EVT_ROOM_EXIT,                        ///< 不在webrtc房间里面,进房失败或者中途退出房间时通知
+    PUSH_EVT_ROOM_USERLIST                      = EVT_ROOM_USERLIST,                    ///< 下发webrtc房间成员列表(不包括自己)
+    PUSH_EVT_ROOM_NEED_REENTER                  = EVT_ROOM_NEED_REENTER,                ///< WiFi切换到4G会触发断线重连,此时需要重新进入webrtc房间(拉取最优的服务器地址)
+    PUSH_EVT_ROOM_USER_ENTER                    = EVT_ROOM_USER_ENTER,                  ///< 进房通知
+    PUSH_EVT_ROOM_USER_EXIT                     = EVT_ROOM_USER_EXIT,                   ///< 退房通知
+    PUSH_EVT_ROOM_USER_VIDEO_STATE              = EVT_ROOM_USER_VIDEO_STATE,            ///< 视频状态位变化通知
+    PUSH_EVT_ROOM_USER_AUDIO_STATE              = EVT_ROOM_USER_AUDIO_STATE,            ///< 音频状态位变化通知
+    
+    PUSH_ERR_OPEN_CAMERA_FAIL                   = ERR_CAMERA_START_FAIL,                ///< 打开摄像头失败
+    PUSH_ERR_OPEN_MIC_FAIL                      = ERR_MIC_START_FAIL,                   ///< 打开麦克风失败
+    PUSH_ERR_VIDEO_ENCODE_FAIL                  = ERR_VIDEO_ENCODE_FAIL,                ///< 视频编码失败
+    PUSH_ERR_AUDIO_ENCODE_FAIL                  = ERR_AUDIO_ENCODE_FAIL,                ///< 音频编码失败
+    PUSH_ERR_UNSUPPORTED_RESOLUTION             = ERR_UNSUPPORTED_RESOLUTION,           ///< 不支持的视频分辨率
+    PUSH_ERR_UNSUPPORTED_SAMPLERATE             = ERR_UNSUPPORTED_SAMPLERATE,           ///< 不支持的音频采样率
+    PUSH_ERR_NET_DISCONNECT                     = ERR_RTMP_PUSH_NET_DISCONNECT,         ///< 网络断连,且经多次重连抢救无效,可以放弃治疗,更多重试请自行重启推流
+    PUSH_ERR_AUDIO_SYSTEM_NOT_WORK              = -1308,                                ///< 系统异常,录音失败
+    PUSH_ERR_INVALID_ADDRESS                    = ERR_RTMP_PUSH_INVALID_ADDRESS,        ///< 推流地址非法
+    
+    PUSH_WARNING_NET_BUSY                       = WARNING_NET_BUSY,                     ///< 网络状况不佳:上行带宽太小,上传数据受阻
+    PUSH_WARNING_RECONNECT                      = WARNING_RTMP_SERVER_RECONNECT,        ///< 网络断连, 已启动自动重连 (自动重连连续失败超过三次会放弃)
+    PUSH_WARNING_HW_ACCELERATION_FAIL           = WARNING_HW_ENCODER_START_FAIL,        ///< 硬编码启动失败,采用软编码
+    PUSH_WARNING_VIDEO_ENCODE_FAIL              = 1104,                                 ///< 视频编码失败,非致命错,内部会重启编码器
+    PUSH_WARNING_BEAUTYSURFACE_VIEW_INIT_FAIL   = 1105,                                 ///< 视频编码码率异常,警告
+    PUSH_WARNING_VIDEO_ENCODE_BITRATE_OVERFLOW  = 1106,                                 ///< 视频编码码率异常,警告
+    PUSH_WARNING_DNS_FAIL                       = WARNING_RTMP_DNS_FAIL,                ///< RTMP -DNS解析失败
+    PUSH_WARNING_SEVER_CONN_FAIL                = WARNING_RTMP_SEVER_CONN_FAIL,         ///< RTMP服务器连接失败
+    PUSH_WARNING_SHAKE_FAIL                     = WARNING_RTMP_SHAKE_FAIL,              ///< RTMP服务器握手失败
+    PUSH_WARNING_SERVER_DISCONNECT              = WARNING_RTMP_SERVER_BREAK_CONNECT,    ///< RTMP服务器主动断开,请检查推流地址的合法性或防盗链有效期
+    PUSH_WARNING_READ_WRITE_FAIL                = WARNING_RTMP_READ_WRITE_FAIL,         ///< RTMP 读/写失败,将会断开连接。
+
+    /*内部事件*/INNER_EVT_SET_BITRATE_4_SCREEN_CAPTURE = 100001,                         ///< 动态设置录屏编码码率
+    /*内部事件*/INNER_EVT_BGM_PLAY_FINISH              = 100002,                         ///< BGM播放完毕
+    
+    
+
+    /**********************************************************************************
+     *                               播放事件列表
+     **********************************************************************************/
+    PLAY_EVT_CONNECT_SUCC                       = EVT_PLAY_LIVE_STREAM_CONNECT_SUCC,    ///< 直播,已经连接RTMP拉流服务器
+    PLAY_EVT_RTMP_STREAM_BEGIN                  = EVT_PLAY_LIVE_STREAM_BEGIN,           ///< 直播,已经与RTMP服务器握手完毕,开始拉流
+    PLAY_EVT_RCV_FIRST_I_FRAME                  = EVT_RENDER_FIRST_I_FRAME,             ///< 渲染首个视频数据包(IDR)
+    PLAY_EVT_RCV_FIRST_AUDIO_FRAME              = EVT_AUDIO_JITTER_STATE_FIRST_PLAY,    ///< 音频首次播放
+    PLAY_EVT_PLAY_BEGIN                         = EVT_VIDEO_PLAY_BEGIN,                 ///< 视频播放开始
+    PLAY_EVT_PLAY_PROGRESS                      = EVT_VIDEO_PLAY_PROGRESS,              ///< 视频播放进度
+    PLAY_EVT_PLAY_END                           = EVT_VIDEO_PLAY_END,                   ///< 视频播放结束
+    PLAY_EVT_PLAY_LOADING                       = EVT_VIDEO_PLAY_LOADING,               ///< 视频播放loading
+    PLAY_EVT_START_VIDEO_DECODER                = EVT_START_VIDEO_DECODER,              ///< 解码器启动
+    PLAY_EVT_CHANGE_RESOLUTION                  = EVT_DOWN_CHANGE_RESOLUTION,           ///< 视频分辨率改变
+    PLAY_EVT_GET_PLAYINFO_SUCC                  = EVT_GET_VODFILE_MEDIAINFO_SUCC,       ///< 获取点播文件信息成功
+    PLAY_EVT_CHANGE_ROTATION                    = EVT_VIDEO_CHANGE_ROTATION,            ///< MP4视频旋转角度
+    PLAY_EVT_GET_MESSAGE                        = EVT_PLAY_GET_MESSAGE,                 ///< 消息事件
+    PLAY_EVT_VOD_PLAY_PREPARED                  = EVT_VOD_PLAY_PREPARED,                ///< 点播,视频加载完毕
+    PLAY_EVT_VOD_LOADING_END                    = EVT_VOD_PLAY_LOADING_END,             ///< 点播,loading结束
+    PLAY_EVT_STREAM_SWITCH_SUCC                 = EVT_PLAY_LIVE_STREAM_SWITCH_SUCC,     ///< 直播,切流成功(切流可以播放不同画面大小的视频)
+    PLAY_EVT_GET_METADATA                       = EVT_PLAY_GET_METADATA,                ///< TXLivePlayer 接收到视频流中的 metadata 头信息(一条视频流仅触发一次)
+    PLAY_EVT_GET_FLVSESSIONKEY                  = EVT_PLAY_GET_FLVSESSIONKEY,           ///< TXLivePlayer 接收到http响应头中的 flvSessionKey 信息
+    
+    PLAY_ERR_NET_DISCONNECT                     = ERR_PLAY_LIVE_STREAM_NET_DISCONNECT,  ///< 直播,网络断连,且经多次重连抢救无效,可以放弃治疗,更多重试请自行重启播放
+
+    PLAY_ERR_GET_RTMP_ACC_URL_FAIL              = ERR_GET_RTMP_ACC_URL_FAIL,            ///< 直播,获取加速拉流地址失败。这是由于您传给 liveplayer 的加速流地址中没有携带 txTime 和 txSecret 签名,或者是签名计算的不对。出现这个错误时,liveplayer 会放弃拉取加速流转而拉取 CDN 上的视频流,从而导致延迟很大。
+    PLAY_ERR_FILE_NOT_FOUND                     = ERR_FILE_NOT_FOUND,                   ///< 播放文件不存在
+    PLAY_ERR_HEVC_DECODE_FAIL                   = ERR_HEVC_DECODE_FAIL,                 ///< H265解码失败
+    PLAY_ERR_HLS_KEY                            = ERR_VOD_DECRYPT_FAIL,                 ///< HLS解码key获取失败
+    PLAY_ERR_GET_PLAYINFO_FAIL                  = ERR_GET_VODFILE_MEDIAINFO_FAIL,       ///< 获取点播文件信息失败
+    PLAY_ERR_STREAM_SWITCH_FAIL                 = ERR_PLAY_LIVE_STREAM_SWITCH_FAIL,     ///< 直播,切流失败(切流可以播放不同画面大小的视频)
+    
+    PLAY_WARNING_VIDEO_DECODE_FAIL              = WARNING_VIDEO_FRAME_DECODE_FAIL,      ///< 当前视频帧解码失败
+    PLAY_WARNING_AUDIO_DECODE_FAIL              = WARNING_AUDIO_FRAME_DECODE_FAIL,      ///< 当前音频帧解码失败
+    PLAY_WARNING_RECONNECT                      = WARNING_LIVE_STREAM_SERVER_RECONNECT, ///< 网络断连, 已启动自动重连 (自动重连连续失败超过三次会放弃)
+    PLAY_WARNING_RECV_DATA_LAG                  = WARNING_RECV_DATA_LAG,                ///< 网络来包不稳:可能是下行带宽不足,或由于主播端出流不均匀
+    PLAY_WARNING_VIDEO_PLAY_LAG                 = WARNING_VIDEO_PLAY_LAG,               ///< 当前视频播放出现卡顿(用户直观感受)
+    PLAY_WARNING_HW_ACCELERATION_FAIL           = WARNING_HW_DECODER_START_FAIL,        ///< 硬解启动失败,采用软解
+    PLAY_WARNING_VIDEO_DISCONTINUITY            = 2107,                                 ///< 当前视频帧不连续,可能丢帧
+    PLAY_WARNING_FIRST_IDR_HW_DECODE_FAIL       = WARNING_VIDEO_DECODER_HW_TO_SW,       ///< 当前流硬解第一个I帧失败,SDK自动切软解
+    PLAY_WARNING_DNS_FAIL                       = WARNING_RTMP_DNS_FAIL,                ///< RTMP -DNS解析失败
+    PLAY_WARNING_SEVER_CONN_FAIL                = WARNING_RTMP_SEVER_CONN_FAIL,         ///< RTMP服务器连接失败
+    PLAY_WARNING_SHAKE_FAIL                     = WARNING_RTMP_SHAKE_FAIL,              ///< RTMP服务器握手失败
+    PLAY_WARNING_SERVER_DISCONNECT              = WARNING_RTMP_SERVER_BREAK_CONNECT,    ///< RTMP服务器主动断开
+    PLAY_WARNING_READ_WRITE_FAIL                = WARNING_RTMP_READ_WRITE_FAIL,         ///< RTMP 读/写失败,将会断开连接。
+    
+    /*UGC*/UGC_WRITE_FILE_FAIL                  = 4001,                                 ///< UGC写文件失败
+};
+
+#endif // __TX_LIVE_SDK_TYPE_DEF_H__

+ 357 - 0
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXLiveSDKTypeDef.h

@@ -0,0 +1,357 @@
+#ifndef __TX_LIVE_SDK_TYPE_DEF_H__
+#define __TX_LIVE_SDK_TYPE_DEF_H__
+
+#include "TXLiveSDKEventDef.h"
+#import <Foundation/Foundation.h>
+
+#if TARGET_OS_IPHONE
+#import <UIKit/UIKit.h>
+typedef UIView TXView;
+typedef UIImage TXImage;
+typedef UIEdgeInsets TXEdgeInsets;
+#elif TARGET_OS_MAC
+#import <AppKit/AppKit.h>
+typedef NSView TXView;
+typedef NSImage TXImage;
+typedef NSEdgeInsets TXEdgeInsets;
+#endif
+
+
+
+/////////////////////////////////////////////////////////////////////////////////
+//
+//                    【视频相关枚举值定义】
+//                   
+/////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * 1.1 视频分辨率
+ * 
+ * 在普通模式下,TXLivePusher 只支持三种固定的分辨率,即:360 × 640、540 × 960 以及 720 × 1280。
+ * 
+ *【如何横屏推流】
+ * 如果希望使用 640 × 360、960 × 540、1280 × 720 这样的横屏分辨率,需要设置 TXLivePushConfig 中的 homeOrientation 属性,
+ * 并使用 TXLivePusher 中的 setRenderRotation 接口进行画面旋转。
+ *
+ *【自定义分辨率】
+ * 如果希望使用其他分辨率,可以设置 TXLivePushConfig 中的 customModeType 为 CUSTOM_MODE_VIDEO_CAPTURE,
+ * 自己采集 SampleBuffer 送给 TXLivePusher 的 sendVideoSampleBuffer 接口。
+ *
+ *【建议的分辨率】
+ * 手机直播场景下最常用的分辨率为 9:16 的竖屏分辨率 540 × 960。
+ * 从清晰的角度,540 × 960 比 360 × 640 要清晰,同时跟 720 × 1280 相当。
+ * 从性能的角度,540 × 960 可以避免前置摄像头开启 720 × 1280 的采集分辨率,对于美颜开销很大的场景能节省不少的计算量。
+ */
+typedef NS_ENUM(NSInteger, TX_Enum_Type_VideoResolution) {
+
+    /// 竖屏分辨率,宽高比为 9:16
+    VIDEO_RESOLUTION_TYPE_360_640      = 0,   ///< 建议码率 800kbps
+    VIDEO_RESOLUTION_TYPE_540_960      = 1,   ///< 建议码率 1200kbps
+    VIDEO_RESOLUTION_TYPE_720_1280     = 2,   ///< 建议码率 1800kbps
+    VIDEO_RESOLUTION_TYPE_1080_1920    = 30,  ///< 建议码率 3000kbps
+
+
+    /// 如下均为内建分辨率,为 SDK 内部使用,不支持通过接口进行设置
+    VIDEO_RESOLUTION_TYPE_640_360      = 3,   
+    VIDEO_RESOLUTION_TYPE_960_540      = 4,   
+    VIDEO_RESOLUTION_TYPE_1280_720     = 5,   
+    VIDEO_RESOLUTION_TYPE_1920_1080    = 31,
+
+    VIDEO_RESOLUTION_TYPE_320_480      = 6,
+    VIDEO_RESOLUTION_TYPE_180_320      = 7,
+    VIDEO_RESOLUTION_TYPE_270_480      = 8,
+    VIDEO_RESOLUTION_TYPE_320_180      = 9,
+    VIDEO_RESOLUTION_TYPE_480_270      = 10,
+    
+    VIDEO_RESOLUTION_TYPE_240_320      = 11,
+    VIDEO_RESOLUTION_TYPE_360_480      = 12,
+    VIDEO_RESOLUTION_TYPE_480_640      = 13,
+    VIDEO_RESOLUTION_TYPE_320_240      = 14,
+    VIDEO_RESOLUTION_TYPE_480_360      = 15,
+    VIDEO_RESOLUTION_TYPE_640_480      = 16,
+    
+    VIDEO_RESOLUTION_TYPE_480_480      = 17,
+    VIDEO_RESOLUTION_TYPE_270_270      = 18,
+    VIDEO_RESOLUTION_TYPE_160_160      = 19,
+};
+
+/**
+ * 1.2 画面质量挡位
+ *
+ * 如果您希望调整直播的编码参数,建议您直接使用 TXLivePusher 提供的 setVideoQuality 接口。
+ * 由于视频编码参数中的分辨率,码率和帧率对最终效果都有着复杂的影响,如果您之前没有相关操作经验,不建议直接修改这些编码参数。
+ * 我们在 setVideoQuality 接口中提供了如下几个挡位供您选择:
+ *
+ *  1. 标清:采用 360 × 640 的分辨率,码率调控范围 300kbps - 800kbps,关闭网络自适应时的码率为 800kbps,适合网络较差的直播环境。
+ *  2. 高清:采用 540 × 960 的分辨率,码率调控范围 600kbps - 1500kbps,关闭网络自适应时的码率为 1200kbps,常规手机直播的推荐挡位。
+ *  3. 超清:采用 720 × 1280 的分辨率,码率调控范围 600kbps - 1800kbps,关闭网络自适应时的码率为 1800kbps,能耗高,但清晰度较标清提升并不明显。
+ *  4. 连麦(大主播):主播从原来的“推流状态”进入“连麦状态”后,可以通过 setVideoQuality 接口调整自 MAIN_PUBLISHER 挡位。
+ *  5. 连麦(小主播):观众从原来的“播放状态”进入“连麦状态”后,可以通过 setVideoQuality 接口调整自 SUB_PUBLISHER 挡位。
+ *  6. 视频通话:该选项后续会逐步废弃,如果您希望实现纯视频通话而非直播功能,推荐使用腾讯云 [TRTC](https://cloud.tencent.com/product/trtc) 服务。
+ *
+ * 【推荐设置】如果您对整个平台的清晰度要求比较高,推荐使用 setVideoQuality(HIGH_DEFINITION, NO, NO) 的组合。
+ *             如果您的主播有很多三四线城市的网络适配要求,推荐使用 setVideoQuality(HIGH_DEFINITION, YES, NO) 的组合。
+ *  
+ * @note 在开启硬件加速后,您可能会发现诸如 368 × 640 或者 544 × 960 这样的“不完美”分辨率。
+ *       这是由于部分硬编码器要求像素能被 16 整除所致,属于正常现象,您可以通过播放端的填充模式解决“小黑边”问题。
+ */
+typedef NS_ENUM(NSInteger, TX_Enum_Type_VideoQuality) {
+    VIDEO_QUALITY_STANDARD_DEFINITION       = 1,    ///< 标清:采用 360 × 640 的分辨率   
+    VIDEO_QUALITY_HIGH_DEFINITION           = 2,    ///< 高清:采用 540 × 960 的分辨率  
+    VIDEO_QUALITY_SUPER_DEFINITION          = 3,    ///< 超清:采用 720 × 1280 的分辨率
+    VIDEO_QUALITY_ULTRA_DEFINITION          = 7,    ///< 蓝光:采用 1080 × 1920 的分辨率
+    VIDEO_QUALITY_LINKMIC_MAIN_PUBLISHER    = 4,    ///< 连麦场景下的大主播使用
+    VIDEO_QUALITY_LINKMIC_SUB_PUBLISHER     = 5,    ///< 连麦场景下的小主播(连麦的观众)使用
+    VIDEO_QUALITY_REALTIME_VIDEOCHAT        = 6,    ///< 纯视频通话场景使用(已废弃)
+};
+
+/**
+ * 1.3 画面旋转方向
+ */
+typedef NS_ENUM(NSInteger, TX_Enum_Type_HomeOrientation) {
+    HOME_ORIENTATION_RIGHT     = 0,    ///< HOME 键在右边,横屏模式      
+    HOME_ORIENTATION_DOWN      = 1,    ///< HOME 键在下面,手机直播中最常见的竖屏直播模式                  
+    HOME_ORIENTATION_LEFT      = 2,    ///< HOME 键在左边,横屏模式                   
+    HOME_ORIENTATION_UP        = 3,    ///< HOME 键在上边,竖屏直播(适合小米 MIX2)                     
+};
+
+/**
+ * 1.4 画面填充模式
+ */
+typedef NS_ENUM(NSInteger, TX_Enum_Type_RenderMode) {
+    
+    RENDER_MODE_FILL_SCREEN    = 0,    ///< 图像铺满屏幕,不留黑边,如果图像宽高比不同于屏幕宽高比,部分画面内容会被裁剪掉。
+    RENDER_MODE_FILL_EDGE      = 1,    ///< 图像适应屏幕,保持画面完整,但如果图像宽高比不同于屏幕宽高比,会有黑边的存在。
+};
+
+/**
+ * 1.5 美颜风格
+ */
+typedef NS_ENUM(NSInteger, TX_Enum_Type_BeautyStyle) {
+    BEAUTY_STYLE_SMOOTH        = 0,    ///< 光滑,磨皮程度较高,更适合秀场直播类场景下使用。
+    BEAUTY_STYLE_NATURE        = 1,    ///< 自然,磨皮算法会最大限度保留皮肤细节。
+    BEAUTY_STYLE_PITU          = 2,    ///< 由上海优图实验室提供的美颜算法,磨皮效果介于光滑和自然之间,比光滑保留更多皮肤细节,比自然磨皮程度更高。
+};
+
+/**
+ * 1.6 美颜程度,取值范围1 - 9,该枚举值定义了关闭和最大值。
+ */
+typedef NS_ENUM(NSInteger, TX_Enum_Type_BeautyFilterDepth) {
+    BEAUTY_FILTER_DEPTH_CLOSE   = 0,   ///< 关闭美颜
+    BEAUTY_FILTER_DEPTH_MAX     = 9,   ///< 最大美颜强度
+};
+
+
+/**
+ * 1.6 网络自适应算法,推荐选项:AUTO_ADJUST_LIVEPUSH_STRATEGY
+ */
+typedef NS_ENUM(NSInteger, TX_Enum_Type_AutoAdjustStrategy) {
+    AUTO_ADJUST_NONE                                 = -1,    ///< 非法数值,用于 SDK 内部做合法性检查
+
+    AUTO_ADJUST_LIVEPUSH_STRATEGY                    =  0,    ///< 最适合直播模式下的流控算法
+    AUTO_ADJUST_LIVEPUSH_RESOLUTION_STRATEGY         =  1,    ///< 不推荐:SDK 内部会调整视频分辨率,如果有 H5 分享的需求请勿使用
+    AUTO_ADJUST_REALTIME_VIDEOCHAT_STRATEGY          =  5,    ///< 待废弃,请使用腾讯云 TRTC 服务
+
+    AUTO_ADJUST_BITRATE_STRATEGY_1                   =  0,    ///< 已经废弃  
+    AUTO_ADJUST_BITRATE_RESOLUTION_STRATEGY_1        =  1,    ///< 已经废弃  
+    AUTO_ADJUST_BITRATE_STRATEGY_2                   =  2,    ///< 已经废弃  
+    AUTO_ADJUST_BITRATE_RESOLUTION_STRATEGY_2        =  3,    ///< 已经废弃  
+    AUTO_ADJUST_REALTIME_BITRATE_STRATEGY            =  4,    ///< 已经废弃
+    AUTO_ADJUST_REALTIME_BITRATE_RESOLUTION_STRATEGY =  5,    ///< 已经废弃 
+};
+
+/**
+ * 1.7 视频帧的数据格式(未压缩前的)
+ */
+typedef NS_ENUM(NSInteger, TXVideoType) {
+    
+    VIDEO_TYPE_420SP          = 1,   ///< Android 视频采集格式,PixelFormat.YCbCr_420_SP 17  
+    VIDEO_TYPE_420YpCbCr      = 2,   ///< iOS 视频采集格式,kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange  
+    VIDEO_TYPE_420P           = 3,   ///< yuv420p格式 
+    VIDEO_TYPE_BGRA8888       = 4,   ///< BGRA8888
+    VIDEO_TYPE_RGBA8888       = 5,   ///< RGBA8888  
+    VIDEO_TYPE_NV12           = 6,   ///< NV12(iOS) 
+};
+
+/**
+ * 1.8 本地视频预览镜像类型
+ *
+ * iOS 的本地画面提供三种设置模式
+ */
+typedef NS_ENUM(NSUInteger, TXLocalVideoMirrorType) {
+    LocalVideoMirrorType_Auto       = 0,       ///< 前置摄像头镜像,后置摄像头不镜像
+    LocalVideoMirrorType_Enable     = 1,       ///< 前后置摄像头画面均镜像
+    LocalVideoMirrorType_Disable    = 2,       ///< 前后置摄像头画面均不镜像
+};
+
+/////////////////////////////////////////////////////////////////////////////////
+//
+//                    【音频相关枚举值定义】
+//                   
+/////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * 2.1 音频采样率
+ */
+typedef NS_ENUM(NSInteger, TX_Enum_Type_AudioSampleRate) {
+    
+    AUDIO_SAMPLE_RATE_8000       = 0,     ///< 8k采样率
+    AUDIO_SAMPLE_RATE_16000      = 1,     ///< 16k采样率
+    AUDIO_SAMPLE_RATE_32000      = 2,     ///< 32k采样率
+    AUDIO_SAMPLE_RATE_44100      = 3,     ///< 44.1k采样率
+    AUDIO_SAMPLE_RATE_48000      = 4,     ///< 48k采样率
+};
+
+/**
+ * 2.2 混响类型
+ */
+typedef NS_ENUM(NSInteger, TXReverbType) {
+    REVERB_TYPE_0                = 0,     ///< 关闭混响 
+    REVERB_TYPE_1                = 1,     ///< KTV
+    REVERB_TYPE_2                = 2,     ///< 小房间 
+    REVERB_TYPE_3                = 3,     ///< 大会堂    
+    REVERB_TYPE_4                = 4,     ///< 低沉     
+    REVERB_TYPE_5                = 5,     ///< 洪亮    
+    REVERB_TYPE_6                = 6,     ///< 金属声    
+    REVERB_TYPE_7                = 7,     ///< 磁性    
+};
+
+/**
+ * 2.3 变声选项
+ */
+typedef NS_ENUM(NSInteger, TXVoiceChangerType) {
+    
+    VOICECHANGER_TYPE_0          = 0,     ///< 关闭变声 
+    VOICECHANGER_TYPE_1          = 1,     ///< 熊孩子 
+    VOICECHANGER_TYPE_2          = 2,     ///< 萝莉 
+    VOICECHANGER_TYPE_3          = 3,     ///< 大叔 
+    VOICECHANGER_TYPE_4          = 4,     ///< 重金属 
+    VOICECHANGER_TYPE_5          = 5,     ///< 感冒 
+    VOICECHANGER_TYPE_6          = 6,     ///< 外国人 
+    VOICECHANGER_TYPE_7          = 7,     ///< 困兽 
+    VOICECHANGER_TYPE_8          = 8,     ///< 死肥仔 
+    VOICECHANGER_TYPE_9          = 9,     ///< 强电流 
+    VOICECHANGER_TYPE_10         = 10,    ///< 重机械 
+    VOICECHANGER_TYPE_11         = 11,    ///< 空灵 
+};
+
+/**
+ * 2.4 声音播放模式(音频路由)
+ *
+ * 一般手机都有两个扬声器,设置音频路由的作用就是要决定声音从哪个扬声器播放出来。
+ * - Speakerphone:扬声器,位于手机底部,声音偏大,适合外放音乐。
+ * - Earpiece:听筒,位于手机顶部,声音偏小,适合通话。
+ */
+typedef NS_ENUM(NSInteger, TXAudioRouteType) {
+    AUDIO_ROUTE_SPEAKER          = 0,      ///< 扬声器,位于手机底部,声音偏大,适合外放音乐。 
+    AUDIO_ROUTE_RECEIVER         = 1,      ///< 听筒,位于手机顶部,声音偏小,适合通话。
+};
+
+/**
+ * 2.5 系统音量类型
+ *
+ * 该枚举值用于控制推流过程中使用何种系统音量类型
+ */
+typedef NS_ENUM(NSInteger, TXSystemAudioVolumeType) {
+    SYSTEM_AUDIO_VOLUME_TYPE_AUTO             = 0,    ///< 默认类型,SDK会自动选择合适的音量类型
+    SYSTEM_AUDIO_VOLUME_TYPE_MEDIA            = 1,    ///< 仅使用媒体音量,SDK不再使用通话音量
+    SYSTEM_AUDIO_VOLUME_TYPE_VOIP             = 2,    ///< 仅使用通话音量,SDK一直使用通话音量
+};
+
+/**
+ * 2.6 推流用网络通道(待废弃)
+ */
+typedef NS_ENUM(NSInteger, TX_Enum_Type_RTMPChannel) {
+    
+    RTMP_CHANNEL_TYPE_AUTO       = 0,      ///< 自动:推腾讯云使用加速协议,推友商云使用标准 RTMP 协议。
+    RTMP_CHANNEL_TYPE_STANDARD   = 1,      ///< 标准 RTMP 协议  
+    RTMP_CHANNEL_TYPE_PRIVATE    = 2,      ///< 腾讯云专属加速协议 
+};
+
+
+/**
+ * 2.7 屏幕采集源(用于录屏推流)
+ */
+#if TARGET_OS_OSX
+typedef NS_ENUM(NSInteger, TXCaptureVideoInputSource) {
+    TXCaptureVideoInputSourceCamera,
+    TXCaptureVideoInputSourceScreen,
+    TXCaptureVideoInputSourceWindow
+};
+#endif
+
+
+
+
+/////////////////////////////////////////////////////////////////////////////////
+//
+//                    【状态通知字段名 onNetStatus】
+//                   
+/////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * TXLivePushListener 和 TXLivePlayListener 的 onNetStatus() 会以 2s 一次的时间间隔,定时通知网络状态和内部指标,
+ * 这些数值采用 key-value 的组织格式,其中 key 值的定义如下:
+ */
+
+#define NET_STATUS_CPU_USAGE             @"CPU_USAGE"              ///> 进程 CPU 占用率
+#define NET_STATUS_CPU_USAGE_D           @"CPU_USAGE_DEVICE"       ///> 系统 CPU 占用率
+
+#define NET_STATUS_VIDEO_WIDTH           @"VIDEO_WIDTH"            ///> 视频分辨率宽度
+#define NET_STATUS_VIDEO_HEIGHT          @"VIDEO_HEIGHT"           ///> 视频分辨率高度
+#define NET_STATUS_VIDEO_FPS             @"VIDEO_FPS"              ///> 视频帧率:也就是视频编码器每秒生产了多少帧画面。
+#define NET_STATUS_VIDEO_GOP             @"VIDEO_GOP"              ///> 关键帧间隔:即每两个关键帧(I帧)间隔时长,单位:秒。
+#define NET_STATUS_VIDEO_BITRATE         @"VIDEO_BITRATE"          ///> 视频码率:即视频编码器每秒生产了多少视频数据,单位:kbps。
+#define NET_STATUS_AUDIO_BITRATE         @"AUDIO_BITRATE"          ///> 音频码率:即音频编码器每秒生产了多少音频数据,单位:kbps。
+#define NET_STATUS_NET_SPEED             @"NET_SPEED"              ///> 传输速度:即每秒钟发送或接收了多少字节的数据。
+
+#define NET_STATUS_VIDEO_CACHE           @"VIDEO_CACHE"            ///> TXLivePusher:主播端堆积的视频帧数;TXLivePlayer:播放端缓冲的视频总时长。
+#define NET_STATUS_AUDIO_CACHE           @"AUDIO_CACHE"            ///> TXLivePusher:主播端堆积的音频帧数;TXLivePlayer:播放端缓冲的音频总时长。
+#define NET_STATUS_VIDEO_DROP            @"VIDEO_DROP"             ///> TXLivePusher:主播端主动丢弃的视频帧数;TXLivePlayer: N/A。
+#define NET_STATUS_AUDIO_DROP            @"AUDIO_DROP"             ///> 暂未使用
+
+#define NET_STATUS_V_DEC_CACHE_SIZE      @"V_DEC_CACHE_SIZE"       ///> TXLivePlayer:播放端解码器中缓存的视频帧数(Android 端硬解码时存在)。
+#define NET_STATUS_V_SUM_CACHE_SIZE      @"V_SUM_CACHE_SIZE"       ///> TXLivePlayer:播放端缓冲的总视频帧数,该数值越大,播放延迟越高。
+#define NET_STATUS_AV_PLAY_INTERVAL      @"AV_PLAY_INTERVAL"       ///> TXLivePlayer:音画同步错位时间(播放),单位 ms,此数值越小,音画同步越好。
+#define NET_STATUS_AV_RECV_INTERVAL      @"AV_RECV_INTERVAL"       ///> TXLivePlayer:音画同步错位时间(网络),单位 ms,此数值越小,音画同步越好。
+#define NET_STATUS_AUDIO_CACHE_THRESHOLD @"AUDIO_CACHE_THRESHOLD"  ///> TXLivePlayer:音频缓冲时长阈值,缓冲超过该阈值后,播放器会开始调控延时。
+
+#define NET_STATUS_AUDIO_INFO            @"AUDIO_INFO"             ///> 音频信息:包括采样率信息和声道数信息
+#define NET_STATUS_NET_JITTER            @"NET_JITTER"             ///> 网络抖动:数值越大表示抖动越大,网络越不稳定
+#define NET_STATUS_QUALITY_LEVEL         @"NET_QUALITY_LEVEL"      ///> 网络质量:0:未定义 1:最好 2:好 3:一般 4:差 5:很差 6:不可用
+#define NET_STATUS_SERVER_IP             @"SERVER_IP"              ///> 连接的Server IP地址
+
+
+/////////////////////////////////////////////////////////////////////////////////
+//
+//                    【事件通知字段名 onPushEvent onPlayEvent】
+//                   
+/////////////////////////////////////////////////////////////////////////////////
+
+
+/**
+ * 腾讯云 LiteAVSDK 通过 TXLivePushListener 中的 onPushEvent(),TXLivePlayListener 中的 onPlayEvent() 向您通知内部错误、警告和事件:
+ * - 错误:严重且不可恢复的错误,会中断 SDK 的正常逻辑。
+ * - 警告:非致命性的提醒和警告,可以不理会。
+ * - 事件:SDK 的流程和状态通知,比如开始推流,开始播放,等等。
+ *  
+ * 这些数值采用 key-value 的组织格式,其中 key 值的定义如下:
+ */
+#define EVT_MSG                          @"EVT_MSG"                 ///> 事件ID
+#define EVT_TIME                         @"EVT_TIME"                ///> 事件发生的UTC毫秒时间戳
+#define EVT_UTC_TIME                     @"EVT_UTC_TIME"            ///> 事件发生的UTC毫秒时间戳(兼容性)
+#define EVT_BLOCK_DURATION               @"EVT_BLOCK_DURATION"      ///> 卡顿时间(毫秒)
+#define EVT_PARAM1                       @"EVT_PARAM1"              ///> 事件参数1
+#define EVT_PARAM2                       @"EVT_PARAM2"              ///> 事件参数2
+#define EVT_GET_MSG                      @"EVT_GET_MSG"             ///> 消息内容,收到PLAY_EVT_GET_MESSAGE事件时,通过该字段获取消息内容
+#define EVT_PLAY_PROGRESS                @"EVT_PLAY_PROGRESS"       ///> 点播:视频播放进度
+#define EVT_PLAY_DURATION                @"EVT_PLAY_DURATION"       ///> 点播:视频总时长
+#define EVT_PLAYABLE_DURATION            @"PLAYABLE_DURATION"       ///> 点播:视频可播放时长
+#define EVT_PLAY_COVER_URL               @"EVT_PLAY_COVER_URL"      ///> 点播:视频封面
+#define EVT_PLAY_URL                     @"EVT_PLAY_URL"            ///> 点播:视频播放地址
+#define EVT_PLAY_NAME                    @"EVT_PLAY_NAME"           ///> 点播:视频名称
+#define EVT_PLAY_DESCRIPTION             @"EVT_PLAY_DESCRIPTION"    ///> 点播:视频简介
+
+#define STREAM_ID                        @"STREAM_ID"
+
+#endif 

+ 41 - 0
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXPlayerAuthParams.h

@@ -0,0 +1,41 @@
+//
+//  TXPlayerAuthParams.h
+//  TXLiteAVSDK
+//
+//  Created by annidyfeng on 2017/12/13.
+//  Copyright © 2017年 Tencent. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+/// @addtogroup TXVodPlayConfig_ios 
+/// @{
+
+/// 点播fileid鉴权信息
+@interface TXPlayerAuthParams : NSObject
+///应用appId。必填
+@property int appId;
+///文件id。必填
+@property NSString *fileId;
+///加密链接超时时间戳,转换为16进制小写字符串,腾讯云 CDN 服务器会根据该时间判断该链接是否有效。可选
+@property NSString *timeout;
+///试看时长,单位:秒。可选
+@property int exper;
+///唯一标识请求,增加链接唯一性
+@property NSString *us;
+/**
+ 无防盗链不填
+ 
+ 普通防盗链签名:
+ sign = md5(KEY+appId+fileId+t+us)
+ 带试看的防盗链签名:
+ sign = md5(KEY+appId+fileId+t+exper+us)
+ 
+ 播放器API使用的防盗链参数(t, us, exper) 与CDN防盗链参数一致,只是sign计算方式不同
+ 参考防盗链产品文档: https://cloud.tencent.com/document/product/266/11243
+ */
+@property NSString *sign;
+///是否用https请求,默认NO
+@property BOOL https;
+@end
+/// @}

+ 51 - 0
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXVideoCustomProcessDelegate.h

@@ -0,0 +1,51 @@
+//
+//  TXVideoCustomProcessDelegate.h
+//  TXRTMPSDK
+//
+//  Created by annidyfeng on 2017/3/20.
+//
+//
+
+#import <Foundation/Foundation.h>
+#if TARGET_OS_IPHONE
+#include <OpenGLES/ES2/gl.h>
+#include <OpenGLES/ES2/glext.h>
+#elif TARGET_OS_MAC
+#import <OpenGL/OpenGL.h>
+#import <OpenGL/gl.h>
+#endif
+
+@protocol TXVideoCustomProcessDelegate <NSObject>
+@optional
+#pragma mark - Pusher & UGC Record
+/**
+ * 在OpenGL线程中回调,在这里可以进行采集图像的二次处理
+ * @param texture    纹理ID
+ * @param width      纹理的宽度
+ * @param height     纹理的高度
+ * @return           返回给SDK的纹理
+ * 说明:SDK回调出来的纹理类型是GL_TEXTURE_2D,接口返回给SDK的纹理类型也必须是GL_TEXTURE_2D; 该回调在SDK美颜之后. 纹理格式为GL_RGBA
+ */
+- (GLuint)onPreProcessTexture:(GLuint)texture width:(CGFloat)width height:(CGFloat)height;
+
+/**
+ * 在OpenGL线程中回调,可以在这里释放创建的OpenGL资源
+ */
+- (void)onTextureDestoryed;
+
+/**
+ * 人脸数据回调(增值版且启用了pitu模块才有效)
+ * @prama points 人脸坐标
+ *  说明:开启pitu模块必须是打开动效或大眼瘦脸。此回调在onPreProcessTexture:width:height:之前
+ */
+- (void)onDetectFacePoints:(NSArray *)points;
+
+#pragma mark - Player
+/**
+ * 视频渲染对象回调
+ * @param pixelBuffer   渲染图像
+ * @return              返回YES则SDK不再显示;返回NO则SDK渲染模块继续渲染
+ *  说明:渲染图像的数据类型为config中设置的renderPixelFormatType
+ */
+- (BOOL)onPlayerPixelBuffer:(CVPixelBufferRef)pixelBuffer;
+@end

+ 172 - 0
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXVodDownloadManager.h

@@ -0,0 +1,172 @@
+//
+//  TXVodDownloadManager.h
+//  TXLiteAVSDK
+//
+//  Created by annidyfeng on 2017/12/25.
+//  Copyright © 2017年 Tencent. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "TXPlayerAuthParams.h"
+
+/// @addtogroup TXVodPlayConfig_ios
+/// @{
+
+/**
+ * 下载视频的清晰度
+ */
+typedef NS_ENUM(NSInteger, TXVodQuality) {
+    ///原画
+    TXVodQualityOD = 0,
+    ///流畅
+    TXVodQualityFLU,
+    ///标清
+    TXVodQualitySD,
+    ///高清
+    TXVodQualityHD,
+    ///全高清
+    TXVodQualityFHD,
+    ///2K
+    TXVodQuality2K,
+    ///4K
+    TXVodQuality4K,
+};
+
+/**
+ * 下载错误码
+ */
+typedef NS_ENUM(NSInteger, TXDownloadError) {
+    /// 下载成功
+    TXDownloadSuccess   = 0,
+    /// fileid鉴权失败
+    TXDownloadAuthFaild = -5001,
+    /// 无此清晰度文件
+    TXDownloadNoFile    = -5003,
+    /// 格式不支持
+    TXDownloadFormatError = -5004,
+    /// 网络断开
+    TXDownloadDisconnet = -5005,
+    /// 获取HLS解密key失败
+    TXDownloadHlsKeyError = -5006,
+    /// 下载目录访问失败
+    TXDownloadPathError = -5007,
+};
+
+/**
+ * 下载源,通过fileid方式下载
+ */
+@interface TXVodDownloadDataSource : NSObject
+/// fileid信息
+@property TXPlayerAuthParams *auth;
+/// 下载清晰度,默认原画
+@property TXVodQuality quality;
+/// 如地址有加密,请填写token
+@property NSString *token;
+/// 清晰度模板。如果后台转码是自定义模板,请在这里填写模板名。templateName和quality同时设置时,以templateName为v准
+@property NSString *templateName;
+@end
+
+/// 下载文件对象
+@interface TXVodDownloadMediaInfo : NSObject
+/// fileid下载对象(可选)
+@property TXVodDownloadDataSource *dataSource;
+/// 下载地址
+@property NSString *url;
+///时长
+@property (nonatomic) int duration;
+/// 文件总大小,单位:byte
+@property (nonatomic) int size;
+/// 已下载大小,单位:byte
+@property (nonatomic) int downloadSize;
+/// 进度
+@property float progress;
+/// 播放路径,可传给TXVodPlayer播放
+@property NSString *playPath;
+/// 下载速度,byte每秒
+@property int speed;
+@end
+
+/// 下载回调
+@protocol TXVodDownloadDelegate <NSObject>
+/// 下载开始
+- (void)onDownloadStart:(TXVodDownloadMediaInfo *)mediaInfo;
+/// 下载进度
+- (void)onDownloadProgress:(TXVodDownloadMediaInfo *)mediaInfo;
+/// 下载停止
+- (void)onDownloadStop:(TXVodDownloadMediaInfo *)mediaInfo;
+/// 下载完成
+- (void)onDownloadFinish:(TXVodDownloadMediaInfo *)mediaInfo;
+/// 下载错误
+- (void)onDownloadError:(TXVodDownloadMediaInfo *)mediaInfo errorCode:(TXDownloadError)code errorMsg:(NSString *)msg;
+/**
+ * 下载HLS,遇到加密的文件,将解密key给外部校验
+ * @param mediaInfo 下载对象
+ * @param url Url地址
+ * @param data 服务器返回
+ * @return 0:校验正确,继续下载;否则校验失败,抛出下载错误(SDK 获取失败)
+ */
+- (int)hlsKeyVerify:(TXVodDownloadMediaInfo *)mediaInfo url:(NSString *)url data:(NSData *)data;
+@end
+
+/// 下载管理器
+@interface TXVodDownloadManager : NSObject
+
+/**
+ * 下载任务回调
+ */
+@property (weak) id<TXVodDownloadDelegate> delegate;
+
+/**
+ * 设置 HTTP 头
+ */
+@property NSDictionary *headers;
+
+/**
+ * 全局单例接口
+ */
++ (TXVodDownloadManager *)shareInstance;
+
+/**
+ * 设置下载文件的根目录。
+ *
+ * @param path 目录地址,如不存在,将自动创建
+ * @warning 开始下载前必须设置,否则不能下载
+ */
+- (void)setDownloadPath:(NSString *)path;
+
+/**
+ * 下载文件
+ *
+ * @param source 下载源。
+ * @return 成功返回下载对象,否则nil
+ *
+ * @warning 目前只支持hls下载
+ */
+- (TXVodDownloadMediaInfo *)startDownload:(TXVodDownloadDataSource *)source;
+
+/**
+ * 下载文件
+ *
+ * @param url 下载地址
+ * @return 成功返回下载对象,否则nil
+ *
+ * @warning 目前只支持hls下载,不支持master playlist
+ */
+- (TXVodDownloadMediaInfo *)startDownloadUrl:(NSString *)url;
+
+/**
+ * 停止下载
+ *
+ * @param media 停止下载对象
+ */
+- (void)stopDownload:(TXVodDownloadMediaInfo *)media;
+
+/**
+ * 删除下载产生的文件
+ *
+ * @return 文件正在下载将无法删除,返回NO
+ */
+- (BOOL)deleteDownloadFile:(NSString *)playPath;
+
+@end
+/// @}

+ 77 - 0
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXVodPlayConfig.h

@@ -0,0 +1,77 @@
+//
+//  TXVodPlayConfig.h
+//  TXLiteAVSDK
+//
+//  Created by annidyfeng on 2017/9/12.
+//  Copyright © 2017年 Tencent. All rights reserved.
+//
+
+#ifndef TXVodPlayConfig_h
+#define TXVodPlayConfig_h
+
+#import <Foundation/Foundation.h>
+
+/// @defgroup TXVodPlayConfig_ios TXVodPlayConfig
+/// 点播播放器关键类型定义
+/// @{
+
+/// 播放器选择
+typedef NS_ENUM(NSInteger, TX_Enum_PlayerType) {
+    PLAYER_FFPLAY   = 0,          //基于FFmepg,支持软解,兼容性更好
+    PLAYER_AVPLAYER = 1,          //基于系统播放器
+};
+
+/// 播放器配置参数
+@interface TXVodPlayConfig : NSObject
+
+/// 播放器连接重试次数:最小值为1,最大值为10,默认值为 3
+@property(nonatomic, assign) int connectRetryCount;
+
+/// 播放器连接重试间隔:单位秒,最小值为3, 最大值为30,默认值为3
+@property(nonatomic, assign) int connectRetryInterval;
+
+/// 超时时间:单位秒,默认10s
+@property NSTimeInterval timeout;
+
+/// 视频渲染对象回调的视频格式。支持kCVPixelFormatType_32BGRA、kCVPixelFormatType_420YpCbCr8BiPlanarFullRange、kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange
+@property(nonatomic, assign) OSType playerPixelFormatType;
+
+/// stopPlay 的时候是否保留最后一帧画面,默认值为 NO
+@property(nonatomic, assign) BOOL keepLastFrameWhenStop;
+
+/**
+ * 注意:缓存目录应该是单独的目录,SDK可能会清掉其中的文件
+ */
+@property NSString *cacheFolderPath;        ///< 视频缓存目录,点播MP4、HLS有效
+
+@property int maxCacheItems;                ///< 最多缓存文件个数
+
+@property NSInteger playerType;             ///< 播放器类型
+
+@property NSDictionary *headers;            ///< 自定义 HTTP Headers
+
+@property BOOL enableAccurateSeek;          ///< 是否精确 seek,默认YES。开启精确后seek,seek 的时间平均多出200ms
+
+@property BOOL autoRotate;                  ///< 播放 MP4 文件时,若设为YES则根据文件中的旋转角度自动旋转。旋转角度可在 EVT_VIDEO_CHANGE_ROTATION 事件中获得。默认YES
+
+/**
+ * 平滑切换码率。默认NO
+ *  设为NO时,切换清晰度会有少许停顿,但文件打开速度会加快。设为YES,当IDR对齐时,平滑切换清晰度。
+ */
+@property BOOL smoothSwitchBitrate;
+
+/**
+ * 设置进度回调间隔时间
+ *  若不设置,SDK默认间隔0.5秒回调一次
+ */
+@property NSTimeInterval progressInterval;
+
+/**
+ * 最大预加载大小,单位 MB
+ *  此设置会影响playableDuration,设置越大,提前缓存的越多
+ */
+@property int maxBufferSize;
+@end
+
+/// @}
+#endif /* TXVodPlayConfig_h */

+ 41 - 0
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXVodPlayListener.h

@@ -0,0 +1,41 @@
+//
+//  TXLiveVodListener.h
+//  TXLiteAVSDK
+//
+//  Created by annidyfeng on 2017/11/14.
+//  Copyright © 2017年 Tencent. All rights reserved.
+//
+
+#ifndef TXLiveVodListener_h
+#define TXLiveVodListener_h
+#import <Foundation/Foundation.h>
+#import "TXLiveSDKTypeDef.h"
+@class TXVodPlayer;
+
+/// @defgroup TXVodPlayListener_ios TXVodPlayListener
+/// 点播通知
+/// @{
+@protocol TXVodPlayListener <NSObject>
+
+/**
+ * 点播事件通知
+ *
+ * @param player 点播对象
+ * @param EvtID 参见TXLiveSDKTypeDef.h
+ * @param param 参见TXLiveSDKTypeDef.h
+ * @see TXVodPlayer
+ */
+-(void) onPlayEvent:(TXVodPlayer *)player event:(int)EvtID withParam:(NSDictionary*)param;
+
+/**
+ * 网络状态通知
+ *
+ * @param player 点播对象
+ * @param param 参见TXLiveSDKTypeDef.h
+ * @see TXVodPlayer
+ */
+-(void) onNetStatus:(TXVodPlayer *)player withParam:(NSDictionary*)param;
+
+@end
+/// @}
+#endif /* TXLiveVodListener_h */

+ 214 - 0
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Headers/TXVodPlayer.h

@@ -0,0 +1,214 @@
+//
+//  TXVodPlayer.h
+//  TXLiteAVSDK
+//
+//  Created by annidyfeng on 2017/9/12.
+//  Copyright © 2017年 Tencent. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+#import "TXLivePlayListener.h"
+#import "TXVodPlayListener.h"
+#import "TXVodPlayConfig.h"
+#import "TXVideoCustomProcessDelegate.h"
+#import "TXBitrateItem.h"
+#import "TXPlayerAuthParams.h"
+
+/// @defgroup TXVodPlayer_ios TXVodPlayer
+/// 点播播放器
+/// @{
+@interface TXVodPlayer : NSObject
+
+/**
+ * 事件回调
+ * @warning 建议使用vodDelegate
+ */
+@property(nonatomic, weak) id <TXLivePlayListener> delegate __attribute__((deprecated("use vodDelegate instead")));
+
+/// 事件回调
+@property(nonatomic, weak) id <TXVodPlayListener> vodDelegate;
+
+/**
+ * 视频渲染回调。(仅硬解支持)
+ */
+@property(nonatomic, weak) id <TXVideoCustomProcessDelegate> videoProcessDelegate;
+
+/**
+ * 是否开启硬件加速
+ * 播放前设置有效
+ */
+@property(nonatomic, assign) BOOL enableHWAcceleration;
+
+/**
+ * 点播配置
+ */
+@property(nonatomic, copy) TXVodPlayConfig *config;
+
+/// startPlay后是否立即播放,默认YES
+@property BOOL isAutoPlay;
+
+/**
+ * 加密HLS的token。设置此值后,播放器自动在URL中的文件名之前增加 voddrm.token.TOKEN
+ */
+@property (nonatomic, strong) NSString *token;
+
+/* setupContainView 创建Video渲染View,该控件承载着视频内容的展示。
+ * @param view 父view
+ * @param idx Widget在父view上的层级位置
+ */
+- (void)setupVideoWidget:(UIView *)view insertIndex:(unsigned int)idx;
+
+/**
+ * 移除Video渲染View
+ */
+- (void)removeVideoWidget;
+
+/**
+ * 设置播放开始时间
+ * 在startPlay前设置,修改开始播放的起始位置
+ */
+- (void)setStartTime:(CGFloat)startTime;
+
+/**
+ * startPlay 启动从指定URL播放
+ *
+ * @param url 完整的URL(如果播放的是本地视频文件,这里传本地视频文件的完整路径)
+ * @return 0 = OK
+ */
+- (int)startPlay:(NSString *)url;
+
+/**
+ * 通过fileid方式播放。
+ *
+ * fileid的获取方式可参考 [启动播放](https://cloud.tencent.com/document/product/454/12148#step-3.3A-.E5.90.AF.E5.8A.A8.E6.92.AD.E6.94.BE)
+ *
+ * @param params 认证参数
+ * @return 0 = OK
+ */
+- (int)startPlayWithParams:(TXPlayerAuthParams *)params;
+
+/**
+ * 停止播放音视频流
+ * @return 0 = OK
+ */
+- (int)stopPlay;
+
+/**
+ * 是否正在播放
+ */
+- (bool)isPlaying;
+
+/**
+ * 暂停播放
+ */
+- (void)pause;
+
+/**
+ * 继续播放
+ */
+- (void)resume;
+
+/**
+ * 播放跳转到音视频流某个时间
+ * @param time 流时间,单位为秒
+ * @return 0 = OK
+ */
+- (int)seek:(float)time;
+
+/**
+ * 获取当前播放时间
+ */
+- (float)currentPlaybackTime;
+
+/**
+ * 获取视频总时长
+ */
+- (float)duration;
+
+/**
+ * 可播放时长
+ */
+- (float)playableDuration;
+
+/**
+ * 视频宽度
+ */
+- (int)width;
+
+/**
+ * 视频高度
+ */
+- (int)height;
+
+/**
+ * 设置画面的方向
+ * @param rotation 方向
+ * @see TX_Enum_Type_HomeOrientation
+ */
+- (void)setRenderRotation:(TX_Enum_Type_HomeOrientation)rotation;
+
+/**
+ * 设置画面的裁剪模式
+ * @param renderMode 裁剪
+ * @see TX_Enum_Type_RenderMode
+ */
+- (void)setRenderMode:(TX_Enum_Type_RenderMode)renderMode;
+
+
+/**
+ * 设置静音
+ */
+- (void)setMute:(BOOL)bEnable;
+
+/**
+ * 设置音量大小
+ * @param volume 音量大小。范围:0 ~ 100。
+ */
+- (void)setAudioPlayoutVolume:(int)volume;
+
+/*
+ * 截屏
+ * @param snapshotCompletionBlock 通过回调返回当前图像
+ */
+- (void)snapshot:(void (^)(UIImage *))snapshotCompletionBlock;
+
+/**
+ * 设置播放速率
+ * @param rate 正常速度为1.0;小于为慢速;大于为快速。最大建议不超过2.0
+ */
+- (void)setRate:(float)rate;
+
+/**
+ * 当播放地址为master playlist,返回支持的码率(清晰度)
+ *
+ * @warning 在收到EVT_VIDEO_PLAY_BEGIN事件后才能正确返回结果
+ * @return 无多码率返回空数组
+ */
+- (NSArray<TXBitrateItem *> *)supportedBitrates;
+
+/**
+ * 获取当前正在播放的码率索引
+ */
+- (NSInteger)bitrateIndex;
+
+/**
+ * 设置当前正在播放的码率索引,无缝切换清晰度
+ *  清晰度切换可能需要等待一小段时间。腾讯云支持多码率HLS分片对齐,保证最佳体验。
+ *
+ * @param index 码率索引
+ */
+- (void)setBitrateIndex:(NSInteger)index;
+
+/**
+ * 设置画面镜像
+ */
+- (void)setMirror:(BOOL)isMirror;
+
+/**
+ * 是否循环播放
+ */
+@property (nonatomic, assign) BOOL loop;
+
+@end
+/// @}

BIN
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Info.plist


+ 4 - 0
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/Modules/module.modulemap

@@ -0,0 +1,4 @@
+module TXLiteAVSDK_Player {
+    umbrella header "Headers/TXLiteAVSDK.h"
+    export *
+}

BIN
Example/Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/SDK/TXLiteAVSDK_Player.framework/TXLiteAVSDK_Player