2

在YouTube直播的“直播控制室”中,我可以看到一个“流状态”视图,其中显示了发送到YouTube RTMP端点的视频的详细信息。 Stream StatusYouTube直播API流状态和质量回调

我打liveStreams端点,以获得流的“地位”,但这只返回active,这意味着视频流被成功发送到YouTube的RTMP端点,但没有关于视频数据和质量信息。

此信息暴露在API的某处吗?我是否还可以看到有关视频的其他详细信息,例如正在发送给YouTube的比特率,fps等,以便我可以验证我的编码器是否正常工作?或者需要在客户端完成该检查,并在离开编码器之后立即检查视频,然后再敲击RTMP端点。我正在编写一个iOS应用程序,因此在网上使用“实时控制室”对我来说不是一个可行的解决方案。

下面是我在做广播侧什么检查即时串流状态:

- (void)checkStreamStatus { 
    [self getRequestWithURL:[NSString stringWithFormat:@"https://www.googleapis.com/youtube/v3/liveStreams?part=id,snippet,cdn,status&id=%@", self.liveStreamId] andBlock:^(NSDictionary *responseDict) { 
     NSLog(@"response: %@", responseDict); 

     // if stream is active, youtube is receiving data from our encoder 
     // ready to transition to live 
     NSArray *items = [responseDict objectForKey:@"items"]; 
     NSDictionary *itemsDict = [items firstObject]; 
     NSDictionary *statusDict = [itemsDict objectForKey:@"status"]; 
     if ([[statusDict objectForKey:@"streamStatus"] isEqualToString:@"active"]) { 
      NSLog(@"stream ready to go live!"); 
      if (!userIsLive) { 
       [self goLive]; // transition the broadcastStatus from "testing" to "live" 
      } 
     } else { 
      NSLog(@"keep refreshing, broadcast object not ready on youtube's end"); 
     } 
    }]; 
} 

getRequestWithURL就是我创建做GET请求的一般方法:

- (void)getRequestWithURL:(NSString *)urlStr andBlock:(void (^)(NSDictionary *responseDict))completion { 

    NSURL *url = [NSURL URLWithString:urlStr]; 
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url]; 

    [request addValue:[NSString stringWithFormat:@"Bearer %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"accessToken"]] forHTTPHeaderField:@"Authorization"]; 

    [request setHTTPMethod:@"GET"]; 

    // Set the content type 
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 

    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
     [self parseJSONwithData:data andBlock:completion]; 

    }]; 
} 

- (void)parseJSONwithData:(NSData *)data andBlock:(void (^)(NSDictionary * responseDict))completion { 
    NSError *error = nil; 
    NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:data 
                   options:kNilOptions 
                    error:&error]; 
    if (error) { 
     NSLog(@"error: %@", [error localizedDescription]); 
    } 
    completion(responseDict); 
} 

这里是我的在消费者端检查视频质量:

我正在使用Google的YTPlayerView库。

- (void)notifyDelegateOfYouTubeCallbackUrl: (NSURL *) url { 
    NSString *action = url.host; 

    // We know the query can only be of the format http://ytplayer?data=SOMEVALUE, 
    // so we parse out the value. 
    NSString *query = url.query; 
    NSString *data; 
    if (query) { 
    data = [query componentsSeparatedByString:@"="][4]; // data here is auto, meaning auto quality 
    } 
    ... 
    if ([action isEqual:kYTPlayerCallbackOnPlaybackQualityChange]) { 
    if ([self.delegate respondsToSelector:@selector(playerView:didChangeToQuality:)]) { 
    YTPlaybackQuality quality = [YTPlayerView playbackQualityForString:data]; 
    [self.delegate playerView:self didChangeToQuality:quality]; 
    } 
    ... 
} 

但质量“自动”似乎并不在此库中支持的质量不变:

// Constants representing playback quality. 
NSString static *const kYTPlaybackQualitySmallQuality = @"small"; 
NSString static *const kYTPlaybackQualityMediumQuality = @"medium"; 
NSString static *const kYTPlaybackQualityLargeQuality = @"large"; 
NSString static *const kYTPlaybackQualityHD720Quality = @"hd720"; 
NSString static *const kYTPlaybackQualityHD1080Quality = @"hd1080"; 
NSString static *const kYTPlaybackQualityHighResQuality = @"highres"; 
NSString static *const kYTPlaybackQualityUnknownQuality = @"unknown"; 

... 
@implementation YTPlayerView 
... 

/** 
* Convert a quality value from NSString to the typed enum value. 
* 
* @param qualityString A string representing playback quality. Ex: "small", "medium", "hd1080". 
* @return An enum value representing the playback quality. 
*/ 
+ (YTPlaybackQuality)playbackQualityForString:(NSString *)qualityString { 
    YTPlaybackQuality quality = kYTPlaybackQualityUnknown; 

    if ([qualityString isEqualToString:kYTPlaybackQualitySmallQuality]) { 
    quality = kYTPlaybackQualitySmall; 
    } else if ([qualityString isEqualToString:kYTPlaybackQualityMediumQuality]) { 
    quality = kYTPlaybackQualityMedium; 
    } else if ([qualityString isEqualToString:kYTPlaybackQualityLargeQuality]) { 
    quality = kYTPlaybackQualityLarge; 
    } else if ([qualityString isEqualToString:kYTPlaybackQualityHD720Quality]) { 
    quality = kYTPlaybackQualityHD720; 
    } else if ([qualityString isEqualToString:kYTPlaybackQualityHD1080Quality]) { 
    quality = kYTPlaybackQualityHD1080; 
    } else if ([qualityString isEqualToString:kYTPlaybackQualityHighResQuality]) { 
    quality = kYTPlaybackQualityHighRes; 
    } 

    return quality; 
} 

我项目的GitHub的页面上创建了这个issue

回答

0

看来YouTube即时串流API已经被更新,以显示与该物业的直播流的健康状况:status.healthStatus.status

their latest API获取更多信息。