Задать вопрос
@teddyfox

Получение данных из mjpeg видеопотока и отображение в UIImageView?

Пытаюсь получить mjpeg видеопоток с ип-камеры и отобразить его в ios приложении. Соединение с ип-камерой по NSURLConnection происходит, в процедуры didReceiveData и didReceiveResponse вход осуществляется (ставил и отображал отладочные счетчики), а отображения в UIImageView (созданного в IB) не происходит. Плюс небольшая утечка памяти. Подскажите, пож-та, где закавыка? Проверял и в iOSSimulator'e и загрузкой на iPad. У меня малый опыт программирования в XCode (6.1.1). Спасибо.
Вот код:
//  ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UIImageView *cameraView;
@property (strong) IBOutlet UILabel *label;
@end

//  ViewController.m
#import "ViewController.h"
@interface ViewController ()
@end

@implementation ViewController
@synthesize cameraView;
@synthesize label;

    NSMutableData *dataResponse;     // buffer for accumulating data

- (void)viewDidLoad
{   [super viewDidLoad];
    dataResponse = [NSMutableData dataWithCapacity:100];
   NSString *cameraURL = @"http://192.168.1.160:554/video.mjpg"; // URL request
    NSURL *url = [NSURL URLWithString:cameraURL];
    NSURLRequest *requestURLcamera = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:requestURLcamera delegate:self];	// connecting
    if (!connection)
        {   dataResponse = nil; 		// if no connection - release dataResponse
            self.label.text = @"No connection!";}
    else { self.label.text = @"Connection OK!"; };
}
- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];}

- (void)connection: (NSURLConnection *) connection didReceiveData:(NSData *)data
{    [dataResponse appendData:data]; }	// accumulating data

- (void)connection: (NSURLConnection *) connection didReceiveResponse:(NSURLResponse *)response
{
   @autoreleasepool  
	{ 
		UIImage *imageZ = [UIImage imageWithData:dataResponse];     // creating image
		self.cameraView.image = imageZ;  	// image to UIImageView
	}
   [dataResponse setLength:0];
}
@end
  • Вопрос задан
  • 2661 просмотр
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
@teddyfox Автор вопроса
Вот как эта проблема решилась:
//  ViewController.m
#import "ViewController.h"
#import <WebKit/WebKit.h>
#import <CFNetwork/CFNetwork.h>

@interface ViewController ()
@end

@implementation ViewController

NSMutableData *_receivedData;	// buffer for accumulating data
#define END_MARKER_BYTES { 0xFF, 0xD9 }
static NSData *_endMarkerData = nil;

……………………….

- (IBAction)getVideo:(id)sender	// прием видеопотока по кнопке
{   NSString *finalURLcamera = @"http://"; NSString *urlIP = [_cameraIP text];	// IP-адрес камеры - в TextField'e cameraIP
    finalURLcamera = [finalURLcamera stringByAppendingString:urlIP];                // конструируем полный URL
    finalURLcamera = [finalURLcamera stringByAppendingString:@":554/video.mjpg"];
    
    NSURL *url = [NSURL URLWithString:finalURLcamera];
    NSURLRequest *requestURLcamera = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:requestURLcamera delegate:self];	// connecting
    
    uint8_t endMarker[2] = END_MARKER_BYTES;
    _endMarkerData = [[NSData alloc] initWithBytes:endMarker length:2];
}

………………………………….

// ****************** прием видеопотока ****************
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{   if (!_receivedData) { _receivedData = [NSMutableData new]; }
    [_receivedData appendData:data];
    NSRange endRange = [_receivedData rangeOfData:_endMarkerData options:0
                                            range:NSMakeRange(0, _receivedData.length)];
    if (endRange.location == NSNotFound) { return; }
    @autoreleasepool
    {  UIImage *receivedImage = [UIImage imageWithData:_receivedData];
        if (receivedImage) { self.cameraWindow.image = receivedImage; }	// cameraWindow - это UIImageView
    }
    [_receivedData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{    _receivedData = [[NSMutableData alloc] init]; }
……………………..
Ответ написан
Комментировать
Lerg
@Lerg
Defold, Corona, Lua, GameDev
Вы что-ли никак не обрабатываете входной поток? Там же протокол, из которого нужно выковыривать JPEG изображения. Можете почитать мою статью хотя бы habrahabr.ru/post/115808
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы