0

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

这工作正常。

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

我的问题:

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

我猜

- 下载电影并将其存储在 NSDocumentDirectory 中(作品)

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

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

- 存储它(应该工作)

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

谢谢

4

3 回答 3

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

您已经知道的其他任务。

于 2012-05-25T10:07:50.943 回答
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);

希望这可能会有所帮助

于 2014-01-18T16:45:17.753 回答
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)
于 2012-05-25T11:03:58.813 回答