视频聊天从摄像头中取得缓冲数据,转换成NSData,通过网络发送,接收端取得NSData后把NSData转换成图像,双方不停的收发数据,播放图像,就形成了视频聊天。废话不多说,直接上代码:

首先创建视频输入输出:

NSError *error = nil;
    
    // Setup the video input
    AVCaptureDevice *videoDevice = [self getFrontCamera];//[AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeVideo];
    // Create a device input with the device and add it to the session.
    AVCaptureDeviceInput *videoInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error];
    // Setup the video output
    _videoOutput = [[AVCaptureVideoDataOutput alloc] init];
    _videoOutput.alwaysDiscardsLateVideoFrames = NO;
    _videoOutput.videoSettings =
    [NSDictionary dictionaryWithObject:
     [NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey];     
    
    
    // Create the session
    _capSession = [[AVCaptureSession alloc] init];
    [_capSession addInput:videoInput];
    //[_capSession addInput:audioInput];
    [_capSession addOutput:_videoOutput];
    //[_capSession addOutput:_audioOutput];
    
    _capSession.sessionPreset = AVCaptureSessionPresetLow;     
    
    // Setup the queue
    dispatch_queue_t queue = dispatch_queue_create("MyQueue", NULL);
    [_videoOutput setSampleBufferDelegate:self queue:queue];
    [_audioOutput setSampleBufferDelegate:self queue:queue];
    dispatch_release(queue);
    [_capSession startRunning];

通过AVCaptureVideoDataOutputSampleBufferDelegate 代理 取得摄像头数据

#pragma mark AVCaptureSession delegate
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
       fromConnection:(AVCaptureConnection *)connection
{
    
    NSData *data = [NSData dataWithBytes:&sampleBuffer length:malloc_size(sampleBuffer)];
    [self recieveVideoFromData:data];
}

收到数据后转换成图像

- (void)recieveVideoFromData:(NSData *)data{
    CMSampleBufferRef sampleBuffer;
    [data getBytes:&sampleBuffer length:sizeof(sampleBuffer)];
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    CVPixelBufferLockBaseAddress(imageBuffer,0);
    uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer);
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
    size_t width = CVPixelBufferGetWidth(imageBuffer);
    size_t height = CVPixelBufferGetHeight(imageBuffer);
    
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef newContext = CGBitmapContextCreate(baseAddress,
                                                    width, height, 8, bytesPerRow, colorSpace,
                                                    kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
    CGImageRef newImage = CGBitmapContextCreateImage(newContext);
    
    CGContextRelease(newContext);
    CGColorSpaceRelease(colorSpace);
    
    UIImage *image= [UIImage imageWithCGImage:newImage scale:1.0
                                  orientation:UIImageOrientationRight];
    
    CGImageRelease(newImage);
    [self.imageView performSelectorOnMainThread:@selector(setImage:)
                                withObject:image waitUntilDone:YES];
    CVPixelBufferUnlockBaseAddress(imageBuffer,0);
    
    [pool drain];
    
}

iphone视频聊天代码实现相关推荐

  1. 即时通讯视频聊天代码和技术架构

    1.简介 一款可以实现实时在线聊天的app,一对一实时在线聊天,可以实现客服功能,可以文字聊天,可以发图片聊天,简单实用 2.技术架构 3.技术选型      框架    版本号          备 ...

  2. FaceTime 在苹果电脑macOS与iPhone iOS上视频聊天配置步骤

    FaceTime 在macOS与iPhone视频聊天配置步骤 前提,毫无疑问,你要有Apple ID. 1,在苹果电脑,到Applications目录下打开运行FaceTime 2,还是在电脑,输入你 ...

  3. 一对一视频直播源码实现网络中一对一视频聊天

    一对一视频直播源码实现网络中一对一视频聊天 代码实现步骤 概述 首先要通信那就得满足通信的基础,我选择和目标放通信,前提就是我通过一定的条件将自己和目标建立链接,然后再将自己的通信信息交给目标,目标也 ...

  4. Fms3和Flex打造在线多人视频会议和视频聊天(附原代码)

    Flex,Fms3系列文章导航 Flex,Fms3相关文章索引 本篇是视频聊天,会议开发实例系列文章的第3篇,该系列所有文章链接如下: http://www.cnblogs.com/aierong/a ...

  5. 视频聊天的java代码

    2019独角兽企业重金招聘Python工程师标准>>> 最近学习Android平台下跨平台音视频通信开发,虽然网上有很多开源项目供我们参考学习,但音视频效果很一般,还有很多不稳定的因 ...

  6. 2w行C/C++代码打造视频聊天程序!主播直播系统程序开发

    一个功能相对专业的VB聊天程序--ZX Messenger,含视频聊天模块,同时支持QQ自定义表情.音效等高级功能,代码也演示了如模仿QQ窗体弹出.托盘图标.透明窗体等网络编程技术,服务器也不需要特别 ...

  7. 几行代码轻松实现网页视频聊天

    网络上视频主播的火热带动了网络视频聊天室开发行业的火热.现在网上企业或者工作室在弄网页的视频聊天室.通过个人学习,借用别人的开发Demo(AnyChat SDK,网上随便搜索一下就可以下载的),加上几 ...

  8. ​MMIT冠军方案 | 用于行为识别的时间交错网络,商汤公开视频理解代码库

    作者 | 商汤 出品 | AI科技大本营(ID:rgznai100) 本文主要介绍三个部分: 一个高效的SOTA视频特征提取网络TIN,发表于AAAI2020 ICCV19 MMIT多标签视频理解竞赛 ...

  9. 如何使用OpenCV和Socket进行视频聊天?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 一.简介 在本文中,我们要构建的是视频聊天,但话音通道使用的Ope ...

最新文章

  1. 淘宝内部分享:怎么跳出MySQL的10个大坑
  2. vsftpd日志配置及查看——可以将vsftpd记录在系统日志里
  3. rxjs里merge operators的用法
  4. Visual Studio 2019 16.1 使用 .NET Core 3.0
  5. Jzoj4782 Math
  6. 神州泰岳2050万元收买并增资奇点国际
  7. Jmeter之逻辑控制器(Logic Controller)
  8. 分数怎么在计算机上关,电脑如何在注册表上关闭AutoRun功能
  9. 着色器的细节层次技术 Shader Level of Detail
  10. 承包你所有壁纸需求,高图网图片,美到窒息
  11. 深度学习自学(八):人脸识别主要场景与算法实现
  12. PAT (Basic Level) Practice1014 福尔摩斯的约会
  13. 2014年武汉的IT行情好像不太好(续):20个月过后,再看当时面试过的几个公司--武汉财富基石-崩盘,辣妈萌宝-创业失败,朋友公司转交他人管理...
  14. 两分钟学会线性同余法产生伪随机数
  15. 计算机ps特效教程,制作木质电脑桌的PS滤镜教程
  16. VM虚拟机(VMware)设置外网连接
  17. JavaScript随机生成字母、数字
  18. Photoshop照片转手绘效果动作分享
  19. 深度学习刷SOTA有哪些trick?
  20. 阿里巴巴2016秋招内部推荐-B2B快速通道

热门文章

  1. OpenSSL漏洞介绍
  2. matplotlib绘制sin函数图像
  3. 【vue部署项目】前后台完全从零指南(超详细)实现简易登录跳转
  4. 学打羽毛心得(二) -- 基础篇
  5. Tongsuo/铜锁|「开放原子开源基金会」拜访篇
  6. Hash(哈希/散列)和Bloom Filter(布隆过滤器)
  7. 线性代数 --- Gram-Schmidt, 格拉姆-施密特正交化(上)
  8. 程序员到底有多累、多辛苦?加班如喝水,但是最累的其实不是加班
  9. jsp页面 用c标签来循环遍历数据库某表中里面的数据 但是页面不显示数据
  10. (脑肿瘤分割笔记:十四)用于脑肿瘤分割的优化U-Net