大佬教程收集整理的这篇文章主要介绍了iOS – 逐帧读取视频文件,进行图像处理,然后另存为新的视频文件,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
这是我的代码.
// Video writer init - (BOOL)setupAssetWriterForURL:(CMFormatDescriptionRef)formatDescription { float bitsPerPixel; CMVideoDimensions dimensions = CMVideoFormatDescriptionGetDimensions(formatDescription); int numPixels = dimensions.width * dimensions.height; int bitsPerSecond; if ( numPixels < (640 * 480) ) bitsPerPixel = 4.05; else bitsPerPixel = 11.4; bitsPerSecond = numPixels * bitsPerPixel; NSDictionary *videoCompressionSetTings = [NSDictionary DictionaryWithObjectsAndKeys: AVVideoCodecH264,AVVideoCodecKey,[NSnumber numberWithInteger:dimensions.width],AVVideoWidthKey,[NSnumber numberWithInteger:dimensions.height],AVVideoHeightKey,[NSDictionary DictionaryWithObjectsAndKeys: [NSnumber numberWithInteger:bitsPerSecond],AVVideoAverageBitRateKey,[NSnumber numberWithInteger:30],AVVideoMaxKeyFrameIntervalKey,nil],AVVideoCompressionPropertiesKey,nil]; if ([assetWriter canApplyOutputSetTings:videoCompressionSetTings forMediaType:AVMediaTypeVideo]) { assetWriterVideoIn = [[AVAssetWriterInput alloc] initWithMediaType:AVMediaTypeVideo outputSetTings:videoCompressionSetTings]; assetWriterVideoIn.expectsMediaDataInRealTime = YES; assetWriterVideoIn.transform = [self transformFromCurrentVideoOrientationToOrientation:self.referenceOrientation]; if ([assetWriter canAddInput:assetWriterVideoIn]) [assetWriter addInput:assetWriterVideoIn]; else { NSLog(@"Couldn't add asset writer video input."); return NO; } } else { NSLog(@"Couldn't apply video output setTings."); return NO; } return YES; }
阅读视频
- (void)readMovie:(NSURL *)url { AVURLAsset * asset = [AVURLAsset URLAssetWithURL:url options:nil]; [asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler: ^{ dispatch_async(dispatch_get_main_queue(),^{ AVAssetTrack * videoTrack = nil; NSArray * tracks = [asset tracksWithMediaType:AVMediaTypeVideo]; if ([tracks count] == 1) { videoTrack = [tracks objectATindex:0]; NSError * error = nil; // _movieReader is a member variable AVAssetReader *movieReader = [[AVAssetReader alloc] initWithAsset:asset error:&error]; if (error) NSLog(@"_movieReader fail!\n"); NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey; NSnumber* value = [NSnumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA]; NSDictionary* videoSetTings = [NSDictionary DictionaryWithObject:value forKey:key]; [movieReader addOutput:[AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:videoTrack outputSetTings:videoSetTings]]; [movieReader startReading]; while ([movieReader status] == AVAssetReaderStatusReading) { AVAssetReaderTrackOutput * output = [movieReader.outputs objectATindex:0]; CMSampleBufferRef sampleBuffer = [output copyNextSampleBuffer]; if (sampleBuffer) { if ( !assetWriter ) { outputURL = [NSURL fileURLWithPath:[NSString StringWithFormat:@"%@/%llu.mov",NstemporaryDirectory(),mach_absolute_time()]]; NSError *error = nil; assetWriter = [[AVAssetWriter alloc] initWithURL:outputURL fileType:(NSString *)kUTTypeQuickTimeMovie error:&error]; if (error) [self showError:error]; if (assetWriter) { CMFormatDescriptionRef formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer); [self setupAssetWriterForURL:formatDescription]; } } CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); CVPixelBufferLockBaseAddress(imageBuffer,0); int bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); int bufferWidth = CVPixelBufferGetWidth(imageBuffer); int bufferHeight = CVPixelBufferGetHeight(imageBuffer); unsigned char *pixel = (unsigned char *)CVPixelBufferGetBaseAddress(imageBuffer); for( int row = 0; row < bufferHeight; row++ ) { for( int column = 0; column < bufferWidth; column++ ) { pixel[0] = (pixel[0]+pixel[1]+pixel[2])/3; pixel[1] = (pixel[0]+pixel[1]+pixel[2])/3; pixel[2] = (pixel[0]+pixel[1]+pixel[2])/3; pixel += 4; } } CVPixelBufferUnlockBaseAddress(imageBuffer,0); if ( assetWriter ) { [self writeSampleBuffer:sampleBuffer ofType:AVMediaTypeVideo]; } CFRelease(sampleBuffer); } } if (assetWriter) { [assetWriterVideoIn markAsFinished]; assetWriter = nil; [assetWriter finishWriTing]; assetWriterVideoIn = nil; assetWriter = nil; [self saveMovieToCameraRoll]; } else { [self showError:[assetWriter error]]; } } }); }]; } - (void) writeSampleBuffer:(CMSampleBufferRef)sampleBuffer ofType:(NSString *)mediaType { if ( assetWriter.status == AVAssetWriterStatusUnkNown ) { if ([assetWriter startWriTing]) { [assetWriter startSessionAtsourceTime:CMSampleBufferGetPresentationtimestamp(sampleBuffer)]; } else { [self showError:[assetWriter error]]; } } if ( assetWriter.status == AVAssetWriterStatusWriTing ) { if (mediaType == AVMediaTypeVideo) { if (assetWriterVideoIn.readyForMoreMediaData) { if (![assetWriterVideoIn appendSampleBuffer:sampleBuffer]) { [self showError:[assetWriter error]]; } } } } } - (void)saveMovieToCameraRoll { ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; [library writeVideoAtPathToSavedPhotosAlbum:outputURL completionBlock:^(NSURL *assetURL,NSError *error) { if (error){ [self showError:error]; NSLog(@"save fail"); } else { [self removeFile:outputURL]; NSLog(@"!!!"); } }); }]; } - (void)removeFile:(NSURL *)fileURL { NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *filePath = [fileURL path]; if ([fileManager fileExistsAtPath:filePath]) { NSError *error; BOOL success = [fileManager removeItemAtPath:filePath error:&error]; if (!success) [self showError:error]; } }
有什么建议?
以上是大佬教程为你收集整理的iOS – 逐帧读取视频文件,进行图像处理,然后另存为新的视频文件全部内容,希望文章能够帮你解决iOS – 逐帧读取视频文件,进行图像处理,然后另存为新的视频文件所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。