欢迎光临外链购买平台,轻松为你获得外链购买的成功案例,友链相关事宜咨询:18978701720,黄经理

外链购买,专注打造匠心好平台

一个好的外链购买,可以为你轻松解决获客难题

获取视频中的音频素材,获取视频第一帧

作者:jcmp      发布时间:2021-04-13      浏览量:0
// 获取视频第一帧 - (

// 获取视频第一帧

- (UIImage*) getVideoPreViewImage:(AVURLAsset*)asset

{


AVAssetImageGenerator *gen = [[AVAssetImageGenerator alloc] initWithAsset:asset];

// 设定缩略图的方向

// 如果不设定,可能会在视频旋转90/180/270°时,获取到的缩略图是被旋转过的,而不是正向的

gen.appliesPreferredTrackTransform = YES;


gen.apertureMode = AVAssetImageGeneratorApertureModeEncodedPixels;

// 设置图片的最大size(分辨率)

gen.maximumSize = CGSizeMake(300, 169);

CMTime time = CMTimeMakeWithSeconds(0.0, 10); //取第0秒,一秒钟600帧

NSError*error =nil;

CMTimeactualTime;

CGImageRefimage = [gencopyCGImageAtTime:timeactualTime:&actualTimeerror:&error];

if(error) {

UIImage*placeHoldImg = [UIImageimageNamed:@"付费页"];

returnplaceHoldImg;

}

UIImage *thumb = [[UIImage alloc] initWithCGImage:image];

CGImageRelease(image);

returnthumb;

}

这个方法有时候会崩溃


//获取m3u8视频帧画面

- (UIImage*)getPixelBufferForItem:(AVPlayerItem*)playerItem{


AVPlayerItemVideoOutput *output = [[AVPlayerItemVideoOutput alloc] init];

[playerItemaddOutput:output];

CVPixelBufferRef ref =[output copyPixelBufferForItemTime:CMTimeMake(1000, 60) itemTimeForDisplay:nil];

UIImage*image = [selfCVImageToUIImage:ref];

returnimage;

}

//CVPixelBufferRef转UIImage

- (UIImage*)CVImageToUIImage:(CVPixelBufferRef)imageBuffer{

CVPixelBufferLockBaseAddress(imageBuffer, 0);

void*baseAddress =CVPixelBufferGetBaseAddress(imageBuffer);

size_t width = CVPixelBufferGetWidth(imageBuffer);

size_t height = CVPixelBufferGetHeight(imageBuffer);

size_tbufferSize =CVPixelBufferGetDataSize(imageBuffer);

size_t bytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer, 0);


CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();

CGDataProviderRefprovider =CGDataProviderCreateWithData(NULL, baseAddress, bufferSize,NULL);


CGImageRef cgImage = CGImageCreate(width, height, 8, 32, bytesPerRow, rgbColorSpace, kCGImageAlphaNoneSkipFirst|kCGBitmapByteOrder32Little, provider, NULL, true, kCGRenderingIntentDefault);



UIImage *image = [UIImage imageWithCGImage:cgImage];


CGImageRelease(cgImage);

CGDataProviderRelease(provider);

CGColorSpaceRelease(rgbColorSpace);


NSData* imageData = UIImageJPEGRepresentation(image, 1.0);

image = [UIImageimageWithData:imageData];

CVPixelBufferUnlockBaseAddress(imageBuffer, 0);

returnimage;


}



//获取视频中的音频素材

[selfsetUpAndAddAudioAtPath:urlAssettoComposition:compositionstart:startTimedura:trackDurationoffset:CMTimeMake(14*44100,44100)andArray:audioMixParams];


//创建一个可变的音频混合

AVMutableAudioMix *audioMix =[AVMutableAudioMix audioMix];

audioMix.inputParameters =[NSArray arrayWithArray:audioMixParams];//从数组里取出处理后的音频轨道参数


//创建一个输出

AVAssetExportSession *exporter =[[AVAssetExportSession alloc]

initWithAsset:composition

presetName:AVAssetExportPresetAppleM4A];

exporter.audioMix= audioMix;

exporter.outputFileType=@"com.apple.m4a-audio";


//视频的声音,合成后存储

NSArray *paths =NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES);

NSString*path=[paths objectAtIndex:0];


//NSString *movDirectory = [path stringByAppendingPathComponent:@"/%@.m4a"];

NSString* movDirectory = [pathstringByAppendingPathComponent:

[NSStringstringWithFormat:@"/%@.m4a",[selfgetCurrentTimes]]];

if([[NSFileManager defaultManager]fileExistsAtPath:movDirectory]) {

[[NSFileManager defaultManager]removeItemAtPath:movDirectory error:nil];

}


NSURL*exportURL =[NSURLfileURLWithPath:movDirectory];

exporter.outputURL= exportURL;

MAKAudioObject * object = [[MAKAudioObject alloc]init];

object.url= movDirectory;

object.name= [movDirectorysubstringFromIndex:movDirectory.length-19];

object.localam = [movDirectorysubstringFromIndex:movDirectory.length-19];


[exporterexportAsynchronouslyWithCompletionHandler:^{


dispatch_async(dispatch_get_main_queue(), ^{

NSLog(@"Export status not yet completed. Error: %@", exporter.error.description);

if (exporter.status == AVAssetExportSessionStatusCompleted) {

NSURL* outputURL = exporter.outputURL;

AVURLAsset*songAsset = [AVURLAssetURLAssetWithURL:outputURLoptions:nil];

NSData* data = [NSDatadataWithContentsOfFile:movDirectory];

NSLog(@"data:%@",data);

object.time=[NSStringstringWithFormat:@"%.2f",CMTimeGetSeconds(songAsset.duration)];

NSNumber*size;

[songAsset.URLgetResourceValue:&sizeforKey:NSURLFileSizeKeyerror:nil];

NSLog(@"size is %.2f",[sizefloatValue]/(1024.0*1024.0));//size is 43.703005

object.cunchu=[NSStringstringWithFormat:@"%.2fMb",[sizefloatValue]/(1024.0*1024.0)];




if ( [[MAKAudioMusicDBManager sharedManager] insertAudioWith:object]) {


[selfbackButtonclick];

}


}

});



}];



-(void)setUpAndAddAudioAtPath:(AVURLAsset*)songAsset toComposition:(AVMutableComposition*)composition start:(CMTime)start dura:(CMTime)dura offset:(CMTime)offset andArray:(NSMutableArray*)audioMixParams{




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

AVAssetTrack *sourceAudioTrack = [[songAsset tracksWithMediaType:AVMediaTypeAudio]objectAtIndex:0];


NSError*error =nil;

BOOLok =NO;


CMTimestartTime = start;

CMTimetrackDuration = dura;

CMTimeRangetRange =CMTimeRangeMake(startTime,trackDuration);


//设置音量

//AVMutableAudioMixInputParameters(输入参数可变的音频混合)

//audioMixInputParametersWithTrack(音频混音输入参数与轨道)

//AVMutableAudioMixInputParameters *trackMix = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:track];

//[trackMix setVolume:0.8f atTime:startTime];

//素材加入数组

//[audioMixParams addObject:trackMix];


//Insert audio into track //offsetCMTimeMake(0, 44100)

ok = [trackinsertTimeRange:tRangeofTrack:sourceAudioTrackatTime:kCMTimeInvaliderror:&error];

}

-(NSString*)getCurrentTimes{


NSDateFormatter *formatter = [[NSDateFormatter alloc] init];


// ----------设置你想要的格式,hh与HH的区别:分别表示12小时制,24小时制


[formattersetDateFormat:@"YYYYMMdd_HHmmss"];


//现在时间,你可以输出来看下是什么格式


NSDate*datenow = [NSDatedate];


//----------将nsdate按formatter格式转成nsstring


NSString*currentTimeString = [formatterstringFromDate:datenow];


NSLog(@"currentTimeString = %@",currentTimeString);


returncurrentTimeString;


}