Skip to content

Commit

Permalink
外部发送音频事例
Browse files Browse the repository at this point in the history
Change-Id: Id727234d221013b075ccf74facc878b9f4cb4991
  • Loading branch information
tonychanchen committed Apr 21, 2023
1 parent 40cddbd commit e23d2f9
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 5 deletions.
51 changes: 48 additions & 3 deletions Source/LinkSDKDemo/Video/P2P/Controller/TIoTDemoVideoPushVC.m
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@
#import <AVFoundation/AVFoundation.h>
#import "ReachabilityManager.h"
#import "TIoTSessionManager.h"
#import "TIoTPCMXEchoRecord.h"
#import "TIoTAACEncoder.h"
#import "TIoTH264Encoder.h"

static CGFloat const kPadding = 16;
static NSString *const kPreviewDeviceCellID = @"kPreviewDeviceCellID";
Expand All @@ -41,7 +44,7 @@ typedef NS_ENUM(NSInteger, TIotDemoDeviceDirection) {
};


@interface TIoTDemoVideoPushVC ()
@interface TIoTDemoVideoPushVC ()<H264EncoderDelegate,TIoTAACEncoderDelegate>
@property (nonatomic, assign) CGRect screenRect;
@property (nonatomic, strong) UIImageView *imageView;
@property (nonatomic, strong) UIView *remoteVideoView; //录像中提示view
Expand All @@ -61,6 +64,9 @@ @interface TIoTDemoVideoPushVC ()
@property (nonatomic, assign) BOOL is_ijkPlayer_stream; //通过播放器 还是 通过裸流拉取数据
@property (nonatomic, assign) BOOL is_reconnect_xp2p; //是否正在重连,指设备断网的重连,app重连不走这个
@property (nonatomic, assign) BOOL is_reconnect_break; //退出页面,停止重连

@property (nonatomic, strong) TIoTPCMXEchoRecord *pcmRecord;
@property (nonatomic, strong) TIoTAACEncoder *aacEncoder;
@end

@implementation TIoTDemoVideoPushVC
Expand Down Expand Up @@ -102,6 +108,36 @@ - (void)viewDidLoad {
[self initVideoParamView];

[self requestXp2pInfo];

if (NO) {
//走外部的采集编码来发送的话,打开开关即可,最终通过 SendExternalAudioPacket 发送数据
//打开之后需将下面代码 isExternal 参数也打开即可
[self configAudioVideo];
}
}

- (void)configAudioVideo {
self.pcmRecord = [[TIoTPCMXEchoRecord alloc] initWithChannel:1 isEcho:YES];
[self.pcmRecord set_record_callback:record_callback user:(__bridge void * _Nonnull)(self)];
// [self.record start_record];

AudioStreamBasicDescription inAudioStreamBasicDescription = self.pcmRecord.pcmStreamDescription;
self.aacEncoder = [[TIoTAACEncoder alloc] initWithAudioDescription:inAudioStreamBasicDescription];
self.aacEncoder.delegate = self;
self.aacEncoder.audioType = TIoTAVCaptionFLVAudio_8;
}
static void record_callback(uint8_t *buffer, int size, void *u)
{
TIoTDemoVideoPushVC *vc = (__bridge TIoTDemoVideoPushVC *)(u);
printf("pcm_size_callback: %d\n", size);
NSData *data = [NSData dataWithBytes:buffer length:size];
// [_fileHandle writeData:data];
[vc.aacEncoder encodePCMData:data];
}
#pragma mark - TIoTAACEncoderDelegate
- (void)getEncoderAACData:(NSData *)data {
// [_fileHandle writeData:data];
[[TIoTCoreXP2PBridge sharedInstance] SendExternalAudioPacket:data];
}

- (void)requestDiffDeviceDataWithXp2pInfo:(NSString *)xp2pInfo {
Expand Down Expand Up @@ -199,7 +235,7 @@ - (void)getDeviceStatusWithType:(NSString *)singleType qualityType:(NSString *)q
//直播
}else if ([singleType isEqualToString:action_voice]) {
//对讲
NSString *channel = @"";
NSString *channel = @""; //channel 请求参数采用 key1=value&key2=value2
if (weakSelf.isNVR == NO) {
channel = @"channel=0";
}else {
Expand All @@ -216,19 +252,28 @@ - (void)getDeviceStatusWithType:(NSString *)singleType qualityType:(NSString *)q
audio_config.channels = 1;
audio_config.isEchoCancel = YES;
audio_config.pitch = tt_pitch; // -6声音会变粗一点; 6声音会变细一点
// audio_config.isExternal = YES;

TIoTCoreVideoConfig *video_config = [TIoTCoreVideoConfig new];
video_config.localView = self.remoteVideoView;
video_config.videoPosition = AVCaptureDevicePositionFront;
video_config.bitRate = 250000;

// video_config.isExternal = YES;

[[TIoTCoreXP2PBridge sharedInstance] sendVoiceToServer:weakSelf.deviceName?:@"" channel:channel audioConfig:audio_config videoConfig:video_config];

/*if(tt_pitch == 6){
tt_pitch = -6;
}else {
tt_pitch = 6;
}*/
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (video_config.isExternal) { //走外部就用外部的采集器发送aac
[self.pcmRecord start_record];
}else {
//否则走SDK本身的采样编码发送
}
});
}

}else {
Expand Down
2 changes: 1 addition & 1 deletion Source/SDK/LinkVideo/FLV/TIoTAVCaptionFLV.mm
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ - (void)setupAudioCapture {
inAudioStreamBasicDescription = self.pcmRecord.pcmStreamDescription;
self.aacEncoder = [[TIoTAACEncoder alloc] initWithAudioDescription:inAudioStreamBasicDescription];
self.aacEncoder.delegate = self;
self.aacEncoder.audioType = _audioRate;
self.aacEncoder.audioType = self.audioConfig.sampleRate;
}

- (AVCaptureDevice *)cameraWithPosition:(AVCaptureDevicePosition)position
Expand Down
2 changes: 1 addition & 1 deletion Source/SDK/LinkVideo/doc/iOS Video接入指引文档.md
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@
audio_config.isExternal = YES;
TIoTCoreVideoConfig *video_config = [TIoTCoreVideoConfig new];
video_config.isExternal = YES;
[[TIoTCoreXP2PBridge sharedInstance] sendVoiceToServer:dev_name channel:nil audioConfig:audio_config videoConfig:video_config]];
[[TIoTCoreXP2PBridge sharedInstance] sendVoiceToServer:dev_name channel:@"channel=0" audioConfig:audio_config videoConfig:video_config]];
// 发布外部视频数据(自定义采集,自定义编码,h264数据)
- (void)SendExternalVideoPacket:(NSData *)videoPacket;
Expand Down

0 comments on commit e23d2f9

Please sign in to comment.