QNTrack.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842
  1. //
  2. // QNTrack.h
  3. // QNRTCKit
  4. //
  5. // Created by 何云旗 on 2021/12/29.
  6. // Copyright © 2021 Pili Engineering, Qiniu Inc. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. #import "QNTypeDefines.h"
  10. #import "QNVideoGLView.h"
  11. #import "QNAudioMusicMixer.h"
  12. #import "QNAudioEffectMixer.h"
  13. #import "QNAudioSourceMixer.h"
  14. #import "QNVideoEncoderConfig.h"
  15. NS_ASSUME_NONNULL_BEGIN
  16. #pragma mark -- QNTrack
  17. /*!
  18. * @abstract 用来描述一路 Track 的相关信息
  19. *
  20. * @discussion 主要用于发布/订阅时传入 Track 相关的信息,或者远端 Track 状态变更时 SDK 回调给 App Track 相关的信息。
  21. *
  22. * @since v4.0.0
  23. */
  24. @interface QNTrack : NSObject
  25. /*!
  26. * @abstract 用户的唯一标识。
  27. *
  28. * @since v5.0.0
  29. */
  30. @property (nonatomic, readonly) NSString *userID;
  31. /*!
  32. * @abstract 一路 Track 在 Server 端的唯一标识。
  33. *
  34. * @discussion 发布成功时由 SDK 自动生成,订阅/Mute 等操作依据此 trackID 来确定相应的 Track。
  35. *
  36. * @since v4.0.0
  37. */
  38. @property (nonatomic, readonly) NSString *trackID;
  39. /*!
  40. * @abstract 标识该路 Track 是音频还是视频。
  41. *
  42. * @discussion 发布时由 SDK 确定。
  43. *
  44. * @see QNTrackKind
  45. *
  46. * @since v4.0.0
  47. */
  48. @property (nonatomic, readonly) QNTrackKind kind;
  49. /*!
  50. * @abstract Track 的 tag,SDK 会将其透传到远端,当发布多路视频 Track 时可用 tag 来作区分。
  51. *
  52. * @since v4.0.0
  53. */
  54. @property (nonatomic, readonly) NSString *tag;
  55. /*!
  56. * @abstract 标识 Track 是否为 mute 状态
  57. *
  58. * @since v4.0.0
  59. */
  60. @property (nonatomic, assign, readonly) BOOL muted;
  61. - (instancetype)init NS_UNAVAILABLE;
  62. @end
  63. #pragma mark -- QNLocalTrack
  64. @interface QNLocalTrack : QNTrack
  65. - (instancetype)init NS_UNAVAILABLE;
  66. /*!
  67. * @abstract 将本地音/视频 Track 置为 muted 状态。
  68. *
  69. * @discussion 需要发布成功后才可以执行 mute 操作。
  70. *
  71. * @since v4.0.0
  72. */
  73. - (void)updateMute:(BOOL)muted;
  74. /*!
  75. * @abstract 销毁本地音/视频 Track。
  76. *
  77. * @warning 在不使用该 Track 之后,请务必调用此接口。
  78. *
  79. * @since v5.0.0
  80. */
  81. - (void)destroy;
  82. @end
  83. @class QNLocalAudioTrack;
  84. @protocol QNLocalAudioTrackDelegate <NSObject>
  85. @optional
  86. /*!
  87. * @abstract 音频 Track 数据回调。
  88. *
  89. * @discussion 需要注意的是这个回调在 AU Remote IO 线程,请不要做过于耗时的操作,否则可能阻塞该线程影响音频输出或其他未知问题。
  90. *
  91. * @since v5.0.0
  92. */
  93. - (void)localAudioTrack:(QNLocalAudioTrack *)localAudioTrack didGetAudioBuffer:(AudioBuffer *)audioBuffer bitsPerSample:(NSUInteger)bitsPerSample sampleRate:(NSUInteger)sampleRate;
  94. @end
  95. #pragma mark -- QNLocalAudioTrack
  96. @interface QNLocalAudioTrack : QNLocalTrack
  97. /*!
  98. * @abstract 音频 Track 回调代理。
  99. *
  100. * @since v5.0.0
  101. */
  102. @property (nonatomic, weak) id<QNLocalAudioTrackDelegate> delegate;
  103. - (instancetype)init NS_UNAVAILABLE;
  104. /*!
  105. * @abstract 输入音量
  106. *
  107. * @discussion 设置范围为 0 ~ 10,默认为 1
  108. *
  109. * @warning 当麦克风输入音量增益调大之后,部分机型会出现噪音
  110. *
  111. * @since v5.0.0
  112. */
  113. - (void)setVolume:(double)volume;
  114. /*!
  115. * @abstract 获取用户音量,范围 0 ~ 10。
  116. *
  117. * @since v5.0.0
  118. */
  119. - (float)getVolumeLevel;
  120. /*!
  121. * @abstract 设置耳返开关
  122. *
  123. * @param enabled 是否开启
  124. *
  125. * @since v5.1.0
  126. */
  127. - (void)setEarMonitorEnabled:(BOOL)enabled;
  128. /*!
  129. * @abstract 是否开启了耳返
  130. *
  131. * @return BOOL 是否开启
  132. *
  133. * @since v5.1.0
  134. */
  135. - (BOOL)getEarMonitorEnabled;
  136. /*!
  137. * @abstract 设置混音、返听场景下,本地播放的音量大小
  138. *
  139. * @param volume 播放音量,范围 0~1.0
  140. *
  141. * @since v5.1.0
  142. */
  143. - (void)setPlayingVolume:(float)volume;
  144. /*!
  145. * @abstract 获取混音、返听场景下,本地播放音量的大小
  146. *
  147. * @return float 播放音量,范围 0~1.0
  148. *
  149. * @since v5.1.0
  150. */
  151. - (float)getPlayingVolume;
  152. /*!
  153. * @abstract 增加 filter 模块
  154. *
  155. * @discussion 支持设置 QNAudioMusicMixer、QNAudioEffectMixer、QNAudioSourceMixer 等内置 Filter
  156. *
  157. * @since v5.2.6
  158. */
  159. - (BOOL)addAudioFilter:(id<QNAudioFilterProtocol>)filter;
  160. /*!
  161. * @abstract 移除 filter 模块
  162. *
  163. * @discussion 移除已经添加的 filter 模块
  164. *
  165. * @since v5.2.6
  166. */
  167. - (BOOL)removeAudioFilter:(id<QNAudioFilterProtocol>)filter;
  168. @end
  169. @class QNMicrophoneAudioTrack;
  170. @protocol QNMicrophoneAudioTrackDelegate <NSObject>
  171. @optional
  172. /*!
  173. * @abstract 麦克风采集运行过程中发生错误会通过该方法回调。
  174. *
  175. * @since v5.2.7
  176. */
  177. - (void)microphoneAudioTrack:(QNMicrophoneAudioTrack *)microphoneAudioTrack didFailWithError:(NSError *)error;
  178. @end
  179. #pragma mark -- QNMicrophoneAudioTrack
  180. @interface QNMicrophoneAudioTrack : QNLocalAudioTrack
  181. /*!
  182. * @abstract 麦克风 Track 回调代理。
  183. *
  184. * @since v5.2.7
  185. */
  186. @property (nonatomic, weak) id<QNMicrophoneAudioTrackDelegate> microphoneDelegate;
  187. - (instancetype)init NS_UNAVAILABLE;
  188. /*!
  189. * @abstract 开始麦克风采集
  190. *
  191. * @return 是否调用成功
  192. *
  193. * @since v5.2.7
  194. */
  195. - (BOOL)startRecording;
  196. /*!
  197. * @abstract 停止麦克风采集
  198. *
  199. * @return 是否调用成功
  200. *
  201. * @since v5.2.7
  202. */
  203. - (BOOL)stopRecording;
  204. @end
  205. #pragma mark -- QNCustomAudioTrack
  206. @class QNCustomAudioTrack;
  207. @protocol QNCustomAudioTrackDelegate <NSObject>
  208. @optional
  209. /*!
  210. * @abstract 导入音频数据过程中发生错误会通过该方法回调。
  211. *
  212. * @since v5.0.0
  213. */
  214. - (void)customAudioTrack:(QNCustomAudioTrack *)customAudioTrack didFailWithError:(NSError *)error;
  215. @end
  216. @interface QNCustomAudioTrack : QNLocalAudioTrack
  217. /*!
  218. * @abstract 自定义音频 Track 回调代理。
  219. *
  220. * @since v5.0.0
  221. */
  222. @property (nonatomic, weak) id<QNCustomAudioTrackDelegate> customAudioDelegate;
  223. - (instancetype)init NS_UNAVAILABLE;
  224. /*!
  225. * @abstract 导入音频数据
  226. *
  227. * @discussion 支持的音频数据格式为:PCM 格式,48000 采样率,16 位宽,单声道
  228. *
  229. * @since v4.0.0
  230. */
  231. - (void)pushAudioBuffer:(AudioBuffer *)audioBuffer;
  232. /*!
  233. * @abstract 导入音频数据
  234. *
  235. * @discussion 支持的音频数据格式为:PCM 格式
  236. *
  237. * @warning 音频数据的格式信息,请务必对应实际数据信息传入
  238. *
  239. * @param asbd PCM 音频数据的具体音频信息,包括采样率、声道数、位宽等
  240. *
  241. * @since v4.0.0
  242. */
  243. - (void)pushAudioBuffer:(AudioBuffer *)audioBuffer asbd:(AudioStreamBasicDescription *)asbd;
  244. /*!
  245. * @abstract 导入音频数据
  246. *
  247. * @discussion 支持的音频数据格式为:PCM 格式
  248. *
  249. * @warning 音频数据的格式信息,请务必对应实际数据信息传入
  250. *
  251. * @param data PCM 裸数据
  252. *
  253. * @param bitsPerSample 位宽
  254. *
  255. * @param sampleRate 采样率
  256. *
  257. * @param channels 声道数
  258. *
  259. * @param bigEndian 是否是大端,默认是小端
  260. *
  261. * @param planar 是否是平面结构,双声道模式下,默认是 packed
  262. *
  263. * @since v5.2.7
  264. */
  265. - (void)pushAudioFrame:(const uint8_t*)data dataSize:(uint32_t)dataSize bitsPerSample:(uint32_t)bitsPerSample sampleRate:(uint32_t)sampleRate channels:(uint32_t)channels bigEndian:(bool)bigEndian planar:(bool)planar;
  266. @end
  267. #pragma mark -- QNLocalVideoTrackDelegate
  268. @class QNLocalVideoTrack;
  269. @protocol QNLocalVideoTrackDelegate <NSObject>
  270. @optional
  271. /*!
  272. * @abstract 视频 Track 数据回调。
  273. *
  274. * @discussion 需要注意的是这个回调在视频数据的输出线程,请不要做过于耗时的操作,否则可能会导致编码帧率下降。
  275. *
  276. * @since v5.0.0
  277. */
  278. - (void)localVideoTrack:(QNLocalVideoTrack *)localVideoTrack didGetPixelBuffer:(CVPixelBufferRef)pixelBuffer;
  279. @end
  280. #pragma mark -- QNLocalVideoTrack
  281. @interface QNLocalVideoTrack : QNLocalTrack
  282. /*!
  283. * @abstract 视频 Track 回调代理。
  284. *
  285. * @since v5.0.0
  286. */
  287. @property (nonatomic, weak) id<QNLocalVideoTrackDelegate> delegate;
  288. - (instancetype)init NS_UNAVAILABLE;
  289. /*!
  290. * @abstract 本地视频 Track 添加 SEI
  291. *
  292. * @param videoSEI SEI 内容
  293. *
  294. * @param uuid 自定义设置 uuid
  295. *
  296. * @param repeatNumber SEI 重复发送次数,-1 为永久发送
  297. *
  298. * @discussion 需要停止发送 SEI,可以设置 videoSEI 为 nil,repeatNumber 为 0 即可
  299. *
  300. * @since v5.0.0
  301. */
  302. - (void)sendSEI:(NSString *)videoSEI
  303. uuid:(NSString *)uuid
  304. repeatNmuber:(NSNumber *)repeatNumber __deprecated_msg("Method deprecated in v5.2.3. Use `sendSEI:`");
  305. /*!
  306. * @abstract 本地视频 Track 添加 SEI
  307. *
  308. * @param SEIData SEI 内容,不超过 4096 个字节
  309. *
  310. * @param uuid 自定义设置 uuid
  311. *
  312. * @param repeatCount SEI 重复发送次数,-1 为永久发送
  313. *
  314. * @discussion 需要停止发送 SEI,可以设置 videoSEI 为 nil,repeatNumber 为 0 即可
  315. *
  316. * @since v5.2.3
  317. */
  318. - (void)sendSEIWithData:(NSData *)SEIData
  319. uuid:(NSData *)uuid
  320. repeatCount:(NSNumber *)repeatCount;
  321. /*!
  322. * @abstract 视频 Track 渲染。
  323. *
  324. * @discussion videoView 会被内部引用,外部销毁时需主动传 nil
  325. *
  326. * @since v5.0.0
  327. */
  328. - (void)play:(QNVideoGLView *)videoView;
  329. /*!
  330. * @abstract 动态修改编码配置
  331. *
  332. * @param config 编码参数配置
  333. *
  334. * @since v5.2.1
  335. */
  336. - (void)setVideoEncoderConfig:(QNVideoEncoderConfig *)config;
  337. @end
  338. #pragma mark -- QNCameraVideoTrack
  339. @class QNCameraVideoTrack;
  340. @protocol QNCameraVideoTrackDelegate <NSObject>
  341. @optional
  342. /*!
  343. * @abstract 摄像头采集运行过程中发生错误会通过该方法回调。
  344. *
  345. * @since v5.2.3
  346. */
  347. - (void)cameraVideoTrack:(QNCameraVideoTrack *)cameraVideoTrack didFailWithError:(NSError *)error;
  348. /*!
  349. * @abstract 图片推流运行过程中发生错误会通过该方法回调。
  350. *
  351. * @since v5.2.5
  352. */
  353. - (void)cameraVideoTrack:(QNCameraVideoTrack *)cameraVideoTrack didPushImageWithError:(NSError *)error;
  354. @end
  355. @interface QNCameraVideoTrack : QNLocalVideoTrack
  356. /*!
  357. * @abstract 摄像头 Track 回调代理。
  358. *
  359. * @since v5.2.3
  360. */
  361. @property (nonatomic, weak) id<QNCameraVideoTrackDelegate> cameraDelegate;
  362. /*!
  363. * @abstract 摄像头的位置,默认为 AVCaptureDevicePositionFront。需在 config 中设置
  364. *
  365. * @since v5.0.0
  366. */
  367. @property (nonatomic, assign, readonly) AVCaptureDevicePosition captureDevicePosition;
  368. /*!
  369. * @abstract 开启 camera 时的采集摄像头的旋转方向,默认为 AVCaptureVideoOrientationPortrait。
  370. *
  371. * @since v4.0.0
  372. */
  373. @property (nonatomic, assign) AVCaptureVideoOrientation videoOrientation;
  374. /*!
  375. * @abstract 是否开启手电筒,默认为 NO。
  376. *
  377. * @since v4.0.0
  378. */
  379. @property (nonatomic, assign, getter=isTorchOn) BOOL torchOn;
  380. /*!
  381. * @abstract 是否连续自动对焦,默认为 YES。
  382. *
  383. * @since v4.0.0
  384. */
  385. @property (nonatomic, assign, getter=isContinuousAutofocusEnable) BOOL continuousAutofocusEnable;
  386. /*!
  387. * @abstract 该属性适用于视频拍摄过程中用来减缓因自动对焦产生的镜头伸缩,使画面不因快速的对焦而产生抖动感。默认为 YES。
  388. *
  389. * @since v4.0.0
  390. */
  391. @property (nonatomic, assign, getter=isSmoothAutoFocusEnabled) BOOL smoothAutoFocusEnabled;
  392. /*!
  393. * @abstract 聚焦的位置,(0,0) 代表左上, (1,1) 代表右下。默认为 (0.5, 0.5),即中间位置。
  394. *
  395. * @since v5.0.0
  396. */
  397. @property (nonatomic, assign) CGPoint manualFocus;
  398. /*!
  399. * @abstract 控制摄像头的缩放,默认为 1.0。
  400. *
  401. * @discussion 设置的数值需要小于等于 videoActiveForat.videoMaxZoomFactor,如果大于会设置失败。
  402. *
  403. * @since v4.0.0
  404. */
  405. @property (nonatomic, assign) CGFloat videoZoomFactor;
  406. /*!
  407. * @abstract 设备支持的 formats。
  408. *
  409. * @since v5.0.0
  410. */
  411. @property (nonatomic, strong, readonly) NSArray<AVCaptureDeviceFormat *> *supportedVideoFormats;
  412. /*!
  413. * @abstract 设备当前的 format。
  414. *
  415. * @since v4.0.0
  416. */
  417. @property (nonatomic, strong) AVCaptureDeviceFormat *videoActiveFormat;
  418. /*!
  419. * @abstract 采集的视频的 videoFormat,默认为 AVCaptureSessionPreset640x480。
  420. *
  421. * @since v5.0.0
  422. */
  423. @property (nonatomic, copy) NSString *videoFormat;
  424. /*!
  425. * @abstract 采集的视频数据的帧率,默认为 24。
  426. *
  427. * @since v4.0.0
  428. */
  429. @property (nonatomic, assign) NSUInteger videoFrameRate;
  430. /*!
  431. * @abstract 前置摄像头,预览是否开启镜像,默认为 YES。
  432. *
  433. * @since v4.0.0
  434. */
  435. @property (nonatomic, assign) BOOL previewMirrorFrontFacing;
  436. /*!
  437. * @abstract 后置摄像头,预览是否开启镜像,默认为 NO。
  438. *
  439. * @since v4.0.0
  440. */
  441. @property (nonatomic, assign) BOOL previewMirrorRearFacing;
  442. /*!
  443. * @abstract 前置摄像头,对方观看时是否开启镜像,默认 YES。
  444. *
  445. * @since v5.2.0
  446. */
  447. @property (nonatomic, assign) BOOL encodeMirrorFrontFacing;
  448. /*!
  449. * @abstract 后置摄像头,对方观看时是否开启镜像,默认 NO。
  450. *
  451. * @since v4.0.0
  452. */
  453. @property (nonatomic, assign) BOOL encodeMirrorRearFacing;
  454. - (instancetype)init NS_UNAVAILABLE;
  455. /*!
  456. * @abstract 切换前后摄像头。
  457. *
  458. * @since v4.0.0
  459. */
  460. - (void)switchCamera __deprecated_msg("Method deprecated in v5.2.3. Use `switchCamera:`");
  461. /*!
  462. * @abstract 切换前后摄像头。
  463. *
  464. * @since v5.2.3
  465. */
  466. - (void)switchCamera:(nullable QNCameraSwitchResultCallback)callback;
  467. /*!
  468. * @abstract 是否开启美颜。
  469. *
  470. * @since v4.0.0
  471. */
  472. - (void)setBeautifyModeOn:(BOOL)beautifyModeOn;
  473. /*!
  474. * @abstract 设置磨皮的程度,范围从 0 ~ 1,0 为不磨皮。
  475. *
  476. * @discussion 如果美颜不开启,设置该参数无效。
  477. *
  478. * @since v5.0.0
  479. */
  480. - (void)setSmoothLevel:(CGFloat)smoothLevel;
  481. /*!
  482. * @abstract 设置美白的程度,范围从 0 ~ 1,0 为不美白。
  483. *
  484. * @discussion 如果美颜不开启,设置该参数无效。
  485. *
  486. * @since v4.0.0
  487. */
  488. - (void)setWhiten:(CGFloat)whiten;
  489. /*!
  490. * @abstract 设置红润的程度,范围是从 0 ~ 1,0 为不红润。
  491. *
  492. * @discussion 如果美颜不开启,设置该参数无效。
  493. *
  494. * @since v4.0.0
  495. */
  496. - (void)setRedden:(CGFloat)redden;
  497. /*!
  498. * @abstract 设置水印。
  499. *
  500. * @since v4.0.0
  501. */
  502. - (void)setWaterMarkWithImage:(UIImage *)waterMarkImage position:(CGPoint)position;
  503. /*!
  504. * @abstract 移除水印。
  505. *
  506. * @since v4.0.0
  507. */
  508. - (void)clearWaterMark;
  509. /*!
  510. * @abstract 设置摄像头 track 发送图片数据
  511. *
  512. * @param image 推流的图片
  513. *
  514. * @discussion 由于某些特殊原因不想使用摄像头采集的数据作为发送视频数据时,可以使用该接口设置一张图片来替代。传入 nil 则关闭该功能。
  515. * @warning 请确保传入的 image 的宽和高是 16 的整数倍。请对应错误码确保传入参数源可用
  516. *
  517. * @return 返回 0 代表接口调用成功,调用失败将直接返回错误码
  518. *
  519. * @since v5.2.5
  520. */
  521. - (int)pushImage:(nullable UIImage *)image;
  522. /*!
  523. * @abstract 开启摄像头采集。
  524. *
  525. * @since v4.0.0
  526. */
  527. - (void)startCapture;
  528. /*!
  529. * @abstract 关闭摄像头采集。
  530. *
  531. * @since v4.0.0
  532. */
  533. - (void)stopCapture;
  534. @end
  535. @class QNScreenVideoTrack;
  536. @protocol QNScreenVideoTrackDelegate <NSObject>
  537. @optional
  538. /*!
  539. * @abstract 录屏运行过程中发生错误会通过该方法回调。
  540. *
  541. * @since v4.0.0
  542. */
  543. - (void)screenVideoTrack:(QNScreenVideoTrack *)screenVideoTrack didFailWithError:(NSError *)error;
  544. @end
  545. #pragma mark -- QNScreenVideoTrack
  546. @interface QNScreenVideoTrack : QNLocalVideoTrack
  547. - (instancetype)init NS_UNAVAILABLE;
  548. /*!
  549. * @abstract 判断屏幕共享功能是否可用
  550. *
  551. * @discussion 屏幕共享功能仅在 iOS 11 及以上版本可用
  552. *
  553. * @since v4.0.0
  554. */
  555. + (BOOL)isScreenRecorderAvailable;
  556. /*!
  557. * @abstract 录屏 Track 回调代理。
  558. *
  559. * @since v4.0.0
  560. */
  561. @property (nonatomic, weak) id<QNScreenVideoTrackDelegate> screenDelegate;
  562. @end
  563. #pragma mark -- QNCustomVideoTrack
  564. @interface QNCustomVideoTrack : QNLocalVideoTrack
  565. - (instancetype)init NS_UNAVAILABLE;
  566. /*!
  567. * @abstract 导入视频数据。
  568. *
  569. * @discussion 调用此接口将把数据导入给所有 QNCustomVideoTrack 的 Track。
  570. *
  571. * @param sampleBuffer 支持导入的视频数据格式为:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange
  572. * 和 kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange。
  573. *
  574. * @since v4.0.0
  575. */
  576. - (void)pushVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer;
  577. /*!
  578. * @abstract 导入视频数据。
  579. *
  580. * @discussion 调用此接口将把数据导入给所有 QNCustomVideoTrack 的 Track。
  581. *
  582. * @param pixelBuffer 支持导入的视频数据格式为:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange
  583. * 和 kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange。
  584. *
  585. * @since v4.0.0
  586. */
  587. - (void)pushPixelBuffer:(CVPixelBufferRef)pixelBuffer;
  588. @end
  589. #pragma mark -- QNRemoteTrack
  590. @interface QNRemoteTrack : QNTrack
  591. - (instancetype)init NS_UNAVAILABLE;
  592. /*!
  593. * @abstract 是否已订阅。
  594. *
  595. * @since v4.0.0
  596. */
  597. @property (nonatomic, readonly) BOOL isSubscribed;
  598. @end
  599. @class QNRemoteAudioTrack;
  600. @protocol QNRemoteAudioTrackDelegate <NSObject>
  601. /*!
  602. * @abstract 音频 Track 数据回调。
  603. *
  604. * @since v4.0.0
  605. */
  606. - (void)remoteAudioTrack:(QNRemoteAudioTrack *)remoteAudioTrack didGetAudioBuffer:(AudioBuffer *)audioBuffer bitsPerSample:(NSUInteger)bitsPerSample sampleRate:(NSUInteger)sampleRate;
  607. /*!
  608. * @abstract 订阅的远端音频 Track 开关静默时的回调。
  609. *
  610. * @since v5.0.0
  611. */
  612. - (void)remoteAudioTrack:(QNRemoteAudioTrack *)remoteAudioTrack didMuteStateChanged:(BOOL)isMuted;
  613. @end
  614. #pragma mark -- QNRemoteAudioTrack
  615. @interface QNRemoteAudioTrack : QNRemoteTrack
  616. /*!
  617. * @abstract 远端音频 Track 回调代理。
  618. *
  619. * @since v5.0.0
  620. */
  621. @property (nonatomic, weak) id<QNRemoteAudioTrackDelegate> delegate;
  622. - (instancetype)init NS_UNAVAILABLE;
  623. /*!
  624. * @abstract 设置远端音频 Track 播放音量。范围从 0 ~ 10,10 为最大
  625. *
  626. * @discussion 需要发布成功后才可以执行。本次操作仅对远端音频播放音量做调整,远端音量回调为远端音频数据的原始音量,不会基于本设置做相应调整。
  627. *
  628. * @warning 部分机型调整音量放大会出现低频噪音
  629. *
  630. * @since v4.0.0
  631. */
  632. - (void)setVolume:(double)volume;
  633. /*!
  634. * @abstract 获取用户音量等级,volume 值在 [0, 1] 之间。
  635. *
  636. * @since v5.0.0
  637. */
  638. - (float)getVolumeLevel;
  639. @end
  640. @class QNRemoteVideoTrack;
  641. @protocol QNRemoteVideoTrackDelegate <NSObject>
  642. @optional
  643. /*!
  644. * @abstract 视频 Track 数据回调。
  645. *
  646. * @since v4.0.0
  647. */
  648. - (void)remoteVideoTrack:(QNRemoteVideoTrack *)remoteVideoTrack didGetPixelBuffer:(CVPixelBufferRef)pixelBuffer;
  649. /*!
  650. * @abstract 订阅的远端视频 Track 开关静默时的回调。
  651. *
  652. * @since v5.0.0
  653. */
  654. - (void)remoteVideoTrack:(QNRemoteVideoTrack *)remoteVideoTrack didMuteStateChanged:(BOOL)isMuted;
  655. /*!
  656. * @abstract 订阅的远端视频 Track 分辨率发生变化时的回调。
  657. *
  658. * @since v5.0.0
  659. */
  660. - (void)remoteVideoTrack:(QNRemoteVideoTrack *)remoteVideoTrack didVideoProfileChanged:(QNTrackProfile)profile;
  661. @end
  662. #pragma mark -- QNRemoteVideoTrack
  663. @interface QNRemoteVideoTrack : QNRemoteTrack
  664. /*!
  665. * @abstract 视频 Track 回调代理。
  666. *
  667. * @since v5.0.0
  668. */
  669. @property (nonatomic, weak) id<QNRemoteVideoTrackDelegate> delegate;
  670. /*!
  671. * @abstract 是否开启大小流。
  672. *
  673. * @since v4.0.0
  674. */
  675. @property (nonatomic, readonly) BOOL isMultiProfileEnabled;
  676. /*!
  677. * @abstract 当前大小流等级。
  678. *
  679. * @since v4.0.0
  680. */
  681. @property (nonatomic, assign, readonly) QNTrackProfile profile;
  682. - (instancetype)init NS_UNAVAILABLE;
  683. /*!
  684. * @abstract 变更订阅大小流等级。
  685. *
  686. * @since v4.0.0
  687. */
  688. - (void)setProfile:(QNTrackProfile)profile;
  689. /*!
  690. * @abstract 视频 Track 渲染。
  691. *
  692. * @discussion videoView 会被内部引用,外部销毁时需主动传 nil
  693. *
  694. * @since v5.0.0
  695. */
  696. - (void)play:(QNVideoGLView *)videoView;
  697. @end
  698. NS_ASSUME_NONNULL_END