摘要:
在移动直播、执法记录、远程巡检、移动双录、在线教育、低延迟互动等场景中,iOS 端不仅需要把摄像头画面实时推送到 RTMP 服务器,还经常需要同时支持本地录像、实时快照、局域网 RTSP 预览等能力。本文基于 SmartiOSPublisherV2 示例工程,介绍 iOS 平台下如何集成大牛直播 SDK(SmartMediaKit),实现摄像头采集、RTMP 推流、本地录像和轻量级 RTSP 服务。
关键词:大牛直播SDK、SmartMediaKit、iOS推流、RTMP推流、轻量级RTSP服务、SmartiOSPublisherV2、摄像头采集、AVFoundation、VideoToolbox、本地录像、低延迟直播
一、背景
在移动直播、执法记录、远程巡检、移动双录、在线教育、低延迟互动等场景中,iOS 端不仅需要把摄像头画面推送到 RTMP 服务器,还经常需要同时支持本地录像、实时快照、局域网 RTSP 预览等能力。
大牛直播 SDK(SmartMediaKit)iOS 推流模块,基于 iOS 原生采集和 VideoToolbox 硬编码能力,提供了 RTMP 推流、轻量级 RTSP 服务、本地录像、实时快照、静音、镜像、摄像头切换等完整功能。
本文基于 SmartiOSPublisherV2 示例工程,介绍 iOS 平台下如何集成 SmartMediaKit,实现摄像头采集、RTMP 推流、录像和轻量级 RTSP 服务。
二、功能特性

SmartMediaKit iOS 推流 SDK 主要能力如下:
| 功能 | 说明 |
|---|---|
| 摄像头采集 | 支持前后摄像头采集、切换摄像头、预览镜像 |
| 视频编码 | H.264 VideoToolbox 硬编码 |
| 音频编码 | AAC 编码 |
| RTMP 推流 | 支持低延迟 RTMP 发布 |
| 轻量级 RTSP 服务 | 内置 RTSP Server,局域网内可直接拉流 |
| 本地录像 | 支持 MP4 录像、暂停/恢复、文件大小切片 |
| 实时快照 | 支持推流、录像、RTSP 过程中抓图 |
| 状态回调 | 支持 RTMP 连接状态、录像状态、RTSP URL、发送队列状态等事件 |
| 用户数据 | 支持发送 UTF-8 文本数据 |
三、工程结构
SmartiOSPublisherV2 示例工程主要包括:
objectivec
SmartiOSPublisher/
├── ViewController.m // 主界面和推流控制逻辑
├── ViewController.h
├── NTCameraVideoCapture.h/.m // 外部摄像头采集封装
├── SettingView.h/.m // 分辨率、推流类型、RTMP地址等入口配置
├── AppDelegate.h/.m
├── Info.plist
├── main.m
└── daniuliveSDK/
├── include/
│ ├── SmartPublisherSDK.h
│ ├── SmartRTSPSeverSDK.h
│ └── nt_event_define.h
└── libs/
└── SmartPublisherSDKAll.xcframework
当前推荐使用:
SmartPublisherSDKAll.xcframework
四、工程集成
1. 添加 SDK
将编译好的:
objectivec
SmartPublisherSDKAll.xcframework
拷贝到:
objectivec
SmartiOSPublisher/daniuliveSDK/libs/
并在 Xcode 中添加到:
objectivec
Target -> General -> Frameworks, Libraries, and Embedded Content
静态 xcframework 选择:
Do Not Embed
2. 添加头文件
确保工程可以访问:
objectivec
daniuliveSDK/include/SmartPublisherSDK.h
daniuliveSDK/include/SmartRTSPSeverSDK.h
daniuliveSDK/include/nt_event_define.h
在代码中引用:
objectivec
#import "SmartPublisherSDK.h"
#import "SmartRTSPSeverSDK.h"
#import "nt_event_define.h"
3. 链接系统库
iOS App 侧建议链接以下系统库:
objectivec
AVFoundation.framework
VideoToolbox.framework
AudioToolbox.framework
CoreMedia.framework
CoreVideo.framework
CoreGraphics.framework
CFNetwork.framework
Security.framework
Foundation.framework
UIKit.framework
libz.tbd
libbz2.tbd
libiconv.tbd
libc++.tbd
其中:
AVFoundation.framework用于摄像头、麦克风采集;VideoToolbox.framework用于 H.264 硬编码;CoreMedia.framework、CoreVideo.framework用于CMSampleBufferRef、CVPixelBufferRef;CFNetwork.framework、Security.framework用于网络连接相关能力;UIKit.framework、Foundation.framework是 iOS App 基础依赖。
4. Info.plist 权限
摄像头、麦克风和相册写入需要声明权限:
objectivec
<key>NSCameraUsageDescription</key>
<string>需要使用摄像头进行视频推流</string>
<key>NSMicrophoneUsageDescription</key>
<string>需要使用麦克风进行音频推流</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>需要保存快照到相册</string>
如果业务需要读取相册,也可以增加:
objectivec
<key>NSPhotoLibraryUsageDescription</key>
<string>需要访问相册</string>
五、整体流程

iOS 推流端的典型流程如下:
objectivec
申请摄像头 / 麦克风权限
|
v
初始化 SmartPublisherSDK
|
v
配置视频编码、音频编码、帧率、GOP、录像、快照
|
v
启动摄像头采集和预览
|
v
启动 RTMP 推流 / 本地录像 / RTSP 服务 / RTSP 流
|
v
事件回调更新 UI
|
v
停止推流、录像、RTSP 流、采集
|
v
释放 SDK
SmartiOSPublisherV2 的核心设计可以概括为:
上层负责摄像头采集和预览,
SDK 负责编码、封装、RTMP推流、RTSP输出、录像和快照。
整体链路如下:
objectivec
iOS 摄像头
|
v
NTCameraVideoCapture
|
| CMSampleBufferRef
v
SmartPublisherSDK
|
| H.264 硬编码 / AAC 编码
v
RTMP 推流 / 轻量级 RTSP 服务 / 本地录像 / 实时快照
六、SDK 初始化
示例工程中,核心初始化逻辑可以放在 ViewController.m 的 _setupPublisher 中。
推荐配置如下:
objectivec
self.smart_publisher_sdk = [[SmartPublisherSDK alloc] init];
self.smart_publisher_sdk.delegate = self;
// audio_opt = 1: SDK 内部采集音频
// video_opt = 3: 外部编码前 CMSampleBuffer 视频数据
NSInteger audioOpt = 1;
NSInteger videoOpt = 3;
NSInteger ret = [self.smart_publisher_sdk SmartPublisherInit:audioOpt
video_opt:videoOpt];
if (ret != DANIULIVE_RETURN_OK) {
NSLog(@"SmartPublisherInit failed");
return;
}
配置编码参数:
objectivec
// H.264 硬编码
[self.smart_publisher_sdk SmartPublisherSetVideoEncoderType:1
isHwEncoder:YES];
// AAC 音频编码
[self.smart_publisher_sdk SmartPublisherSetAudioEncoderType:1
isHwEncoder:NO];
[self.smart_publisher_sdk SmartPublisherSetFPS:30];
[self.smart_publisher_sdk SmartPublisherSetGopInterval:60];
开启录像音视频:
objectivec
[self.smart_publisher_sdk SmartPublisherSetRecorderAudio:1];
[self.smart_publisher_sdk SmartPublisherSetRecorderVideo:1];
开启快照能力:
objectivec
[self.smart_publisher_sdk SmartPublisherSaveImageFlag:1];
低延迟场景下,GOP 一般建议设置为:
GOP = FPS × 2
比如 30fps,则 GOP 为 60,即 2 秒一个关键帧。
如果需要视频缩放,可以配置:
objectivec
[self.smart_publisher_sdk SmartPublisherSetVideoSizeScaleRate:1.0];
如果需要发送用户自定义文本数据,可以设置队列大小:
objectivec
[self.smart_publisher_sdk SmartPublisherSetPostUserDataQueueMaxSize:3
reserve:0];
七、摄像头采集

当前 SmartiOSPublisherV2 推荐使用上层外部摄像头采集模块 NTCameraVideoCapture,采集到 CMSampleBufferRef 后同步投递给 SDK。
NTCameraVideoCapture 的职责是:
- 创建
AVCaptureSession; - 配置前后摄像头;
- 配置采集分辨率和帧率;
- 维护本地预览层;
- 将视频帧通过 delegate 回调给上层。
接口示例:
objectivec
_cameraCapture = [[NTCameraVideoCapture alloc]
initWithPreview:self.localPreview
sessionPreset:AVCaptureSessionPreset1280x720
fps:30];
_cameraCapture.delegate = self;
[_cameraCapture start];
摄像头采集内部建议使用 AVCaptureVideoDataOutput 输出 NV12 数据:
objectivec
_videoOutput = [[AVCaptureVideoDataOutput alloc] init];
_videoOutput.videoSettings = @{
(id)kCVPixelBufferPixelFormatTypeKey:
@(kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange)
};
_videoOutput.alwaysDiscardsLateVideoFrames = YES;
[_videoOutput setSampleBufferDelegate:self queue:_captureQueue];
本地预览可以使用:
objectivec
_previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_session];
_previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
_previewLayer.frame = _previewView.bounds;
[_previewView.layer addSublayer:_previewLayer];
视频帧回调:
objectivec
- (void)onCameraVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer
rotateDegress:(NSInteger)rotateDegress {
[self.smart_publisher_sdk SmartPublisherPostVideoSampleBufferV2:sampleBuffer
rotateDegress:rotateDegress];
}
这里使用 SmartPublisherPostVideoSampleBufferV2 的原因是 iOS 摄像头方向需要结合设备方向和推流方向处理,SDK 可以在编码前完成必要的旋转适配。
需要注意的是,CMSampleBufferRef 一般只在当前回调中有效,不建议跨线程长期持有,应在回调中尽快投递给 SDK。
八、RTMP 推流

RTMP 推流前,建议先校验 URL:
objectivec
- (NSString *)validatedRTMPURL {
NSString *url = self.urlTextField.text;
if (url.length == 0 || ![url hasPrefix:@"rtmp://"]) {
return nil;
}
return url;
}
启动 RTMP 推流:
objectivec
NSString *url = [self validatedRTMPURL];
if (!url) {
NSLog(@"请输入正确的 RTMP 推流地址");
return;
}
NSInteger ret = [self.smart_publisher_sdk SmartPublisherStartPublisher:url];
if (ret != DANIULIVE_RETURN_OK) {
NSLog(@"启动 RTMP 推流失败");
return;
}
NSLog(@"正在连接 RTMP 服务器...");
停止 RTMP 推流:
objectivec
[self.smart_publisher_sdk SmartPublisherStopPublisher];
示例工程中,RTMP 推流按钮会在"开始推流"和"停止推流"之间切换,同时通过 SDK 事件回调更新当前连接状态。
RTMP 推流适合公网服务器、CDN、直播平台、业务后台或私有流媒体平台接入。对于低延迟场景,还需要结合合理的 GOP、码率、服务器缓存策略和播放端缓冲策略。
九、本地录像
录像能力可以和 RTMP 推流、RTSP 流同时工作,也可以单独使用。

设置录像目录:
objectivec
NSString *dir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
YES) firstObject];
[self.smart_publisher_sdk SmartPublisherSetRecorderDirectory:dir];
设置录像文件大小切片:
objectivec
[self.smart_publisher_sdk SmartPublisherSetRecorderFileMaxSize:200];
开始录像:
objectivec
NSInteger ret = [self.smart_publisher_sdk SmartPublisherStartRecorder];
if (ret != DANIULIVE_RETURN_OK) {
NSLog(@"启动录像失败");
return;
}
暂停录像:
objectivec
[self.smart_publisher_sdk SmartPublisherPauseRecorder:1];
恢复录像:
[self.smart_publisher_sdk SmartPublisherPauseRecorder:0];
停止录像:
[self.smart_publisher_sdk SmartPublisherStopRecorder];
录像文件大小达到设置的上限后,SDK 会按策略自动切片,便于长时间录像场景使用。
典型业务包括:
- 执法记录;
- 巡检留档;
- 金融双录;
- 教学录制;
- 远程质检;
- 设备调试记录。
十、实时快照
初始化时需要先开启快照能力:
[self.smart_publisher_sdk SmartPublisherSaveImageFlag:1];
抓取当前画面:
objectivec
NSString *dir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
YES) firstObject];
NSString *path = [dir stringByAppendingPathComponent:@"snapshot.png"];
NSInteger ret = [self.smart_publisher_sdk SmartPublisherSaveCurImage:path];
if (ret != DANIULIVE_RETURN_OK) {
NSLog(@"快照失败,请确认当前有视频输出");
}
示例工程中,快照成功后可以结合系统相册接口保存到相册,适合执法记录、巡检截图、远程质检等场景。
快照完成后的典型处理流程如下:
objectivec
SmartPublisherSaveCurImage
|
v
EVENT_DANIULIVE_ERC_PUBLISHER_CAPTURE_IMAGE
|
v
读取 PNG 文件
|
v
UIImageWriteToSavedPhotosAlbum
|
v
删除临时文件
十一、轻量级 RTSP 服务
SmartMediaKit iOS 推流 SDK 内置轻量级 RTSP 服务。它适合局域网预览、设备调试、内网无 RTMP Server 的场景。

需要明确的是:
RTSP 服务启动 ≠ RTSP 流发布
RTSP 服务负责监听端口,RTSP 流发布负责把当前 SmartPublisherSDK 的音视频数据绑定到 RTSP Server 并对外输出。
1. 启动 RTSP 服务
objectivec
self.smart_rtsp_server_sdk = [[SmartRTSPServerSDK alloc] init];
void *rtspHandle = [self.smart_rtsp_server_sdk OpenRtspServer:0];
if (!rtspHandle) {
NSLog(@"创建 RTSP 服务失败");
return;
}
[self.smart_rtsp_server_sdk SetRtspServerPort:rtspHandle port:8554];
[self.smart_rtsp_server_sdk SetRtspServerMulticast:rtspHandle is_multicast:0];
NSInteger ret = [self.smart_rtsp_server_sdk StartRtspServer:rtspHandle
reserve:0];
if (ret != DANIULIVE_RETURN_OK) {
NSLog(@"启动 RTSP 服务失败");
return;
}
2. 发布 RTSP 流
objectivec
[self.smart_publisher_sdk SetRtspStreamName:@"stream1"];
[self.smart_publisher_sdk ClearRtspStreamServer];
[self.smart_publisher_sdk AddRtspStreamServer:rtspHandle reserve:0];
NSInteger ret = [self.smart_publisher_sdk StartRtspStream:0];
if (ret != DANIULIVE_RETURN_OK) {
NSLog(@"启动 RTSP 流失败");
return;
}
播放地址类似:
rtsp://<iPhone局域网IP>:8554/stream1
可以使用 VLC、ffplay 或大牛直播播放器 SDK 拉流验证。
3. 查询 RTSP 会话数
objectivec
NSInteger count = 0;
[self.smart_rtsp_server_sdk GetRtspServerClientSessionNumbers:rtspHandle
session_numbers:&count];
NSLog(@"当前 RTSP 客户端数量: %ld", (long)count);
4. 停止 RTSP 流和服务
停止 RTSP 流:
[self.smart_publisher_sdk StopRtspStream];
停止 RTSP 服务:
[self.smart_rtsp_server_sdk StopRtspServer:rtspHandle];
[self.smart_rtsp_server_sdk CloseRtspServer:rtspHandle];
建议先停止 RTSP 流,再停止 RTSP 服务。
十二、事件回调
SDK 通过 SmartPublisherDelegate 回调推流、录像、RTSP 等事件:
objectivec
- (NSInteger)handleSmartPublisherEvent:(NSInteger)nID
param1:(unsigned long long)param1
param2:(unsigned long long)param2
param3:(NSString *)param3
param4:(NSString *)param4
pObj:(void *)pObj {
dispatch_async(dispatch_get_main_queue(), ^{
// 更新 UI
});
return 0;
}
常见事件包括:
|-------------|--------------|
| 事件 | 说明 |
| RTMP 连接中 | 正在连接服务器 |
| RTMP 已连接 | 推流连接建立 |
| RTMP 推流中断 | 网络异常或服务器断开 |
| RTMP 已停止 | 推流停止 |
| RTMP 发送队列延迟 | 网络发送堆积提醒 |
| 录像新文件 | 开始写入一个新的录像文件 |
| 录像文件完成 | 一个录像文件写入完成 |
| 快照完成 | 当前帧抓图完成 |
| RTSP URL | RTSP 地址生成 |
典型处理方式如下:
objectivec
- (NSInteger)handleSmartPublisherEvent:(NSInteger)nID
param1:(unsigned long long)param1
param2:(unsigned long long)param2
param3:(NSString *)param3
param4:(NSString *)param4
pObj:(void *)pObj {
dispatch_async(dispatch_get_main_queue(), ^{
switch (nID) {
case EVENT_DANIULIVE_ERC_PUBLISHER_CONNECTING:
NSLog(@"当前状态: 正在连接 RTMP 服务器...");
break;
case EVENT_DANIULIVE_ERC_PUBLISHER_CONNECTED:
NSLog(@"当前状态: RTMP 已连接");
break;
case EVENT_DANIULIVE_ERC_PUBLISHER_CONNECTION_FAILED:
NSLog(@"当前状态: RTMP 连接失败,SDK 将尝试重连");
break;
case EVENT_DANIULIVE_ERC_PUBLISHER_DISCONNECTED:
NSLog(@"当前状态: RTMP 连接断开,SDK 将尝试重连");
break;
case EVENT_DANIULIVE_ERC_PUBLISHER_STOP:
NSLog(@"当前状态: RTMP 推流已停止");
break;
case EVENT_DANIULIVE_ERC_PUBLISHER_SEND_DELAY:
NSLog(@"当前状态: RTMP 堆积 %llums / 队列 %llu 包",
param1, param2);
break;
case EVENT_DANIULIVE_ERC_PUBLISHER_RECORDER_START_NEW_FILE:
NSLog(@"开始写入新录像文件: %@", param3);
break;
case EVENT_DANIULIVE_ERC_PUBLISHER_ONE_RECORDER_FILE_FINISHED:
NSLog(@"录像文件完成: %@", param3);
break;
case EVENT_DANIULIVE_ERC_PUBLISHER_CAPTURE_IMAGE:
NSLog(@"快照完成: %@", param3);
break;
case EVENT_DANIULIVE_ERC_PUBLISHER_RTSP_URL:
NSLog(@"RTSP URL: %@", param3);
break;
default:
break;
}
});
return 0;
}
事件回调可能来自 SDK 工作线程,因此 UI 更新必须切回主线程。
其中 EVENT_DANIULIVE_ERC_PUBLISHER_SEND_DELAY 对低延迟业务非常有价值。如果该事件持续出现,说明 RTMP 发送链路可能有堆积,需要关注当前网络、服务器接收能力、码率设置或播放端链路。
十三、常用控制功能
1. 切换摄像头
外部采集模式下:
[_cameraCapture switchCamera];
SDK 内部采集模式下:
[self.smart_publisher_sdk SmartPublisherSwitchCamera];
2. 镜像预览
外部采集模式:
[_cameraCapture setPreviewMirror:YES];
SDK 内部采集模式:
[self.smart_publisher_sdk SmartPublisherSetMirror:YES];
需要注意,本地预览镜像和远端推流画面镜像是两个概念。前置摄像头场景中,本地预览镜像更符合用户习惯,但远端画面是否镜像,需要根据业务需求决定。
3. 静音
[self.smart_publisher_sdk SmartPublisherSetMute:YES];
恢复声音:
[self.smart_publisher_sdk SmartPublisherSetMute:NO];
4. 发送文本用户数据
NSString *text = @"大牛直播 iOS SDK";
[self.smart_publisher_sdk SmartPublisherPostUserUTF8StringData:text
reserve:0];
该能力可用于发送业务状态、设备编号、时间戳、告警标记、扩展事件等数据。
十四、生命周期管理
iOS 推流端建议把状态拆开管理,不要把 RTMP 推流、录像、RTSP 服务和 RTSP 流混成一个状态。

推荐维护类似状态:
objectivec
BOOL _isRtmpPublishing;
BOOL _isRecording;
BOOL _isRecordingPaused;
BOOL _isRtspServiceStarted;
BOOL _isRtspPublishing;
void *_rtspHandle;
原因是:
- RTMP 推流可以停止,但录像可能还在继续;
- RTSP 服务可以启动,但 RTSP 流不一定发布;
- RTSP 流停止后,RTSP 服务可以继续监听;
- 录像可以单独运行,不依赖 RTMP 推流;
- 快照依赖当前有视频输出,但不等于推流状态;
- 退出页面时需要按顺序清理资源。
推荐停止顺序:
objectivec
停止 RTMP 推流
|
停止 RTSP 流
|
停止录像
|
停止 RTSP 服务
|
停止摄像头采集
|
停止 SDK 采集
|
SmartPublisherUnInit
如果 RTSP 流依赖 RTSP 服务,则停止 RTSP 服务前必须先停止 RTSP 流。
十五、低延迟建议
iOS 端做低延迟 RTMP 推流时,建议注意以下几点:
- 视频编码优先使用 VideoToolbox 硬编码;
- 摄像头输出尽量走 NV12,避免额外像素格式转换;
- GOP 不宜过长,建议 1 到 2 秒一个关键帧;
- 分辨率和码率要匹配,避免码率过低导致画质明显下降;
- 网络弱时,RTMP 发送队列可能堆积,应关注 SDK 的发送延迟事件;
- 摄像头采集帧率不要盲目设置过高,移动端一般建议 25fps 或 30fps;
- 不需要复杂美颜、滤镜、水印时,尽量避免每帧额外转换,直接走
CMSampleBufferRef路径; - 推流、RTSP 和录像尽量复用同一路采集和编码链路,避免重复采集和重复编码;
- 局域网预览优先考虑 RTSP,公网分发优先考虑 RTMP。
推荐码率参考:
|-----------|------------------|
| 分辨率 | 建议码率 |
| 640×480 | 800 - 1500 kbps |
| 1280×720 | 2000 - 3500 kbps |
| 1920×1080 | 3500 - 6000 kbps |
实际码率还需要结合画面复杂度、帧率、网络质量、编码器配置和业务延迟要求综合调整。
十六、集成注意事项
1. SmartPublisherInit 必须先调用
RTMP 推流、录像、RTSP 流、快照等能力,都依赖 SmartPublisherInit 后的 SDK 实例。
2. 摄像头和麦克风权限必须提前申请
iOS 权限弹窗只会在首次请求时出现。如果用户拒绝,需要引导用户到系统设置中手动开启。
3. 使用外部视频采集时,必须同步投递 sampleBuffer
CMSampleBufferRef 不建议跨线程长期持有。应在采集回调中尽快调用:
objectivec
[self.smart_publisher_sdk SmartPublisherPostVideoSampleBufferV2:sampleBuffer
rotateDegress:rotateDegress];
4. 快照功能需要先开启
必须先调用:
[self.smart_publisher_sdk SmartPublisherSaveImageFlag:1];
否则快照接口可能返回失败。
5. RTSP 服务和 RTSP 流要区分
启动 RTSP Server 只是监听端口。真正输出音视频,还需要调用:
objectivec
[self.smart_publisher_sdk SetRtspStreamName:@"stream1"];
[self.smart_publisher_sdk ClearRtspStreamServer];
[self.smart_publisher_sdk AddRtspStreamServer:rtspHandle reserve:0];
[self.smart_publisher_sdk StartRtspStream:0];
6. 停止 RTSP 服务前,先停止 RTSP 流
建议先:
objectivec
[self.smart_publisher_sdk StopRtspStream];
再:
objectivec
[self.smart_rtsp_server_sdk StopRtspServer:rtspHandle];
[self.smart_rtsp_server_sdk CloseRtspServer:rtspHandle];
7. 手机和拉流端需要在同一局域网
局域网 RTSP 预览时,iPhone 和播放器端需要在同一网络环境下。还需要注意 Wi-Fi 隔离、路由器防火墙、端口占用等问题。
8. App 进入后台要单独处理
iOS 后台对摄像头、麦克风和网络行为有系统限制。正式产品需要根据业务场景、后台模式和 App Store 审核要求做专门设计。
十七、核心 API 速查
SmartPublisherSDK
|--------------------------------------------------------|--------------------|
| API | 说明 |
| SmartPublisherInit:video_opt: | 初始化推流 SDK |
| SmartPublisherSetVideoEncoderType:isHwEncoder: | 设置视频编码器 |
| SmartPublisherSetAudioEncoderType:isHwEncoder: | 设置音频编码器 |
| SmartPublisherSetFPS: | 设置帧率 |
| SmartPublisherSetGopInterval: | 设置 GOP |
| SmartPublisherSetVideoSizeScaleRate: | 设置视频缩放比例 |
| SmartPublisherStartCapture: | 启动 SDK 采集准备 |
| SmartPublisherStopCaputure | 停止 SDK 采集 |
| SmartPublisherPostVideoSampleBufferV2:rotateDegress: | 外部投递视频帧并指定旋转角度 |
| SmartPublisherStartPublisher: | 启动 RTMP 推流 |
| SmartPublisherStopPublisher | 停止 RTMP 推流 |
| SmartPublisherSetRecorderDirectory: | 设置录像目录 |
| SmartPublisherSetRecorderFileMaxSize: | 设置录像文件大小 |
| SmartPublisherStartRecorder | 开始录像 |
| SmartPublisherPauseRecorder: | 暂停或恢复录像 |
| SmartPublisherStopRecorder | 停止录像 |
| SmartPublisherSaveImageFlag: | 开启快照能力 |
| SmartPublisherSaveCurImage: | 保存当前帧快照 |
| SmartPublisherSetMute: | 设置静音 |
| SmartPublisherSwitchCamera | SDK 内部采集模式下切换摄像头 |
| SmartPublisherSetMirror: | SDK 内部采集模式下设置镜像 |
| SmartPublisherPostUserUTF8StringData:reserve: | 发送 UTF-8 用户自定义文本数据 |
| SetRtspStreamName: | 设置 RTSP 流名称 |
| ClearRtspStreamServer | 清空 RTSP Server 绑定 |
| AddRtspStreamServer:reserve: | 绑定 RTSP Server |
| StartRtspStream: | 发布 RTSP 流 |
| StopRtspStream | 停止 RTSP 流 |
| SmartPublisherUnInit | 释放 SDK |
SmartRTSPServerSDK
|------------------------------------------------------|----------------------|
| API | 说明 |
| OpenRtspServer: | 创建 RTSP Server 并返回句柄 |
| SetRtspServerPort:port: | 设置 RTSP 监听端口 |
| SetRtspServerMulticast:is_multicast: | 设置单播或组播 |
| StartRtspServer:reserve: | 启动 RTSP Server |
| GetRtspServerClientSessionNumbers:session_numbers: | 查询当前 RTSP 会话数 |
| StopRtspServer: | 停止 RTSP Server |
| CloseRtspServer: | 关闭并释放 RTSP Server 句柄 |
十八、总结
大牛直播 SDK(SmartMediaKit)iOS 推流方案,围绕移动端音视频采集和低延迟直播场景,提供了摄像头采集、H.264 硬编码、AAC 编码、RTMP 推流、轻量级 RTSP 服务、本地录像和实时快照等完整能力。
SmartiOSPublisherV2 示例工程采用"上层外部摄像头采集 + SDK 编码封装输出"的设计方式,上层负责 AVCaptureSession、本地预览、前后摄像头切换、预览镜像等采集控制,SDK 负责 RTMP 推流、RTSP 发布、录像、快照、事件回调和用户数据发送。
对于需要在 iPhone 或 iPad 上实现移动直播、执法记录、远程巡检、移动双录、教育互动、局域网 RTSP 预览或行业低延迟视频回传的开发者来说,SmartiOSPublisherV2 可以作为一个清晰、完整、可二次开发的参考实现。
📎 CSDN官方博客:音视频牛哥-CSDN博客