現在我正在研究通過MultipeerConnectivity框架實現視頻流的可能性。爲此,我使用NSInputStream和NSOutputStream。通過NSInputStream和NSOutputStream進行視頻流傳輸
問題是:到目前爲止我無法收到任何圖片。現在我試圖通過簡單的圖片並在接收器上顯示它。下面是我的一小段代碼:
發送圖片通過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個字節。但是,當我在第一段代碼中發送圖片時,它的發送完全沒問題(29627字節,順便說一句,圖片的大小約爲29 kb)
這就是問題出現的地方 - 爲什麼是這樣? 29 kb通過NSOutputStream工作完全正常,當接收導致問題?有沒有一種可靠的方法,使視頻流通過NSInputStream和NSOutputStream工作?我只是沒有找到關於這項技術的很多信息,我發現的只是一些簡單的事情,我知道了。
順便說一下,流正在彼此工作。我忘了提到這一點。所以連接不好的問題可以排除在外。我用簡單的字符串測試過流,它絕對正常工作 –