iphone视频聊天代码实现
2013-02-20 20:12
387 查看
转自:http://blog.csdn.net/zxc110110/article/details/7191016
视频聊天从摄像头中取得缓冲数据,转换成NSData,通过网络发送,接收端取得NSData后把NSData转换成图像,双方不停的收发数据,播放图像,就形成了视频聊天。废话不多说,直接上代码:
首先创建视频输入输出:
NSError *error= nil;
//Setup the video input
AVCaptureDevice *videoDevice=[self getFrontCamera];//[AVCaptureDevicedefaultDeviceWithMediaType: AVMediaTypeVideo];
//Create a device input with the device and add it to thesession.
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];
//[_capSessionaddInput:audioInput];
[_capSession addOutput:_videoOutput];
//[_capSessionaddOutput:_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];
}
视频聊天从摄像头中取得缓冲数据,转换成NSData,通过网络发送,接收端取得NSData后把NSData转换成图像,双方不停的收发数据,播放图像,就形成了视频聊天。废话不多说,直接上代码:
首先创建视频输入输出:
NSError *error= nil;
//Setup the video input
AVCaptureDevice *videoDevice=[self getFrontCamera];//[AVCaptureDevicedefaultDeviceWithMediaType: AVMediaTypeVideo];
//Create a device input with the device and add it to thesession.
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];
//[_capSessionaddInput:audioInput];
[_capSession addOutput:_videoOutput];
//[_capSessionaddOutput:_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视频聊天代码实现
- iphone视频聊天代码实现
- iphone视频聊天代码实现
- iphone视频聊天代码实现 .
- iphone视频聊天代码实现
- iphone视频聊天代码实现
- iphone视频聊天代码实现
- iphone视频聊天代码实现
- iPhone开发——通过代码自定义cell实现qq聊天界面
- 几行代码轻松实现网页视频聊天
- 120行代码实现 浏览器WebRTC视频聊天
- 音视频数据处理(6)--- PCM音频采样数据处理代码实现
- 安卓视频播放器 一行代码快速实现视频播放,Android视频播放,AndroidMP3播放,安卓视频播放一行代码搞定,仿今日头条 Android视频播放器
- 用DirectShow实现QQ的音视频聊天功能
- iPhone的九宫格实现代码
- Android几行代码实现监听微信聊天示例
- H5video中实现多个的视频的播放,有详细的代码
- iphone开发 UITableview实现分页显示方法(代码)
- 大牛请进,Android音视频聊天各种实现方式问题
- html制作简单框架网页二 实现自己的影音驿站 操作步骤及源文件下载 (可播放mp4、avi、mpg、asx、swf各种文件的视频播放代码)