【发布时间】:2017-02-21 14:19:14
【问题描述】:
现在我正在研究通过 MultipeerConnectivity 框架实现视频流的可能性。为此,我使用 NSInputStream 和 NSOutputStream。
问题是:我目前收不到任何图片。现在我正在尝试传递简单的图片并将其显示在接收器上。这是我的代码的一个小sn-p:
通过 NSOutputStream 发送图片:
- (void)sendMessageToStream
{
NSData *imgData = UIImagePNGRepresentation(_testImage);
int img_length = (int)[imgData length];
NSMutableData *msgData = [[NSMutableData alloc] initWithBytes:&img_length length:sizeof(img_length)];
[msgData appendData:imgData];
int msg_length = (int)[msgData length];
uint8_t *readBytes = (uint8_t *)[msgData bytes];
uint8_t buf[msg_length];
(void)memcpy(buf, readBytes, msg_length);
int stream_len = [_stream writeData:(uint8_t*)buf maxLength:msg_length];
//int stream_len = [_stream writeData:(uint8_t *)buf maxLength:data_length];
//NSLog(@"stream_len = %d", stream_len);
_tmpCounter++;
dispatch_async(dispatch_get_main_queue(), ^{
_lblOperationsCounter.text = [NSString stringWithFormat:@"Sent: %ld", (long)_tmpCounter];
});
}
上面的代码运行良好。写入后的 stream_len 参数等于 29627 字节,这是预期值,因为图像的大小约为 25-26 kb。
通过 NSinputStream 接收图片:
- (void)readDataFromStream
{
UInt32 length;
if (_currentFrameSize == 0) {
uint8_t frameSize[4];
length = [_stream readData:frameSize maxLength:sizeof(int)];
unsigned int b = frameSize[3];
b <<= 8;
b |= frameSize[2];
b <<= 8;
b |= frameSize[1];
b <<= 8;
b |= frameSize[0];
_currentFrameSize = b;
}
uint8_t bytes[1024];
length = [_stream readData:bytes maxLength:1024];
[_frameData appendBytes:bytes length:length];
if ([_frameData length] >= _currentFrameSize) {
UIImage *img = [UIImage imageWithData:_frameData];
NSLog(@"SETUP IMAGE!");
_imgView.image = img;
_currentFrameSize = 0;
[_frameData setLength:0];
}
_tmpCounter++;
dispatch_async(dispatch_get_main_queue(), ^{
_lblOperationsCounter.text = [NSString stringWithFormat:@"Received: %ld", (long)_tmpCounter];
});
}
如您所见,我尝试分几个步骤接收图片,原因如下。当我尝试从流中读取数据时,无论我在 maxLength: 参数中输入什么数字,它总是读取最大 1095 个字节。但是当我在代码的第一个 sn-p 中发送图片时,它发送绝对没问题(29627 字节。顺便说一句,图像的大小约为 29 kb。
这就是我提出问题的地方 - 为什么会这样?当接收导致问题时,为什么通过 NSOutputStream 发送 29 kb 工作正常?有没有一种可靠的方法可以通过 NSInputStream 和 NSOutputStream 使视频流工作?我只是没有找到太多关于这项技术的信息,我发现的只是一些我已经知道的简单的东西。
【问题讨论】:
-
顺便说一句,流正在相互协作。我忘了提那个。因此可以排除连接不良的问题。我用简单的字符串测试了流,它工作得非常好
标签: ios video-streaming multipeer-connectivity nsinputstream