diff --git a/Source/LinkSDKDemo/Video/P2P/Controller/TIoTDemoVideoPushVC.m b/Source/LinkSDKDemo/Video/P2P/Controller/TIoTDemoVideoPushVC.m index 31fc2f4d..971ecdc0 100644 --- a/Source/LinkSDKDemo/Video/P2P/Controller/TIoTDemoVideoPushVC.m +++ b/Source/LinkSDKDemo/Video/P2P/Controller/TIoTDemoVideoPushVC.m @@ -17,6 +17,9 @@ #import #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"; @@ -41,7 +44,7 @@ typedef NS_ENUM(NSInteger, TIotDemoDeviceDirection) { }; -@interface TIoTDemoVideoPushVC () +@interface TIoTDemoVideoPushVC () @property (nonatomic, assign) CGRect screenRect; @property (nonatomic, strong) UIImageView *imageView; @property (nonatomic, strong) UIView *remoteVideoView; //录像中提示view @@ -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 @@ -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 { @@ -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 { @@ -216,12 +252,14 @@ - (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){ @@ -229,6 +267,13 @@ - (void)getDeviceStatusWithType:(NSString *)singleType qualityType:(NSString *)q }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 { diff --git a/Source/SDK/LinkVideo/FLV/TIoTAVCaptionFLV.mm b/Source/SDK/LinkVideo/FLV/TIoTAVCaptionFLV.mm index 65509d5e..a83b164a 100755 --- a/Source/SDK/LinkVideo/FLV/TIoTAVCaptionFLV.mm +++ b/Source/SDK/LinkVideo/FLV/TIoTAVCaptionFLV.mm @@ -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 diff --git "a/Source/SDK/LinkVideo/doc/iOS Video\346\216\245\345\205\245\346\214\207\345\274\225\346\226\207\346\241\243.md" "b/Source/SDK/LinkVideo/doc/iOS Video\346\216\245\345\205\245\346\214\207\345\274\225\346\226\207\346\241\243.md" index bc413e45..49086f47 100644 --- "a/Source/SDK/LinkVideo/doc/iOS Video\346\216\245\345\205\245\346\214\207\345\274\225\346\226\207\346\241\243.md" +++ "b/Source/SDK/LinkVideo/doc/iOS Video\346\216\245\345\205\245\346\214\207\345\274\225\346\226\207\346\241\243.md" @@ -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;