6

ビデオから(URLから)サムネイルを抽出する必要があり、次のコードを使用します:

NSString *stringUrl = video.stringurl;
NSURL *url = [NSURL URLWithString:stringUrl];

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil];
AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset];
[imageGenerator setRequestedTimeToleranceBefore:kCMTimeZero];
[imageGenerator setRequestedTimeToleranceAfter:kCMTimeZero];

CGImageRef imageRef = [imageGenerator copyCGImageAtTime:playerCurrentTime actualTime:&actualtime error:&error];
UIImage *thumbnail = [UIImage imageWithCGImage:imageRef];

CGImageRelease(imageRef);

しかし、copyCGImageAtTime でエラーが発生し、サムネイルが生成されないことがあります。エラーは次のとおりです。Error save image Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed"(OSStatus error -12792.)", NSLocalizedFailureReason=An unknown error occurred (-12792)}

ここに私が解決策を読んだリンクがありますが、URLWithString: の代わりに fileURLWithPath: を使用する場合、メソッドは URL の末尾に "-- file://localhost/" を追加して URL を無効にします。だから、何ができるのかわからない。

4

6 に答える 6

5

使用している場合はMPMoviePlayerController、このコードを使用してビデオ URL からサムネイルを生成できます。

NSString *stringUrl = video.stringurl;
NSURL *url = [NSURL URLWithString:stringUrl];
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:url];
UIImage *thumbnail = [player thumbnailImageAtTime:1.0 timeOption:MPMovieTimeOptionNearestKeyFrame];

ただし、このコードを使用すると、プレーヤーはオーディオの自動再生を開始します。したがって、次のコードでプレーヤーを停止する必要があります。

//Player autoplays audio on init
[player stop];

アップデート :

Error save image Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed"(OSStatus error -12792.)", NSLocalizedFailureReason=An unknown error occurred (-12792)}

エラーはおそらく の使用によるものですURLWithString-fileURLWithPathの代わりに使うべきだと思いますURLWithString

サンプルコード:

NSString *stringUrl = video.stringurl;
NSURL *vidURL = [NSURL fileURLWithPath:stringUrl];

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:vidURL options:nil];
AVAssetImageGenerator *generate = [[AVAssetImageGenerator alloc] initWithAsset:asset];

NSError *err = NULL;
CMTime time = CMTimeMake(1, 60);

CGImageRef imgRef = [generate copyCGImageAtTime:time actualTime:NULL error:&err];
UIImage *thumbnail = [UIImage imageWithCGImage:imgRef];
于 2013-09-09T13:27:38.910 に答える
4

私も HLS 可変ビットレート ストリーム、IE M3U8 からスクリーンショットを取得しようとしていますが、ここで提供されている方法はどれもうまくいきませんでした。

最後に成功しました。AVPlayerItemVideoOutputまず、プレーヤーに をアタッチする必要があります。

 self.playerAV = [AVPlayer playerWithURL:localURL];

    NSDictionary* settings = @{ (id)kCVPixelBufferPixelFormatTypeKey : [NSNumber numberWithInt:kCVPixelFormatType_32BGRA] };
    AVPlayerItemVideoOutput* output = [[AVPlayerItemVideoOutput alloc] initWithPixelBufferAttributes:settings];
    [self.playerAV.currentItem addOutput:output];

スクリーンショットを取得したい場合:

  CVPixelBufferRef pixelBuffer = [output copyPixelBufferForItemTime:player.currentTime itemTimeForDisplay:nil];
            CIImage *ciImage = [CIImage imageWithCVPixelBuffer:pixelBuffer];

            CIContext *temporaryContext = [CIContext contextWithOptions:nil];
            CGImageRef videoImage = [temporaryContext
                                     createCGImage:ciImage
                                     fromRect:CGRectMake(0, 0,
                                                         CVPixelBufferGetWidth(pixelBuffer),
                                                         CVPixelBufferGetHeight(pixelBuffer))];

            image = [UIImage imageWithCGImage:videoImage];
            image = [image cropImageToSize:maxSize withProportionDiffLargerThan:IMAGE_PROPORTION_DIFF];

            if ( videoImage )
            {
                CGImageRelease(videoImage);
            }
于 2015-07-05T13:22:03.037 に答える
2

私のアプリの1つで、次のようなビデオURLから画像をキャプチャしました:

MPMoviePlayerController *player = [[[MPMoviePlayerController alloc] initWithContentURL:videoURL]autorelease];
UIImage  *thumbnail = [player thumbnailImageAtTime:0.0 timeOption:MPMovieTimeOptionNearestKeyFrame];

url オブジェクトを videoURL として渡すだけで、MPMoviePlayerController を使用して、常に画像を正常に取得できます。あなたもこの簡単なコードでこれを行うことができることを願っています

于 2013-09-09T13:26:41.953 に答える