【问题标题】:MPMoviePlayerController generate thumbnail of local video file and store itMPMoviePlayerController 生成本地视频文件的缩略图并存储
【发布时间】:2012-05-31 21:59:42
【问题描述】:

我正在制作一个从服务器下载电影并将它们本地存储在 NSDocumentDirectory 中的应用程序。

这很好用。

我想在每个单元格中的名称前面添加从每部电影生成的缩略图。

我的问题:

如何在下载电影后生成缩略图(如此即时,无需先播放电影)?我想在 NSDocumentDirectory 中存储与电影名称相同的缩略图作为 jpg。

我的猜测

-下载电影并将其存储在 NSDocumentDirectory (works)

-以某种方式将电影加载到 MPMoviePlayerController 的内存中(不知道如何)

-在内存中加载时,使用 thumbnailImageAtTime (MPMovieTimeOptionNearestKeyFrame) 生成缩略图(应该可以)

-存储它(应该可以)

如果有人可以帮助我...

谢谢

【问题讨论】:

    标签: objective-c ios ipad mpmovieplayercontroller thumbnails


    【解决方案1】:
    #import <MediaPlayer/MediaPlayer.h>   
    
    
    -(UIImage*)getFirstFrameFromVideoFile:(NSString*)sourceFilePath {
    NSURL *videoURL = [NSURL fileURLWithPath:sourceFilePath];
    
    MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:videoURL];
    
    UIImage *thumbnail = [player thumbnailImageAtTime:1.0 timeOption:MPMovieTimeOptionNearestKeyFrame];
    //Player autoplays audio on init
    [player stop];
    [player release];
    return thumbnail;
    }
    

    您已经知道的其他任务。

    【讨论】:

    • 这不起作用。我认为问题在于必须首先将电影加载到内存中。虽然我不知道该怎么做。
    • sourceFilePath 是实际存储视频文件的 NSDocumentDirectory 路径。
    • 我做得很好,虽然返回的缩略图(数据长度)为 0,所以没有创建缩略图...
    • sourceFilePath 的完整 nslog 是什么?结尾是否包含扩展名(.mov 或 .mp4)?
    • 我在上面的答案中添加了更多信息
    【解决方案2】:

    是的,使用 MPMoviePlayer 是可行的……但您必须确保在您的应用程序的其他地方没有播放其他电影播放器​​(甚至是 UIWebView 插件……),否则您会遇到麻烦。 我这样做:

    UIImage *thumbnail = nil;
    NSURL *url = [NSURL fileURLWithPath:pathname];
    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil];
    AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    generator.appliesPreferredTrackTransform = YES;
    NSError *error = nil;
    CMTime time = CMTimeMake(3, 1); // 3/1 = 3 second(s)
    CGImageRef imgRef = [generator copyCGImageAtTime:time actualTime:nil error:&error];
    if (error != nil)
        NSLog(@"%@: %@", self, error);
    thumbnail = [[UIImage alloc] initWithCGImage:imgRef];
    CGImageRelease(imgRef);
    

    希望这可能会有所帮助

    【讨论】:

      【解决方案3】:

      这是我用来生成缩略图的代码 (添加了一个大的 uiimageview 用于测试,当我在其中加载本地图像时工作)

      NSString *path;
          NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
          path = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"snijtechniekendir/videos"];
          path = [path stringByAppendingPathComponent:[videos objectAtIndex:indexPath.row]];
      
          NSURL *videoURL = [NSURL fileURLWithPath:path];
      
          NSLog(@"video url: %@", videoURL);
      
          MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:videoURL];
      
          UIImage *thumbnail = [player thumbnailImageAtTime:1 timeOption:MPMovieTimeOptionNearestKeyFrame];
      
          UIImageView *cellimage = [[UIImageView alloc] initWithFrame:CGRectMake(2, 2 , 400, 400)];
      
          [cell.contentView addSubview:cellimage];
          NSData *imgData = UIImagePNGRepresentation(thumbnail);
          NSLog(@"lenght of video thumb: %@", [imgData length]);
          [self.view addSubview:cellimage];
          [cellimage setImage:thumbnail];
      

      这是一个视频文件的日志

      video url: file://localhost/Users/Home/Library/Application%20Support/iPhone%20Simulator/5.1/Applications/78C165BB-75A9-46A2-A257-469F8652A665/Documents/snijtechniekendir/videos/snijtechniek%2520brunoise.mp4
      
      lenght of video thumb: (null)
      

      【讨论】:

        猜你喜欢
        • 2018-10-19
        • 2012-09-01
        • 2019-10-23
        • 2011-07-04
        • 2011-02-19
        • 2016-04-06
        • 2017-03-01
        • 2013-10-22
        • 2017-10-14
        相关资源
        最近更新 更多