iPhone odczytuje UIimage (ramki) z wideo z AVFoundation
Przepraszam za mój angielski) Szukając informacji o odczytaniu ramek z filmu z iPhonem znalazłem ten projekt, http://www.codza.com/extracting-frames-from-movies-on-iphone/comment-page-1#comment-1116 , ale czytałem gdzieś, że można użyć AVFoundation do przechwytywania klatek z filmu dla lepszej wydajności..
Ale nie mogę znaleźć informacji, jak Mogę to zrobić...
Jakiś pomysł?
Dzięki za przeczytanie
5 answers
Mówisz o używaniu połączeń do generowania tego, co Apple wywołuje miniaturek obrazów z filmów w określonych godzinach.
Dla kontrolera MPMoviePlayerController (używanego przez iOS do przechowywania wideo z pliku lub innego źródła), istnieją dwa polecenia, aby to zrobić. Pierwszy z nich generuje pojedynczą miniaturę (obraz) z filmu w określonym momencie, a drugi generuje zestaw miniatur dla określonego zakresu czasowego.
Ten przykład pobiera obraz w 10 sekund do filmu clip, myMovie. mp4:
MPMoviePlayerController *movie = [[MPMoviePlayerController alloc]
initWithContentURL:[NSURL URLWithString:@"myMovie.mp4"]];
UIImage *singleFrameImage = [movie thumbnailImageAtTime:10
timeOption:MPMovieTimeOptionExact];
Zauważ, że działa to synchronicznie-tzn. użytkownik będzie zmuszony poczekać, aż otrzymasz zrzut ekranu.
Inną opcją jest uzyskanie serii obrazów z filmu, z tablicy razy:
MPMoviePlayerController *movie = [[MPMoviePlayerController alloc]
initWithContentURL [NSURL URLWithString:@"myMovie.mp4"]];
NSNumber time1 = 10;
NSNumber time2 = 11;
NSNumber time3 = 12;
NSArray *times = [NSArray arrayWithObjects:time1,time2,time3,nil];
[movie requestThumbnailImagesAtTimes:times timeOption:MPMovieTimeOptionExact];
Ten drugi sposób wywoła powiadomienie typu MPMoviePlayerThumbnailImageRequestDidFinishNotification
za każdym razem, gdy zostanie wygenerowany nowy obraz. Możesz ustawić obserwatora, aby monitorował to i przetwarzał obraz - zostawię cię, abyś sam pracował nad tym kawałkiem!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-08 16:50:49
Możesz również wypróbować AVAssetImageGenerator, a konkretnie generateCGImagesAsynchronouslyFortimes:completionHandler.
To więc odpowiedź ma dobry przykładowy kod.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:30
Kod Swift 2 do pobierania klatek za pomocą AVAssetImageGenerator:
func previewImageForLocalVideo(url:NSURL) -> UIImage?
{
let asset = AVAsset(URL: url)
let imageGenerator = AVAssetImageGenerator(asset: asset)
imageGenerator.appliesPreferredTrackTransform = true
var time = asset.duration
//If possible - take not the first frame (it could be completely black or white on camara's videos)
time.value = min(time.value, 2)
do {
let imageRef = try imageGenerator.copyCGImageAtTime(time, actualTime: nil)
return UIImage(CGImage: imageRef)
}
catch let error as NSError
{
print("Image generation failed with error \(error)")
return nil
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-27 14:11:32
Oto kod do pobierania obrazów FPS z wideo
1) Import
#import <Photos/Photos.h>
2) w viewDidLoad
videoUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"VfE_html5" ofType:@"mp4"]];
[self createImage:5]; // 5 is frame per second (FPS) you can change FPS as per your requirement.
3) Funkcje
-(void)createImage:(int)withFPS {
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoUrl options:nil];
AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
generator.requestedTimeToleranceAfter = kCMTimeZero;
generator.requestedTimeToleranceBefore = kCMTimeZero;
for (Float64 i = 0; i < CMTimeGetSeconds(asset.duration) * withFPS ; i++){
@autoreleasepool {
CMTime time = CMTimeMake(i, withFPS);
NSError *err;
CMTime actualTime;
CGImageRef image = [generator copyCGImageAtTime:time actualTime:&actualTime error:&err];
UIImage *generatedImage = [[UIImage alloc] initWithCGImage:image];
[self savePhotoToAlbum: generatedImage]; // Saves the image on document directory and not memory
CGImageRelease(image);
}
}
}
-(void)savePhotoToAlbum:(UIImage*)imageToSave {
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
PHAssetChangeRequest *changeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:imageToSave];
} completionHandler:^(BOOL success, NSError *error) {
if (success) {
NSLog(@"sucess.");
}
else {
NSLog(@"fail.");
}
}];
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-17 11:07:24
W Swifcie 4 zadziałało to u mnie z pewnymi modyfikacjami, głównie zmianą parametru "at" imagegeneratora.copyCGImage do typu CMTime:
func showFrame(from file:String) {
let file = file.components(separatedBy: ".")
guard let path = Bundle.main.path(forResource: file[0], ofType:file[1]) else {
debugPrint( "\(file.joined(separator: ".")) not found")
return
}
let url = URL(fileURLWithPath: path)
let image = previewImageForLocalVideo(url: url)
let imgView = UIImageView(image: image)
view.addSubview(imgView)
}
func previewImageForLocalVideo(url:URL) -> UIImage? {
let asset = AVAsset(url: url)
let imageGenerator = AVAssetImageGenerator(asset: asset)
imageGenerator.appliesPreferredTrackTransform = true
let tVal = NSValue(time: CMTimeMake(12, 1)) as! CMTime
do {
let imageRef = try imageGenerator.copyCGImage(at: tVal, actualTime: nil)
return UIImage(cgImage: imageRef)
}
catch let error as NSError
{
print("Image generation failed with error \(error)")
return nil
}
}
override func viewDidLoad() {
super.viewDidLoad()
showFrame(from:"video.mp4")
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-25 11:58:05