Мне на самом деле интересно об этом для iPhone. Я получаю поток MJPEG с сервера и пытаюсь отобразить его на iphone без использования класса safari.
Причины этого кроется в том, что класс safari, хотя и умеет нативно отображать MJPEG, не делает этого с желаемой частотой кадров.
Итак, я попытался нарисовать его изначально, но у меня возникли проблемы с производительностью, а именно проблема синхронизации между тем, что я получаю с сервера, и тем, что я могу нарисовать на экране телефона. (Должно быть небольшое отставание, но дрейф становится действительно плохим, чего я хочу избежать).
Итак, у меня установлено соединение с моим сервером, и я получаю JPEGS. Это просто данные, которые я вставляю в буфер NSMutableArray
CFMutableDataRef _t_data_ref = (CFMutableDataRef)[_buffer_array objectAtIndex:0];
//CGDataProviderRef imgDataProvider = CGDataProviderCreateWithCFData (_cf_buffer_data);
CGDataProviderRef imgDataProvider = CGDataProviderCreateWithCFData(_t_data_ref);
CGImageRef image = CGImageCreateWithJPEGDataProvider(imgDataProvider, NULL, true, kCGRenderingIntentDefault);
CGImageRef imgRef = image;
CGContextDrawImage(context, CGRectMake(0, 17, 380, 285), imgRef);
CGImageRelease(image);
CGDataProviderRelease(imgDataProvider);
пожалуйста, обратите внимание, что это суть моего кода, но он должен резюмировать то, что я пытаюсь достичь в отношении рисования. Также, чтобы синхронизировать частоту кадров, мне пришлось отсоединить отдельный поток, который спит X секунд и вызывает [self setNeedsDisplay].
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // Top-level pool
while(1)
{
//[NSThread sleepForTimeInterval:TIMER_REFRESH_VALUE];
//sleep(unsigned int );
usleep(MICRO_REFRESH_VALUE);
if ([_buffer_array count] > 10)
{
//NSLog(@"stuff %d", [_buffer_array count]);
//[self setNeedsDisplay];
[self performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:NO];
}
}
[pool release]; // Release the objects in the pool.
Мой буфер данных в формате JPEG заполняется довольно быстро, но я не могу, кажется, фактически потреблять то, что получаю с той же скоростью, фактически намного медленнее. Есть ли документы, которые могут описать, какую настройку производительности я могу сделать, чтобы она работала быстрее при рендеринге JPEG на экран? Или я застрял здесь?
Спасибо!