Вопрос

Я создал Java-сервер, который берет скриншоты, изменяет их изменение и отправляет их через TCP / IP в мое приложение для iPhone. Затем приложение использует NSINPUTTREAM, чтобы собрать данные входящих изображений, создать экземпляр NSMutBabledata с буфером байта, а затем создать объект Uiimage для отображения на iPhone. Снимок экрана, по сути. Мой код iPhone для сбора данных изображения в настоящее время как следует следующую:

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent{


if(streamEvent == NSStreamEventHasBytesAvailable && [iStream hasBytesAvailable]){
        uint8_t buffer[1024];

    while([iStream hasBytesAvailable]){
        NSLog(@"New Data");

        int len = [iStream read:buffer maxLength:sizeof(buffer)];

        [imgdata appendBytes:buffer length:len];
        fullen=fullen+len;

        /*Here is where the problem lies.  What should be in this
         if statement in order to make it test the last byte of
         the incoming buffer, to tell if it is the End of Image marker
         for the end of incoming JPEG file?
         */
        if(buffer[len]=='FFD9'){
        UIImage *img = [[UIImage alloc] initWithData:imgdata];
        NSLog(@"NUMBER OF BYTES: %u", len);

        image.image = img;
        }
    }

}
}

Моя проблема, как указано в кодовом комментарии, выясняется, когда перестать собирать данные в объекте NSMutablataTA и использовать данные для создания Uiimage. Похоже, имеет смысл искать JPEG-конце файлового маркера - конец маркера изображения (EOI) (FFD9) - в входящих байтах, поскольку изображение будет готово к отображению, когда это отправлено. Как я могу проверить на это? Я либо упускаю что-то о том, как данные хранятся, или о маркере в файле JPEG, но любая помощь в тестировании для этого будет очень ценится!

Джеймс

Это было полезно?

Решение

Вы, очевидно, не хотите закрывать поток, потому что это убьет производительность.

Поскольку вы управляете подключением клиентского сервера, отправьте «BYTES» на изображение перед отправкой данных изображения. Еще лучше отправить # байты в изображении, данные изображения и легко идентифицируют серийный # в конце, чтобы вы могли быстро убедиться, что данные фактически наступили.

Намного проще и эффективнее, чем на самом деле проверка на конец файлового маркера. Хотя, конечно, вы также можете просто проверить, что после полученных байтов тоже. Достаточно легко.

Конечно, все это будет крайне неэффективно для целей стиля резак в снимках, кроме необычных случаев. В большинстве случаев только небольшая часть экрана будет отражена на самом деле изменения с каждым кадром. Если вы попытаетесь отправить весь экран с каждым кадром, вы быстро насыщаете ваше соединение, и сторона клиента будет ужасно отставать и не отвечает.

Учитывая, что это чрезвычайно зрелый рынок, существуют тонны решений и довольно много открытых исходных битов, из которых вы можете получить решение, чтобы соответствовать вашим потребностям (например, VNC).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top