Как отправить фотографию iOS на телевизор с помощью Chromecast?

В те дни я немного поигрался с Chromecast SDK. Сейчас я пытаюсь отправить UIImage (например, фотографию, сделанную на iPhone) на телевизор с помощью Chromecast.

Я могу загрузить «внешнее» изображение, используя URL-адрес, но не могу понять, как отправить локально сохраненное изображение!

Итак, есть ли способ отправить его с использованием кодировки base64, настроить поток или даже отразить экран? Я немного растерялся, если кто-нибудь может дать мне подсказку или пример кода, это будет здорово!


person tanou    schedule 17.06.2014    source источник


Ответы (3)


Вы можете разместить небольшой веб-сервер в своем приложении, а затем предоставить URL-адрес этого сервера приложению-приемнику Chromecast для загрузки фотографий с вашего устройства. Канал протокола Cast не предназначен для обработки больших двоичных передач.

person Leon Nicholls    schedule 17.06.2014
comment
Можно ли разместить веб-сервер внутри приложения? Можете ли вы вкратце объяснить, как это можно сделать (просто чтобы указать мне правильное направление)? - person tanou; 18.06.2014
comment
Взгляните, например, на этот проект: github.com/robbiehanson/CocoaHTTPServer - person Ali Naddaf; 18.08.2014

Опираясь на ответы, предоставленные Леоном и Алоком, т. е. показ изображений с вашего устройства iOS через HTTP с использованием HTTP-сервера Cocoa, вы можете найти пример по адресу GitHub с подробным объяснением в этом запись в блоге.

Также не забывайте, что для подачи на ваш ChromeCast вам необходимо включить CORS.

Короче говоря, как только вы добавили HTTP-сервер Cocoa в свой проект, вы можете

  1. подкласс HTTPDataResponse следующим образом, чтобы включить CORS

CamCaptureDataResponse.h

#import "HTTPDataResponse.h"

@interface CamCaptureDataResponse : HTTPDataResponse

@end

CamCaptureDataResponse.m #import "CamCaptureDataResponse.h"

@implementation CamCaptureDataResponse

-(NSDictionary*)httpHeaders {
    return @{
             @"Access-Control-Allow-Origin":@"*",
             @"Access-Control-Allow-Methods":@"GET,PUT,POST,DELETE",
             @"Access-Control-Allow-Headers":@"Content-Type"
             };
}

@end
  1. Используйте этот новый класс DataResponse в своем собственном обработчике запросов, создав подкласс HTTPConnection.

CamCaptureConnection.h

#import "HTTPConnection.h"

@interface CamCaptureConnection : HTTPConnection

@end

CamCaptureConnection.m

#import "CamCaptureConnection.h"
#import "CamCaptureHTTPServer.h"
#import "CamCaptureDataResponse.h"

@implementation CamCaptureConnection

-(NSObject<HTTPResponse> *)httpResponseForMethod:(NSString *)method URI:  (NSString *)path {
    NSArray* pathComponents = [path componentsSeparatedByString:@"/"];

    if ([pathComponents count] < 2) {
        return [[CamCaptureDataResponse alloc] initWithData:[@"ERROR" dataUsingEncoding:NSUTF8StringEncoding]];
    }

    NSString *command = [pathComponents objectAtIndex:1];

    if ([command isEqualToString:@"PING"]) {
        return [[CamCaptureDataResponse alloc] initWithData:[@"PONG"     dataUsingEncoding:NSUTF8StringEncoding]];
    }

    if ([command isEqualToString:@"PIC"]) {
        // Change the following line with whichever image you want to serve to your ChromeCast!
        NSData *imageData = UIImageJPEGRepresentation([CamCaptureHttpServer instance].captureImage, 0.3); 

        if (imageData) {
            return [[CamCaptureDataResponse alloc] initWithData:imageData];
        } else {
            return [[CamCaptureDataResponse alloc] initWithData:[@"NO_IMAGE" dataUsingEncoding:NSUTF8StringEncoding]];
        }
    }

    return [[CamCaptureDataResponse alloc] initWithData:[@"ERROR_UNKNOWN_COMMAND" dataUsingEncoding:NSUTF8StringEncoding]];
}

@end
  1. Затем, прежде чем начать, ваш веб-сервер сначала зарегистрирует новый класс соединения следующим образом.

    NSError *error;
    httpServer = [[CamCaptureHttpServer alloc] init];
    [httpServer setConnectionClass:[CamCaptureConnection class]];
    [httpServer setType:@"_http._tcp."];
    [httpServer setPort:1234];
    [httpServer start:&error];
    
person Mathieu Gardere    schedule 17.06.2015
comment
Хотя эти две ссылки могут дать ответ на вопрос OP, пожалуйста, предоставьте хотя бы ключевой код / ​​информацию, отвечающую на вопрос, здесь. - person β.εηοιτ.βε; 18.06.2015
comment
Привет, Бенуа, я добавил только свой ответ, чтобы добавить реальный код на основе проекта, на который я ссылался. - person Mathieu Gardere; 19.06.2015

Да ! вы можете использовать CocoaHTTPServer — небольшой, легкий, встраиваемый HTTP-сервер для приложений Mac OS X или iOS.

#import "iPhoneHTTPServerAppDelegate.h"
#import "iPhoneHTTPServerViewController.h"
#import "HTTPServer.h"
#import "DDLog.h"
#import "DDTTYLogger.h"

// Log levels: off, error, warn, info, verbose
static const int ddLogLevel = LOG_LEVEL_VERBOSE;


@implementation iPhoneHTTPServerAppDelegate

@synthesize window;
@synthesize viewController;

- (void)startServer
{
    // Start the server (and check for problems)

    NSError *error;
    if([httpServer start:&error])
    {
        DDLogInfo(@"Started HTTP Server on port %hu", [httpServer listeningPort]);
    }
    else
    {
        DDLogError(@"Error starting HTTP Server: %@", error);
    }
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Configure our logging framework.
    // To keep things simple and fast, we're just going to log to the Xcode console.
    [DDLog addLogger:[DDTTYLogger sharedInstance]];

    // Create server using our custom MyHTTPServer class
    httpServer = [[HTTPServer alloc] init];

    // Tell the server to broadcast its presence via Bonjour.
    // This allows browsers such as Safari to automatically discover our service.
    [httpServer setType:@"_http._tcp."];

    // Normally there's no need to run our server on any specific port.
    // Technologies like Bonjour allow clients to dynamically discover the server's port at runtime.
    // However, for easy testing you may want force a certain port so you can just hit the refresh button.
    // [httpServer setPort:12345];

    // Serve files from our embedded Web folder
    NSString *webPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Web"];
    DDLogInfo(@"Setting document root: %@", webPath);

    [httpServer setDocumentRoot:webPath];

    [self startServer];

    // Add the view controller's view to the window and display.
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];

    return YES;
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    [self startServer];
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    // There is no public(allowed in AppStore) method for iOS to run continiously in the background for our purposes (serving HTTP).
    // So, we stop the server when the app is paused (if a users exits from the app or locks a device) and
    // restart the server when the app is resumed (based on this document: http://developer.apple.com/library/ios/#technotes/tn2277/_index.html )

    [httpServer stop];
}



@end
person Alok Kumar Jha    schedule 18.08.2014