14

ビデオからサムネイルを取得して、テーブルビューに表示しようとしています。これが私のコードです:

- (UIImage *)imageFromVideoURL:(NSURL *)contentURL {
    AVAsset *asset = [AVAsset assetWithURL:contentURL];

    //  Get thumbnail at the very start of the video
    CMTime thumbnailTime = [asset duration];
    thumbnailTime.value = 25;

    //  Get image from the video at the given time
    AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset];

    CGImageRef imageRef = [imageGenerator copyCGImageAtTime:thumbnailTime actualTime:NULL error:NULL];
    UIImage *thumbnail = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);

    return thumbnail;
}

しかし、画像は常に黒を返します。どうしたの?

4

8 に答える 8

3
//(Local URL)
NSURL *videoURL = [NSURL fileURLWithPath:filepath];// filepath is your video file path 



AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];
AVAssetImageGenerator *generateImg = [[AVAssetImageGenerator alloc] initWithAsset:asset];
NSError *error = NULL;
CMTime time = CMTimeMake(1, 1);
CGImageRef refImg = [generateImg copyCGImageAtTime:time actualTime:NULL error:&error];
NSLog(@"error==%@, Refimage==%@", error, refImg);

UIImage *frameImage= [[UIImage alloc] initWithCGImage:refImg];
return frameImage;
于 2015-12-30T05:00:49.163 に答える
2

「ビデオからサムネイルを生成する」のリンクを確認してください。

https://littlebitesofcocoa.com/115-generating-thumbnails-from-videos

アプリがビデオの内容の 1 つ以上のサムネイル (小さな静止画像のプレビュー) を表示する必要があることはよくあります。ただし、動画のソースによっては、事前に作成されたサムネイルに簡単にアクセスできない場合があります。AVAssetImageGenerator を使用して独自のものを取得する方法を見てみましょう。ビデオの単純な NSURL から始めます。これはローカルでもリモートでもかまいません。それを使用して AVAsset を作成し、それを新しい AVAssetImageGenerator オブジェクトに作成します。サムネイルが正しい向きになるように、優先変換を適用するようにジェネレーターを構成します。

import AVFoundation

if let asset = AVAsset(URL: videoURL) {
   let durationSeconds = CMTimeGetSeconds(asset.duration)
   let generator = AVAssetImageGenerator(asset: asset)

   generator.appliesPreferredTrackTransform = true

   let time = CMTimeMakeWithSeconds(durationSeconds/3.0, 600)
   var thumbnailImage: CGImageRef 
   generator.generateCGImagesAsynchronouslyForTimes([NSValue(CMTime: time)]) { 
       (requestedTime: CMTime, thumbnail: CGImage?, actualTime: CMTime, result: AVAssetImageGeneratorResult, error: NSError?) in
      self.videoThumbnailImageView.image = UIImage(CGImage: thumbnail)
    }
}
于 2017-04-13T09:48:52.140 に答える
1

@Dishaの回答のSwift 4コード:

let imageGenerator = AVAssetImageGenerator(asset: avAsset)
                let time = CMTime(seconds: seconds, preferredTimescale: 600)
                let times = [NSValue(time: time)]
                imageGenerator.generateCGImagesAsynchronously(forTimes: times, completionHandler: {
                    requestedTime, image, actualTime, result, error in
                    guard let cgImage = image else
                    {
                        print("No image!")
                        return
                    }
                    let uiImage = UIImage(cgImage: cgImage)
                    UIImageWriteToSavedPhotosAlbum(uiImage, nil, nil, nil);
                })
于 2019-01-22T20:07:00.887 に答える
0

スイフト 5.2 バージョン:

ここで、 rozochkin の回答からインスピレーションを得た元の投稿を見つけることができます。

func getCurrentFrame() -> UIImage? {
    guard let player = self.player, let avPlayerAsset = player.currentItem?.asset else {return nil}
    let assetImageGenerator = AVAssetImageGenerator(asset: avPlayerAsset)
    assetImageGenerator.requestedTimeToleranceAfter = .zero
    assetImageGenerator.requestedTimeToleranceBefore = .zero
    assetImageGenerator.appliesPreferredTrackTransform = true
    let imageRef = try! assetImageGenerator.copyCGImage(at: player.currentTime(), actualTime: nil)
    let image = UIImage(cgImage: imageRef)
    return image
}

重要事項:

ソースコードによると、「生成された画像の実際の時間 [...] 効率のために要求された時間と異なる場合がある」ため、 requestedTimeToleranceAfter と requestedTimeToleranceBefore は .zero に設定する必要があります

applyPreferredTrackTransformはTRUE (デフォルトは FALSE) に設定する必要があります。そうしないと、不適切な回転フレームが得られます。このプロパティを TRUE に設定すると、プレーヤーに実際に表示されるものを取得できます。

于 2020-05-11T17:41:02.463 に答える