在两个iOS设备之间通过Bonjour流式传输图像 [英] streaming images over bonjour between two iOS device
问题描述
我的目标是通过Bonjour将AVCpatureInput捕获的图像从一台iOS设备流传输到另一台iOS设备.
My goal is to stream images captured by AVCpatureInput from one iOS device to another via bonjour.
这是我当前的方法:
1)从视频输入捕获帧
1) Capture frame from video input
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
/*code to convert sampleBuffer into UIImage */
NSData * imageData = UIImageJPEGRepresentation(image,1.0);
[connection sendImage:image];
}
2)通过TCP连接发送(来自 http://mobileorchard.com/tutorial-networking-and-bonjour-on-iphone/)
2) Send over TCP connection (from http://mobileorchard.com/tutorial-networking-and-bonjour-on-iphone/)
// Send raw image over network
- (void)sendRawImagePacket:(UIImage *)image {
// Encode packet
NSData * imageData = UIImageJPEGRepresentation(image, 1.0);
NSData * rawPacket = [NSKeyedArchiver archivedDataWithRootObject:imageData];
// Write header: length of raw packet
int packetLength = [rawPacket length];
[outgoingDataBuffer appendBytes:&packetLength length:sizeof(int)];
[outgoingDataBuffer appendData:rawPacket];
// Try to write to stream
[self writeOutgoingBufferToStream];
}
3)读取数据并将其转换回要显示在接收设备的UIImageView上的图像
3) Read the data and convert it back into an image to be displayed on the receiving device's UIImageView
// Read as many bytes from the stream as possible and try to extract meaningful packets
- (void)readFromStreamIntoIncomingBuffer {
// Temporary buffer to read data into
UInt8 buf[1024];
// Try reading while there is data
while( CFReadStreamHasBytesAvailable(readStream) ) {
CFIndex len = CFReadStreamRead(readStream, buf, sizeof(buf));
if ( len <= 0 ) {
// Either stream was closed or error occurred. Close everything up and treat this as "connection terminated"
[self close];
[delegate connectionTerminated:self];
return;
}
[incomingDataBuffer appendBytes:buf length:len];
}
// Try to extract packets from the buffer.
//
// Protocol: header + body
// header: an integer that indicates length of the body
// body: bytes that represent encoded NSDictionary
// We might have more than one message in the buffer - that's why we'll be reading it inside the while loop
while( YES ) {
// Did we read the header yet?
if ( packetBodySize == -1 ) {
// Do we have enough bytes in the buffer to read the header?
if ( [incomingDataBuffer length] >= sizeof(int) ) {
// extract length
memcpy(&packetBodySize, [incomingDataBuffer bytes], sizeof(int));
// remove that chunk from buffer
NSRange rangeToDelete = {0, sizeof(int)};
[incomingDataBuffer replaceBytesInRange:rangeToDelete withBytes:NULL length:0];
}
else {
// We don't have enough yet. Will wait for more data.
break;
}
}
// We should now have the header. Time to extract the body.
if ( [incomingDataBuffer length] >= packetBodySize ) {
// We now have enough data to extract a meaningful packet.
NSData* raw = [NSData dataWithBytes:[incomingDataBuffer bytes] length:packetBodySize];
// Tell our delegate about it
NSData * imageData = [NSKeyedUnarchiver unarchiveObjectWithData:raw];
UIImage * image = [UIImage imageWithData:imageData];
[delegate receivedNetworkRawImage:image viaConnection:self];
// Remove that chunk from buffer
NSRange rangeToDelete = {0, packetBodySize};
[incomingDataBuffer replaceBytesInRange:rangeToDelete withBytes:NULL length:0];
// We have processed the packet. Resetting the state.
packetBodySize = -1;
}
else {
// Not enough data yet. Will wait.
break;
}
}
}
但是,当连接变得不稳定时,UIImage会引发一个错误,表明它无法呈现JPEG.
However, when the connection gets choppy, UIImage throws an error that it cannot render the JPEG.
我应该如何通过wifi传递图像?
How should I pass images through wifi?
可以跳过某些帧,这是可以的,我需要一种方法来告诉UIImage跳过坏数据的批处理".
It's okay if some frames skip, I need a way to tell UIImage to skip that "batch" of bad data.
谢谢!
推荐答案
UIImage不符合NSCoding-> NSKeyedArchiver失败.
UIImage does not conform to NSCoding --> NSKeyedArchiver fails.
您必须使用UIImagePNGRepresentation()来获取图像数据.或使用UIImageJPEGRepresentation()来压缩数据.
You'll have to use UIImagePNGRepresentation() to get the data of the image. Or use UIImageJPEGRepresentation() for compressed data.
这篇关于在两个iOS设备之间通过Bonjour流式传输图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!