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

// 获取视频第一帧

- (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;


}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342