iphone ios 视频特效 将图像插入到视频中(转)

本文介绍如何使用 iOS 的 AVFoundation 框架将一系列 UIImage 对象转换为视频文件。通过创建 AVAssetWriter 和 AVAssetWriterInputPixelBufferAdaptor 实例,实现对像素缓冲区的处理和视频的编码过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果对av foundation 不熟悉得话,建议先看看wwdc 2010 关于av foundation得讲座。http://blog.csdn.net/linzhiji/article/details/6752722

- (CVPixelBufferRef) pixelBufferFromCGImage: (CGImageRef) image andSize:(CGSize) size
{
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey,
                             [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey,
                             nil];
    CVPixelBufferRef pxbuffer = NULL;
    
    CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, size.width,
                                          size.height, kCVPixelFormatType_32ARGB, (CFDictionaryRef) options, 
                                          &pxbuffer);
    NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL);
    
    CVPixelBufferLockBaseAddress(pxbuffer, 0);
    void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);
    NSParameterAssert(pxdata != NULL);
    
    CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(pxdata, size.width,
                                                 size.height, 8, 4*size.width, rgbColorSpace, 
                                                 kCGImageAlphaNoneSkipFirst);
    NSParameterAssert(context);
    CGContextConcatCTM(context, CGAffineTransformMakeRotation(0));
    CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image), 
                                           CGImageGetHeight(image)), image);
    CGColorSpaceRelease(rgbColorSpace);
    CGContextRelease(context);
    
    CVPixelBufferUnlockBaseAddress(pxbuffer, 0);
    
    return pxbuffer;
}

- (void) writeImages:(NSArray *)imagesArray ToMovieAtPath:(NSString *) path withSize:(CGSize) size 
          inDuration:(float)duration byFPS:(int32_t)fps{
    //Wire the writer:
    NSError *error = nil;
    AVAssetWriter *videoWriter = [[[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:path] 
                                                           fileType:AVFileTypeQuickTimeMovie
                                                              error:&error] autorelease];
    NSParameterAssert(videoWriter);
    
    NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                   AVVideoCodecH264, AVVideoCodecKey,
                                   [NSNumber numberWithInt:size.width], AVVideoWidthKey,
                                   [NSNumber numberWithInt:size.height], AVVideoHeightKey,
                                   nil];
    
    AVAssetWriterInput* videoWriterInput = [[AVAssetWriterInput
                                             assetWriterInputWithMediaType:AVMediaTypeVideo
                                             outputSettings:videoSettings] retain];
    
    
    AVAssetWriterInputPixelBufferAdaptor *adaptor = [AVAssetWriterInputPixelBufferAdaptor
                                                     assetWriterInputPixelBufferAdaptorWithAssetWriterInput:videoWriterInput
                                                     sourcePixelBufferAttributes:nil];
    NSParameterAssert(videoWriterInput);
    NSParameterAssert([videoWriter canAddInput:videoWriterInput]);
    [videoWriter addInput:videoWriterInput];
    
    //Start a session:
    [videoWriter startWriting];
    [videoWriter startSessionAtSourceTime:kCMTimeZero];
    
    //Write some samples:
    CVPixelBufferRef buffer = NULL;
    
    int frameCount = 0;
    
    int imagesCount = [imagesArray count];    
    float averageTime = duration/imagesCount;
    int averageFrame = (int)(averageTime * fps);
    
    for(UIImage * img in imagesArray)
    {
        buffer = [self pixelBufferFromCGImage:[img CGImage] andSize:size];
        
        BOOL append_ok = NO;
        int j = 0;
        while (!append_ok && j < 30) 
        {
            if (adaptor.assetWriterInput.readyForMoreMediaData) 
            {
                printf("appending %d attemp %d\n", frameCount, j);
                
                CMTime frameTime = CMTimeMake(frameCount,(int32_t) fps);
                float frameSeconds = CMTimeGetSeconds(frameTime);
                NSLog(@"frameCount:%d,kRecordingFPS:%d,frameSeconds:%f",frameCount,fps,frameSeconds);
                append_ok = [adaptor appendPixelBuffer:buffer withPresentationTime:frameTime];
                
                if(buffer)
                    [NSThread sleepForTimeInterval:0.05];
            } 
            else 
            {
                printf("adaptor not ready %d, %d\n", frameCount, j);
                [NSThread sleepForTimeInterval:0.1];
            }
            j++;
        }
        if (!append_ok) {
            printf("error appending image %d times %d\n", frameCount, j);
        }
        
        frameCount = frameCount + averageFrame;
    }
    
    //Finish the session:
    [videoWriterInput markAsFinished];
    [videoWriter finishWriting];
    NSLog(@"finishWriting");
}



<think>好的,用户问是否可以用手机打出爱心来。我需要先确定用户的具体需求。可能他们是想在聊天、社交媒体或者文档中插入爱心符号。常见的方法包括使用Emoji、特殊符号或者ASCII艺术。 首先,考虑最直接的方式——Emoji。大多数手机键盘都有内置的Emoji,直接输入爱心符号应该不难。但用户可能想知道更多方法,比如不同颜色的爱心或者不同样式的符号。 然后是特殊符号,比如♥,这个可以通过符号键盘或者Unicode输入。对于iOS和Android用户,可能需要不同的步骤,需要分别说明。例如,iPhone用户可以通过切换到符号键盘找到♥,而Android可能需要长按或其他方式。 另外,用户可能对ASCII艺术感兴趣,比如用字符拼出爱心形状。可能需要指导他们如何复制现成的图案,或者自己用符号组合。比如用星号、斜杠等字符组成爱心,这在短信或社交媒体中可能更有个性化。 还要考虑不同平台和应用的兼容性。有些符号可能在部分平台上显示不正常,需要提醒用户注意。另外,动态或彩色爱心可能需要特定应用支持,比如某些聊天软件内置的动态表情,或者使用Unicode的组合字符。 用户可能没有说出的是,他们希望表达心意,所以方法需要简单且有效。可能需要推荐几种最快捷的方式,比如直接使用Emoji,或者复制粘贴Unicode符号,同时提供稍微复杂但更有创意的ASCII艺术选项。 最后,确保回答结构清晰,分点说明不同方法,并给出具体步骤和例子,帮助用户轻松实现。需要检查每个方法的可行性,确保信息准确,比如确认不同手机系统的操作步骤是否正确,符号是否普遍可用。</think>是的,完全可以用手机打出爱心符号或图案,常见方法有以下几种: --- ### **1. 直接输入 Emoji 爱心** **方法**:几乎所有手机键盘都支持 Emoji 表情。 - **步骤**: 1. 打开聊天框或输入界面。 2. 调出手机键盘的 **Emoji 表情面板**(通常在键盘左下角或符号选项中)。 3. 搜索关键词“心”或“爱心”,选择喜欢的颜色或样式(❤️🧡💛💚💙💜🖤💔💖💘💝💗)。 --- ### **2. 输入特殊符号 ♥** **方法**:通过符号键盘或 Unicode 直接输入。 - **步骤**: - **iPhone**:切换到符号键盘(需切换至数字或符号界面),找到 `♥`。 - **Android**:长按 `&` 或 `*` 符号,部分键盘会弹出 `♥`。 - **通用方法**:复制以下符号粘贴使用: ```plaintext ♥ ❤ ❥ ❣ ❦ ❧ ``` --- ### **3. 用字符拼出爱心图案(ASCII 艺术)** **方法**:通过组合符号或字母生成爱心形状,适合短信或纯文本环境。 - **示例**: ```plaintext ❤️ 爱心符号: ♥‿♥ (笑脸爱心) (♥ω♥ ) ~♪ (动态爱心) ASCII 爱心:    ❤❤❤   ❤   ❤  ❤     ❤  ❤     ❤   ❤   ❤    ❤❤❤ ``` - **操作**:直接复制上述符号组合到手机中发送。 --- ### **4. 通过 Unicode 组合字符** **方法**:利用 Unicode 组合符号生成复杂爱心(需部分 App 支持)。 - **示例**: ```plaintext 💘 箭穿心 💌 情书 💞 旋爱心 💕 双爱心 ``` --- ### **5. 输入法快捷短语** **方法**:在输入法中设置快捷短语(如搜狗、百度输入法)。 - **步骤**: 1. 打开输入法设置 → 快捷短语。 2. 添加短语,例如输入 `ax` 自动替换为 ❤️。 --- ### **注意事项**: - **兼容性**:部分符号可能在某些设备或 App 中显示为方框(□),建议先测试再发送。 - **创意玩法**:在微信、QQ 等平台中,发送 `[爱心]` 或 `[em]` 可能触发动态表情特效。 --- 如果需要更复杂的爱心(如动态或彩色),可以通过以下方式实现: - **App 支持**:使用 **Canva、PicsArt** 等设计软件制作图片爱心。 - **代码生成**:参考之前的 Python 爱心代码,生成图像后发送到手机。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值