Как да изпратите снимка на 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.

Накратко, и след като сте добавили Cocoa HTTP Server към вашия проект, можете

  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