iOS動態(tài)壁紙下載到本地

DownLoadVideoService.h

#import

#import

typedefvoid(^FinishBlock)(NSString*filePath);

typedefvoid(^Failed)();

NS_ASSUME_NONNULL_BEGIN

@interfaceDownLoadVideoService :NSObject

/*

?* url? ? ? ? ? ? ? ? ? 音頻網(wǎng)址

?* directoryPath? 存放的地址

?* fileName? ? ? ? 要存的名字

?*/

+ (void)downloadAudioWithUrl:(NSString*)url

?? ? ? ? ? saveDirectoryPath:(NSString*)directoryPath

? ? ? ? ? ? ? ? ? ? fileName:(NSString*)fileName

? ? ? ? ? ? ? ? ? ? ? finish:(FinishBlock)finishBlock

? ? ? ? ? ? ? ? ? ? ? failed:(Failed)failed;

@end

DownLoadVideoService.m

@implementationDownLoadVideoService

+ (void)downloadAudioWithUrl:(NSString*)url

?? ? ? ? ? saveDirectoryPath:(NSString*)directoryPath

? ? ? ? ? ? ? ? ? ? fileName:(NSString*)fileName

? ? ? ? ? ? ? ? ? ? ? finish:(FinishBlock)finishBlock

? ? ? ? ? ? ? ? ? ? ? failed:(Failed)failed

{

? ? NSString *file_path = [directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.mp4", fileName]];

? ? NSFileManager *fm = [NSFileManager defaultManager];


? ? /// 判斷文件是否已經(jīng)存在

? ? if([fmfileExistsAtPath:file_path])

? ? {

? ? ? ? finishBlock(file_path);

? ? }

? ? /// 不存在時

? ? else

? ? {

? ? ? ? NSURL*URL = [NSURLURLWithString:url];

? ? ? ? NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

? ? ? ? //AFN3.0+基于封住URLSession的句柄

? ? ? ? AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

? ? ? ? //請求

? ? ? ? NSURLRequest *request = [NSURLRequest requestWithURL:URL];

? ? ? ? //下載Task操作

? ? ? ? NSURLSessionDownloadTask*_downloadTask = [managerdownloadTaskWithRequest:requestprogress:^(NSProgress*_NonnulldownloadProgress) {

? ? ? ? ? ? //進度


? ? ? ? }destination:^NSURL*_Nonnull(NSURL*_NonnulltargetPath,NSURLResponse*_Nonnullresponse) {


? ? ? ? ? ? NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

? ? ? ? ? ? NSString *path = [cachesPath stringByAppendingPathComponent:response.suggestedFilename];

? ? ? ? ? ? return[NSURLfileURLWithPath:path];


? ? ? ? }completionHandler:^(NSURLResponse*_Nonnullresponse,NSURL*_NullablefilePath,NSError*_Nullableerror) {

? ? ? ? ? ? // filePath就是你下載文件的位置,你可以解壓理澎,也可以直接拿來使用

? ? ? ? ? ? NSString*armFilePath = [filePathpath];// 將NSURL轉(zhuǎn)成NSString

? ? ? ? ? ? finishBlock(armFilePath);

? ? ? ? ? ? //? ? ? ? ? ? if ([DownloadAudioService amrToWavFrom:armFilePath to:file_path]) {

? ? ? ? ? ? //? ? ? ? ? ? ? ? finishBlock(file_path);

? ? ? ? ? ? //? ? ? ? ? ? }

? ? ? ? ? ? //? ? ? ? ? ? else {

? ? ? ? ? ? //? ? ? ? ? ? ? ? failed();

? ? ? ? ? ? //? ? ? ? ? ? }

? ? ? ? }];

? ? ? ? [_downloadTaskresume];

? ? }

}

@end

ZYLivePhotoTool.h

#import

#import

#import

@interfaceZYLivePhotoTool :NSObject

+ (instancetype)shareTool;

- (AVAsset*)cutVideoWithPath:(NSString*)videoPath startTime:(NSTimeInterval)start endTime:(NSTimeInterval)end;

- (void)generatorLivePhotoWithAsset:(AVAsset*)asset

? ? ? ? ? ? ? ? ? ? ? originImgPath:(NSString*)originImgPath

?? ? ? ? ? ? ? ? ? livePhotoImgPath:(NSString*)imgPath

?? ? ? ? ? ? ? ? livePhotoVideoPath:(NSString*)videoPath

? ? ? ? ? ? ? ? ? ? handleLivePhoto:(void(^)(PHLivePhoto*livePhoto))handle;

- (void)generatorOriginImgWithAsset:(AVAsset*)asset

? ? ? ? ? ? ? ? ? ? ? ? ? ? seconds:(NSTimeInterval)seconds

? ? ? ? ? ? ? ? ? ? ? ? ? imageName:(NSString*)imgName

? ? ? ? ? ? ? ? ? ? ? ? ? handleImg:(void(^)(UIImage*originImage,NSString*imagePath,NSError*error))handle;

- (void)saveLivePhotoWithVideoPath:(NSString*)videoPath

?? ? ? ? ? ? ? ? ? ? ? ? imagePath:(NSString*)imagePath

? ? ? ? ? ? ? ? ? ? ? ? ? ? handle:(void(^)(BOOL,NSError*))saveHandle;

@end

ZYLivePhotoTool.m

#import "ZYLivePhotoTool.h"

#import

#import

#import

staticNSString*constkFigAppleMakerNote_AssetIdentifier =@"17";

static NSString * constkKeyContentIdentifier =? @"com.apple.quicktime.content.identifier";

static NSString * const kKeyStillImageTime = @"com.apple.quicktime.still-image-time";

staticNSString*constkKeySpaceQuickTimeMetadata =@"mdta";

static ZYLivePhotoTool *tool = nil;

@implementationZYLivePhotoTool

+ (instancetype)shareTool{

? ? staticdispatch_once_tonceToken;

? ? dispatch_once(&onceToken, ^{

? ? ? ? tool = [[ZYLivePhotoTool alloc] init];

? ? });

? ? return tool;

}

- (void)generatorLivePhotoWithAsset:(AVAsset*)asset

? ? ? ? ? ? ? ? ? ? ? originImgPath:(NSString*)originImgPath

?? ? ? ? ? ? ? ? ? livePhotoImgPath:(NSString*)imgPath

?? ? ? ? ? ? ? ? livePhotoVideoPath:(NSString*)videoPath

? ? ? ? ? ? ? ? ? ? handleLivePhoto:(void(^)(PHLivePhoto*))handle{


? ? NSString *assetID = [NSUUID UUID].UUIDString;

? ? dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

? ? ? ? [self dealImageWithOriginPath:originImgPath filePath:imgPath assetIdentifier:assetID];

? ? ? ? [self dealVideoWithWriteFilePath:videoPath AssetIdentifier:assetID asset:asset];

? ? ? ? dispatch_async(dispatch_get_main_queue(), ^{

?? ? ? ? ? AVAssetTrack *track = [asset tracksWithMediaType:AVMediaTypeVideo].firstObject;

? ? ? ? ? ? [PHLivePhoto requestLivePhotoWithResourceFileURLs:@[[NSURL fileURLWithPath:videoPath],[NSURL fileURLWithPath:imgPath]] placeholderImage:nil targetSize:track.naturalSize contentMode:PHImageContentModeAspectFit resultHandler:^(PHLivePhoto * _Nullable livePhoto, NSDictionary * _Nonnull info) {

? ? ? ? ? ? ? ? handle(livePhoto);

? ? ? ? ? ? }];

? ? ? ? });

? ? });

}

- (void)generatorOriginImgWithAsset:(AVAsset*)asset

? ? ? ? ? ? ? ? ? ? ? ? ? ? seconds:(NSTimeInterval)seconds

? ? ? ? ? ? ? ? ? ? ? ? ? imageName:(NSString*)imgName

? ? ? ? ? ? ? ? ? ? ? ? ? handleImg:(void(^)(UIImage*originImage,NSString*imagePath,NSError*error))handle{

? ? AVAssetTrack *track = [asset tracksWithMediaType:AVMediaTypeVideo].firstObject;

? ? AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];

? ? generator.appliesPreferredTrackTransform = true;

? ? generator.maximumSize= track.naturalSize;

? ? CGImageRef image = [generator copyCGImageAtTime:CMTimeMakeWithSeconds(seconds, asset.duration.timescale) actualTime:nil error:nil];

? ? if(image !=nil) {

? ? ? ? NSData *data = UIImagePNGRepresentation([UIImage imageWithCGImage:image]);

? ? ? ? NSArray *urls = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];

? ? ? ? NSURL*url = urls[0];

? ? ? ? NSString *imageURL = [url.path stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.jpg",imgName]];

? ? ? ? [datawriteToFile:imageURLatomically:true];

? ? ? ? handle([UIImageimageWithCGImage:image],imageURL,nil);

? ? ? ? CGImageRelease(image);

? ? }

}

- (AVAsset*)cutVideoWithPath:(NSString*)videoPath startTime:(NSTimeInterval)start endTime:(NSTimeInterval)end{

?? ? AVURLAsset *asset = [AVURLAsset assetWithURL:[NSURL fileURLWithPath:videoPath]];

? ? AVMutableComposition *composition = [[AVMutableComposition alloc] init];

? ? AVMutableCompositionTrack *muTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];


? ? AVMutableCompositionTrack *audioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];


? ? AVAssetTrack *originTrack = [asset tracksWithMediaType:AVMediaTypeVideo].firstObject;

? ? AVAssetTrack *originAudioTrack = [asset tracksWithMediaType:AVMediaTypeAudio].firstObject;


? ? [muTrackinsertTimeRange:CMTimeRangeMake(CMTimeMakeWithSeconds(start, asset.duration.timescale), CMTimeMakeWithSeconds(end, asset.duration.timescale)) ofTrack:originTrack atTime:kCMTimeZero error:nil];

? ? [audioTrackinsertTimeRange:CMTimeRangeMake(CMTimeMakeWithSeconds(start, asset.duration.timescale), CMTimeMakeWithSeconds(end, asset.duration.timescale)) ofTrack:originAudioTrack atTime:kCMTimeZero error:nil];

? ? muTrack.preferredTransform = originTrack.preferredTransform;


? ? returncomposition;

}

- (void)dealImageWithOriginPath:(NSString*)originPath

?? ? ? ? ? ? ? ? filePath:(NSString*)finalPath

?? ? ? ? ? ? ? ? ? ? assetIdentifier:(NSString*)assetIdentifier {

? ? CGImageDestinationRef dest = CGImageDestinationCreateWithURL((CFURLRef)[NSURL fileURLWithPath:finalPath], kUTTypeJPEG, 1, nil);

? ? CGImageSourceRef imageSourceRef = CGImageSourceCreateWithData((CFDataRef)[NSData dataWithContentsOfFile:originPath], nil);

? ? NSMutableDictionary *metaData = [(__bridge_transfer? NSDictionary*)CGImageSourceCopyPropertiesAtIndex(imageSourceRef, 0, nil) mutableCopy];


? ? NSMutableDictionary *makerNote = [NSMutableDictionary dictionary];

? ? [makerNotesetValue:assetIdentifierforKey:kFigAppleMakerNote_AssetIdentifier];

? ? [metaDatasetValue:makerNote forKey:(__bridge_transfer? NSString*)kCGImagePropertyMakerAppleDictionary];

? ? CGImageDestinationAddImageFromSource(dest, imageSourceRef, 0, (CFDictionaryRef)metaData);

? ? CGImageDestinationFinalize(dest);

? ? CFRelease(dest);

}

- (void)dealVideoWithWriteFilePath:(NSString*)finalMovPath

?? ? ? ? ? ? ? ? ? ? AssetIdentifier:(NSString*)assetIdentifier

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? asset:(AVAsset*)asset{


? ? AVAssetTrack *videoTrack = [asset tracksWithMediaType:AVMediaTypeVideo].firstObject;

? ? AVAssetTrack *audioTrack = [asset tracksWithMediaType:AVMediaTypeAudio].firstObject;


? ? if(!videoTrack) {

? ? ? ? return;

? ? }


? ? AVAssetReaderOutput *videoOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:videoTrack outputSettings:@{(__bridge_transfer? NSString*)kCVPixelBufferPixelFormatTypeKey : [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA]}];


? ? NSDictionary *audioDic = @{AVFormatIDKey :@(kAudioFormatLinearPCM),

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AVLinearPCMIsBigEndianKey:@NO,

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AVLinearPCMIsFloatKey:@NO,

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AVLinearPCMBitDepthKey:@(16)

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? };


? ? NSError*error;



? ? AVAssetReader *reader = [AVAssetReader assetReaderWithAsset:asset error:&error];

? ? if([readercanAddOutput:videoOutput]) {

? ? ? ? [readeraddOutput:videoOutput];

? ? }else{

? ? ? ? NSLog(@"Add video output error\n");

? ? }


? ? AVAssetReaderTrackOutput *audioOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:audioTrack outputSettings:audioDic];


? ? if([readercanAddOutput:audioOutput]) {

? ? ? ? [readeraddOutput:audioOutput];

? ? }else{

? ? ? ? NSLog(@"Add audio output error\n");

? ? }


? ? NSDictionary * outputSetting = @{AVVideoCodecKey: AVVideoCodecH264,

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AVVideoWidthKey: [NSNumbernumberWithFloat:videoTrack.naturalSize.width],

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AVVideoHeightKey: [NSNumber numberWithFloat:videoTrack.naturalSize.height]

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? };


? ? AVAssetWriterInput *videoInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:outputSetting];

? ? videoInput.expectsMediaDataInRealTime = true;

? ? videoInput.transform= videoTrack.preferredTransform;


? ? NSDictionary *audioSettings = [NSDictionary dictionaryWithObjectsAndKeys:

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey,

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [NSNumbernumberWithInt:1],AVNumberOfChannelsKey,

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [NSNumbernumberWithFloat:44100],AVSampleRateKey,

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [NSNumbernumberWithInt:128000],AVEncoderBitRateKey,

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nil];


? ? AVAssetWriterInput *audioInput = [AVAssetWriterInput assetWriterInputWithMediaType:[audioTrack mediaType] outputSettings:audioSettings];

? ? audioInput.expectsMediaDataInRealTime = true;

? ? audioInput.transform= audioTrack.preferredTransform;


? ? NSError*error_two;


? ? AVAssetWriter *writer = [AVAssetWriter assetWriterWithURL:[NSURL fileURLWithPath:finalMovPath] fileType:AVFileTypeQuickTimeMovie error:&error_two];

? ? if(error_two) {

? ? ? ? NSLog(@"CreateWriterError:%@\n",error_two);

? ? }

? ? writer.metadata=@[[selfmetaDataSet:assetIdentifier]];

? ? [writeraddInput:videoInput];

? ? [writeraddInput:audioInput];


? ? NSDictionary *sourcePixelBufferAttributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys:

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [NSNumbernumberWithInt:kCVPixelFormatType_32BGRA],

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? kCVPixelBufferPixelFormatTypeKey,nil];


? ? AVAssetWriterInputPixelBufferAdaptor *adaptor = [AVAssetWriterInputPixelBufferAdaptor assetWriterInputPixelBufferAdaptorWithAssetWriterInput:videoInput sourcePixelBufferAttributes:sourcePixelBufferAttributesDictionary];


? ? AVAssetWriterInputMetadataAdaptor *adapter = [self metadataSetAdapter];

? ? [writeraddInput:adapter.assetWriterInput];

? ? [writerstartWriting];

? ? [readerstartReading];

? ? [writerstartSessionAtSourceTime:kCMTimeZero];


? ? CMTimeRange dummyTimeRange = CMTimeRangeMake(CMTimeMake(0, 1000), CMTimeMake(200, 3000));

? ? //Meta data reset:

? ? AVMutableMetadataItem *item = [AVMutableMetadataItem metadataItem];

? ? item.key = kKeyStillImageTime;

? ? item.keySpace = kKeySpaceQuickTimeMetadata;

? ? item.value = [NSNumber numberWithInt:0];

? ? item.dataType = @"com.apple.metadata.datatype.int8";

? ? [adapterappendTimedMetadataGroup:[[AVTimedMetadataGroup alloc] initWithItems:[NSArray arrayWithObject:item] timeRange:dummyTimeRange]];



? ? dispatch_queue_t createMovQueue = dispatch_queue_create("createMovQueue", DISPATCH_QUEUE_SERIAL);

? ? dispatch_async(createMovQueue, ^{

? ? ? ? while (reader.status == AVAssetReaderStatusReading) {

? ? ? ? ? ? CMSampleBufferRefvideoBuffer = [videoOutputcopyNextSampleBuffer];

? ? ? ? ? ? CMSampleBufferRefaudioBuffer = [audioOutputcopyNextSampleBuffer];


? ? ? ? ? ? if(videoBuffer) {

? ? ? ? ? ? ? ? while(!videoInput.isReadyForMoreMediaData|| !audioInput.isReadyForMoreMediaData) {

? ? ? ? ? ? ? ? ? ? usleep(1);

? ? ? ? ? ? ? ? }


? ? ? ? ? ? ? ? if(audioBuffer) {

? ? ? ? ? ? ? ? ? ? [audioInputappendSampleBuffer:audioBuffer];

? ? ? ? ? ? ? ? ? ? CFRelease(audioBuffer);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? [adaptor.assetWriterInputappendSampleBuffer:videoBuffer];

? ? ? ? ? ? ? ? CMSampleBufferInvalidate(videoBuffer);

? ? ? ? ? ? ? ? CFRelease(videoBuffer);

? ? ? ? ? ? ? ? videoBuffer =nil;


? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? continue;

? ? ? ? ? ? }

? ? ? ? ? ? // NULL?

? ? ? ? }

? ? ? ? dispatch_sync(dispatch_get_main_queue(), ^{

? ? ? ? ? ? [writerfinishWritingWithCompletionHandler:^{

? ? ? ? ? ? ? ? NSLog(@"Finish \n");

? ? ? ? ? ? }];

? ? ? ? });

? ? });


? ? while (writer.status == AVAssetWriterStatusWriting) {

? ? ? ? [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]];

? ? }

}

- (AVAssetWriterInputMetadataAdaptor *)metadataSetAdapter {

? ? NSString *identifier = [kKeySpaceQuickTimeMetadata stringByAppendingFormat:@"/%@",kKeyStillImageTime];

? ? const NSDictionary *spec = @{(__bridge_transfer? NSString*)kCMMetadataFormatDescriptionMetadataSpecificationKey_Identifier :

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? identifier,

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (__bridge_transfer? NSString*)kCMMetadataFormatDescriptionMetadataSpecificationKey_DataType :

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @"com.apple.metadata.datatype.int8"

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? };

? ? CMFormatDescriptionRef desc;

? ? CMMetadataFormatDescriptionCreateWithMetadataSpecifications(kCFAllocatorDefault, kCMMetadataFormatType_Boxed, (__bridge CFArrayRef)@[spec], &desc);

? ? AVAssetWriterInput *input = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeMetadata outputSettings:nil sourceFormatHint:desc];

? ? CFRelease(desc);

? ? return [AVAssetWriterInputMetadataAdaptor assetWriterInputMetadataAdaptorWithAssetWriterInput:input];


}

- (AVMetadataItem*)metaDataSet:(NSString*)assetIdentifier {

? ? AVMutableMetadataItem *item = [AVMutableMetadataItem metadataItem];

? ? item.key = kKeyContentIdentifier;

? ? item.keySpace = kKeySpaceQuickTimeMetadata;

? ? item.value= assetIdentifier;

? ? item.dataType = @"com.apple.metadata.datatype.UTF-8";

? ? returnitem;

}

- (void)saveLivePhotoWithVideoPath:(NSString*)videoPath imagePath:(NSString*)imagePath handle:(void(^)(BOOL,NSError*))saveHandle{

? ? [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{

? ? ? ? PHAssetCreationRequest *creationRequest = [PHAssetCreationRequest creationRequestForAsset];

? ? ? ? PHAssetResourceCreationOptions *options = [[PHAssetResourceCreationOptions alloc] init];


? ? ? ? [creationRequestaddResourceWithType:PHAssetResourceTypePairedVideo fileURL:[NSURL fileURLWithPath:videoPath] options:options];

? ? ? ? [creationRequestaddResourceWithType:PHAssetResourceTypePhoto fileURL:[NSURL fileURLWithPath:imagePath] options:options];


? ? }completionHandler:^(BOOLsuccess,NSError*_Nullableerror) {

? ? ? ? saveHandle(success,error);

? ? }];

}

@end

核心代碼


?dispatch_async(dispatch_get_main_queue(), ^{

? ? ? ? __weaktypeof(self)weakself =self;

? ? ? ? [MBProgressHUD showMessag:@"Loading" toView:self.view];


? ? });


? ? flag=1;

? ? [DownLoadVideoService downloadAudioWithUrl:self.object[@"videoFileUrl"] saveDirectoryPath:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] fileName:[NSString stringWithFormat:@"%@", self.object.objectId] finish:^(NSString *filePath2) {


? ? ? ? AVURLAsset*audioAsset=[[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:filePath2] options:nil];

? ? ? ? CMTimeaudioDuration=audioAsset.duration;

? ? ? ? floataudioDurationSeconds=CMTimeGetSeconds(audioDuration);


? ? ? ? AVAsset*asset = [[ZYLivePhotoToolshareTool]cutVideoWithPath:filePath2startTime:0.0endTime:audioDurationSeconds];



? ? ? ? [[ZYLivePhotoTool shareTool] generatorOriginImgWithAsset:asset seconds:2.0 imageName:@"image" handleImg:^(UIImage *originImage, NSString *imagePath, NSError *error) {


? ? ? ? ? ? NSString *outPut = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, true).firstObject;

? ? ? ? ? ? NSString *newImgPath = [outPut stringByAppendingPathComponent:@"IMG.JPG"];

? ? ? ? ? ? NSString*newVideoPath = [outPutstringByAppendingPathComponent:@"IMG.MOV"];

? ? ? ? ? ? [[NSFileManager defaultManager] removeItemAtPath:newImgPath error:nil];

? ? ? ? ? ? [[NSFileManager defaultManager] removeItemAtPath:newVideoPath error:nil];


? ? ? ? ? ? [[ZYLivePhotoTool shareTool] generatorLivePhotoWithAsset:asset originImgPath:imagePath livePhotoImgPath:newImgPath livePhotoVideoPath:newVideoPath handleLivePhoto:^(PHLivePhoto *livePhoto) {

? ? ? ? ? ? ? ? //? ? ? ? ? ? ? ? ? ? photoView.livePhoto = livePhoto;

? ? ? ? ? ? ? ? if(self->flag==1) {


? ? ? ? ? ? ? ? ? ? self->flag=3;

? ? ? ? ? ? ? ? [[ZYLivePhotoToolshareTool]saveLivePhotoWithVideoPath:newVideoPathimagePath:newImgPathhandle:^(BOOLsuccess,NSError*error) {

? ? ? ? ? ? ? ? ? ? if(success) {

? ? ? ? ? ? ? ? ? ? ? ? NSLog(@"aaa");

? ? ? ? ? ? ? ? ? ? ? ? dispatch_sync(dispatch_get_main_queue(), ^{

? ? ? ? ? ? ? ? ? ? ? ? ? ? [MBProgressHUD hideHUDForView:self.view animated:YES];

? ? ? ? ? ? ? ? ? ? ? ? ? ? [MBProgressHUDshowError:NSLocalizedString(@"baocunchenggong",nil)toView:self.view];

? ? ? ? ? ? ? ? ? ? ? ? });


? ? ? ? ? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? ? ? ? ? dispatch_sync(dispatch_get_main_queue(), ^{

? ? ? ? ? ? ? ? ? ? ? ? ? ? [MBProgressHUD hideHUDForView:self.view animated:YES];

? ? ? ? ? ? ? ? ? ? ? ? ? ? [MBProgressHUDshowError:NSLocalizedString(@"baocunshibai",nil)toView:self.view];

? ? ? ? ? ? ? ? ? ? ? ? });


? ? ? ? ? ? ? ? ? ? ? ? NSLog(@"bbb");

? ? ? ? ? ? ? ? ? ? }


? ? ? ? ? ? ? ? }];


? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? }];



? ? ? ? }];





? ? }failed:^{


?? ? ? [MBProgressHUD hideHUDForView:self.view animated:YES];


? ? }];

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末囊陡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子筑舅,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異卿操,居然都是意外死亡,警方通過查閱死者的電腦和手機孙援,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門害淤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拓售,你說我怎么就攤上這事窥摄。” “怎么了础淤?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵崭放,是天一觀的道長。 經(jīng)常有香客問我鸽凶,道長币砂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任玻侥,我火速辦了婚禮决摧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凑兰。我一直安慰自己掌桩,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布票摇。 她就那樣靜靜地躺著拘鞋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪矢门。 梳的紋絲不亂的頭發(fā)上盆色,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天灰蛙,我揣著相機與錄音,去河邊找鬼隔躲。 笑死摩梧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宣旱。 我是一名探鬼主播仅父,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼浑吟!你這毒婦竟也來了笙纤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤组力,失蹤者是張志新(化名)和其女友劉穎省容,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體燎字,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡腥椒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了候衍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笼蛛。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蛉鹿,靈堂內(nèi)的尸體忽然破棺而出滨砍,到底是詐尸還是另有隱情,我是刑警寧澤榨为,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布惨好,位于F島的核電站,受9級特大地震影響随闺,放射性物質(zhì)發(fā)生泄漏日川。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一矩乐、第九天 我趴在偏房一處隱蔽的房頂上張望龄句。 院中可真熱鬧,春花似錦散罕、人聲如沸分歇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽职抡。三九已至,卻和暖如春误甚,著一層夾襖步出監(jiān)牢的瞬間缚甩,已是汗流浹背谱净。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留擅威,地道東北人壕探。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像郊丛,于是被迫代替她去往敵國和親李请。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容