MPMoviePlayerController生成本地视频文件的缩略图并存储它

时间:2012-05-25 10:03:12

标签: objective-c ios ipad mpmovieplayercontroller thumbnails

我正在创建一个从服务器下载电影的应用程序,并将它们存储在NSDocumentDirectory中。

这很好用。

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

我的问题:

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

我的猜测

-download movie并将其存储在NSDocumentDirectory(有效)

-somehow将电影加载到MPMoviePlayerController的内存中(不知道如何)

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

- 存储它(应该可以)

如果有人能帮助我......

由于

3 个答案:

答案 0 :(得分:5)

#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;
}

您已经知道的其他任务。

答案 1 :(得分:3)

是的,使用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);

希望这可能会有所帮助

答案 2 :(得分:1)

这是我用来生成缩略图的代码 (添加了一个用于测试的大型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)