【问题标题】:Capture screenshot of a running video捕获正在运行的视频的屏幕截图
【发布时间】:2013-10-29 12:34:45
【问题描述】:

我有一个正在使用 MPMoviePlayerViewController 播放的视频,我想在每 1 秒后捕获一次屏幕截图,因为我想对捕获的图像上存在的个人执行一些操作。

我正在使用以下代码进行截图----

 CGRect   contectRect = CGRectMake(0, 0, 1024,768);
 UIGraphicsBeginImageContext(CGSizeMake(1024,768));

[_player.moviePlayer.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
NSLog(@"view size %f %f",viewImage.size.width,viewImage.size.height);
UIGraphicsGetImageFromCurrentImageContext();
CGImageRef imageRef1 = CGImageCreateWithImageInRect([viewImage CGImage], contectRect);
UIImage   *image = [UIImage imageWithCGImage:imageRef1 scale:1.0orientation:viewImage.imageOrientation];

但是在这个过程中我总是得到一个黑色的图像。

我知道还有另一种从视频中获取图像的方法,即跟随,但我不想使用这些图像,因为这些图像不符合我的要求。

    AVAsset *asset = [AVAsset assetWithURL:[NSURL URLWithString:path]];
    AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset];
    CMTime time = CMTimeMake(1, 1);
    UIImage *thumbnail = [UIImage imageWithCGImage:[imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL]];
    [UIImagePNGRepresentation(thumbnail) writeToFile:imgName atomically:YES];

【问题讨论】:

    标签: ios iphone objective-c mpmovieplayercontroller


    【解决方案1】:

    您可以尝试捕获视频的缩略图。并尝试设置它。

    【讨论】:

      【解决方案2】:

      看看here

      -(void)generateImage
      {
          AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:self.url options:nil];
          AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
          generator.appliesPreferredTrackTransform=TRUE;
          [asset release];
          CMTime thumbTime = CMTimeMakeWithSeconds(0,30);
      
          AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){
              if (result != AVAssetImageGeneratorSucceeded) {
                  NSLog(@"couldn't generate thumbnail, error:%@", error);
              }
              [button setImage:[UIImage imageWithCGImage:im] forState:UIControlStateNormal];
              thumbImg=[[UIImage imageWithCGImage:im] retain];
              [generator release];
          };
      
          CGSize maxSize = CGSizeMake(320, 180);
          generator.maximumSize = maxSize;
          [generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:thumbTime]] completionHandler:handler];
      
      }
      

      【讨论】:

        【解决方案3】:

        您可以选择从 MPMoviePlayer 异步请求缩略图:

        requestThumbnailImagesAtTimes:timeOption:
        

        但这是一项非常昂贵的操作,您很有可能会发现它太慢而无法“实时”执行很多操作

        根据您的最终目标,您可能会发现一些更强大的工具in the GPUImage Library,尤其是因为各个帧缓冲区很容易作为 CGImageRef 对象公开给您,您可以定期对其进行采样。

        【讨论】:

          【解决方案4】:

          使用NSTimer 并相应地执行您的操作:--

              NSTimer *tm1= [NSTimer scheduledTimerWithTimeInterval:1.0 //here it is 1 seconds
                                                    target:self
                                                  selector:@selector(yourMethod:)
                                                  userInfo:nil
                                                   repeats:NO];
          
          -(void)yourMethod:(NSTimer*)timer
          {
          //your code
          }
          

          【讨论】:

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