【问题标题】:Get a current frame from Youtube YTPlayerView从 Youtube YTPlayerView 获取当前帧
【发布时间】:2018-02-15 11:31:32
【问题描述】:

有没有人知道在 iOS 上截取 youtube 视频的有效解决方案?标准的“UIView 到 UIImage”解决方案(如快照当前图形上下文或视图层)不起作用,因为我只得到一个黑色、空的视频播放器,上面有 Youtube 徽标,没有实际视频。

我尝试对视图的presentationLayer 进行快照,但随后出现BAD_ACCESS 错误。我听说它与 UIWebView(用于显示 youtube 播放器)中的 CSS/HTML5 有关。

有人成功了吗?

【问题讨论】:

  • 我遇到了同样的问题,即尝试将当前视频帧的屏幕快照作为 UIImage 以及我找到并尝试的所有解决方案在设备上产生黑帧(一些工作在模拟器上,但在设备上没有)。另外两个 URL(除了这个)问同样的问题,似乎没有人有一个可行的解决方案:github.com/youtube/youtube-ios-player-helper/issues/60stackoverflow.com/questions/32095532/… 任何可行的解决方案将不胜感激。
  • 试试这个框架:cocoapods.org/pods/XCDYouTubeKit 这是一个自定义库,可以将 youtube 视频加载到 MPMoviePlayerController 中。然后您可以使用方法 [player thumbnailImageAtTime:] 抓取某个帧
  • 会试一试并报告,谢谢!

标签: ios objective-c youtube screenshot ytplayerview


【解决方案1】:

Bartek Uchanski,再次感谢您,您的回复为我指明了正确的方向。

对于我的特定应用程序,我仍然需要依靠 Google 的 YouTube iOS Player Helper API 来播放视频,但是要提取缩略图(直接使用 Google YouTube API 似乎是不可能的)我加载了一个单独的“影子”mp4 流来自 YouTube,依靠 XCDYouTubeClient 库和 AVAsset/AVFoundation 框架来提取和保存缩略图。 (不幸的是 [player thumbnailImageAtTime:] 已被弃用,因此我的解决方法如下。)

1) 使用 XCDYouTubeClient API 提取例如来自 YouTube 11 字符视频标识符的 mp4 视频流 URL;您还可以为相同的流 URL 解析 YouTube 视频的 HTML 页面,但我发现简单地使用 XCDYouTubeClient API 更容易。

2) 检索到视频流的 URL 后,使用 AVAsset/AVFoundation 框架提取缩略图。

(我在这里简化了我的实际应用程序代码,但一般概念如下。)

NSString *videoid = @"9bZkp7q19f0"; // youtube 11 character video identifier
[[XCDYouTubeClient defaultClient] getVideoWithIdentifier:videoid completionHandler:^(XCDYouTubeVideo *video, NSError *error) {
  if (video) {
    // available youtube urls; e.g. itag=160 mp4 video only, 256x144
    if (video.streamURLs[[NSNumber numberWithInt:160]]) {
      // grab thumbnail from specified video stream @ specified time, e.g. @ 30 secs
      AVAsset *asset = [AVAsset assetWithURL:[NSURL URLWithString:[[video.streamURLs[[NSNumber numberWithInt:160]] description] stringByRemovingPercentEncoding]]];
      AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
      CGImageRef imageRef = [imageGenerator copyCGImageAtTime:CMTimeMakeWithSeconds(30.0,NSEC_PER_SEC) actualTime:NULL error:NULL];
      UIImage *ytvideo_thumbnail = [UIImage imageWithCGImage:imageRef];
      CGImageRelease(imageRef);
      // save thumbnail to camera roll
      UIImageWriteToSavedPhotosAlbum(ytvideo_thumbnail,nil,nil,nil);
    }
  }
}];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多