牛人教你如何开发一个抖音级的短视频app(抖音开发教程)

毫无疑问抖音是 2018-2019 年最火应用之一。抖音的火爆,不仅意味着垂直短视频可以获得爆发式增长,综合平台嵌入短视频,更能极大提高用户活跃度。 原文转载至https://blog.qiniu.com/archives/8803

当前短视频技术渐进成熟,然而要快速上线短视频,除了必备的 Android、iOS 开发经验,更重要的是选择一个接口清晰、功能丰富、包体小的 SDK 接入。今天我将基于七牛云短视频 SDK,手把手教你一天打造一个抖音级的短视频平台。

牛人教你如何开发一个抖音级的短视频app(抖音开发教程)

流程列表

开发一个短视频最主要的流程分为 3 个,下面我将分步教你实现这 3 个流程下的各个功能点,功能点 API 可按需调用:

视频拍摄

a.启动拍摄

b.给拍摄添加背景音乐

c.开始拍摄

d.添加美颜

e.添加滤镜

f.添加人脸贴纸

g.分段变速拍摄

h.结束拍摄

视频编辑

a.开始编辑

b.添加背景音乐

c.添加文字特效

d.添加抖音特效

视频导出

开发前准备

• 下载Demo

(https://github.com/anhaoxiong/QNShortVideoDemo)

• 下载短视频 SDK(https://github.com/pili-engineering/PLShortVideoKit)

视频拍摄

2.1 启动拍摄

首先包含七牛短视频 SDK 头文件 PLShortVideoKit.h :

#import <PLShortVideoKit/PLShortVideoKit.h>

然后添加一个 PLShortVideoRecorder 属性:

@property (nonatomic,strong) PLShortVideoRecorder *shortVideoRecorder;

创建音视频的采集和编码配置对象,这里我们使用默认配置,开发者可以根据自己的需求修改配置:

PLSVideoConfiguration *videoConfiguration = [PLSVideoConfiguration defaultConfiguration]; PLSAudioConfiguration *audioConfiguration = [PLSAudioConfiguration defaultConfiguration];

创建拍摄 shortVideoRecorder 对象:

self.shortVideoRecorder = [[PLShortVideoRecorder alloc] initWithVideoConfiguration:videoConfiguration audioConfiguration:audioConfiguration]; self.shortVideoRecorder.delegate = self;

添加摄像头预览视图:

[self.view addSubview:self.shortVideoRecorder.previewView];

至此,基本配置完成,我们可以启动摄像头预览:

[self.shortVideoRecorder startCaptureSession];

2.2 给拍摄添加背景音乐

在开始录制之前,我们可以添加背景音乐:

NSURL *audioURL = [NSURL fileURLWithString:@\”PATH TO AUDIO\”]; [self.shortVideoRecorder mixAudio:audioURL];

背景音乐只能在开始录制之前添加,一旦录制开始了,不能再添加,此时只有删除已经录制的视频文件,才能添加背景音乐。

2.3 开始拍摄

录制的视频存放路径由 SDK 内部自动生成:

[self.shortVideoRecorder startRecording];

开发者也可以自己传入录制的视频存放路径:

[self.shortVideoRecorder startRecording:customFileURL];

2.4 添加美颜

七牛短视频 SDK 提供了美颜功能,开发者只需要一个简单的参数设置即可以打开美颜功能:

[self.shortVideoRecorder setBeautifyModeOn:YES];

2.5 添加滤镜

七牛短视频 SDK 内部提供了 30 多种滤镜格式,开发者使用滤镜需要在工程中包含 PLShortVideoKit.bundle,这里面存放了滤镜的图片资源,开发者还可以添加自己的滤镜图片。

初始化滤镜:

// 初始化滤镜 self.filter = [[PLSFilter alloc] init];// 设置滤镜色彩图片路径 NSString *bundlePath = [NSBundle mainBundle].bundlePath; NSString *colorImagePath = [bundlePath stringByAppendingString:@\”/PLShortVideoKit.bundle/colorFilter/candy/filter.png\”]; self.filter.colorImagePath = colorImagePath;

在短视频数据回调方法中,我们可以用上面初始化好的滤镜:

– (CVPixelBufferRef)shortVideoRecorder:(PLShortVideoRecorder *)recorder cameraSourceDidGetPixelBuffer:(CVPixelBufferRef)pixelBuffer { // 进行滤镜处理 pixelBuffer = [self.filter process:pixelBuffer]; return pixelBuffer; }

2.6 添加人脸贴纸

七牛短视频 SDK 没有提供人脸识别的贴纸功能,但是我们 SDK 能很容易的接入友商的贴纸功能,我们以添加 涂图 的贴纸举例说明

包含涂图的头文件:

#import <TuSDKVideo/TuSDKVideo.h> #import \”StickerScrollView.h\”

增加贴纸添加器和贴纸选择 view:

@property (nonatomic, strong) TuSDKFilterProcessor *filterProcessor; @property (nonatomic, strong) StickerScrollView *stickerView;

初始化贴纸添加的实例:

self.filterProcessor = [[TuSDKFilterProcessor alloc] initWithFormatType:kCVPixelFormatType_32BGRA isOriginalOrientation:NO]; self.filterProcessor.outputPixelFormatType = lsqFormatTypeBGRA; // TuSDKFilterProcessor 默认不启用贴纸,这里需要主动启用贴纸功能 [self.filterProcessor setEnableLiveSticker:YES]; self.stickerView = [[StickerScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 300)]; self.stickerView.stickerDelegate = self; self.stickerView.cameraStickerType = lsqCameraStickersTypeSquare;

选择贴纸。在贴纸选择的回调,处理贴纸:

(void)clickStickerViewWith:(TuSDKPFStickerGroup *)stickGroup { if (!stickGroup) { // 为nil时 移除已有贴纸组; [_filterProcessor removeMediaEffectsWithType:TuSDKMediaEffectDataTypeSticker]; } else { // 选中了某个贴纸,将其添加到 filterProcessor 中 [self.filterProcessor showGroupSticker:stickGroup]; } }

贴纸选择完成之后,我们可以将贴纸应用到视频录制中。和滤镜处理类似,在短视频拍摄的视频数据回调中,应用贴纸:

– (CVPixelBufferRef)shortVideoRecorder:(PLShortVideoRecorder *)recorder cameraSourceDidGetPixelBuffer:(CVPixelBufferRef)pixelBuffer { // 进行滤镜处理 pixelBuffer = [self.filter process:pixelBuffer]; // TuSDK 进行贴纸处理 pixelBuffer = [self.filterProcessor syncProcessPixelBuffer:pixelBuffer]; [self.filterProcessor destroyFrameData]; return pixelBuffer; }

2.7 分段变速拍摄

如果想拍摄的视频以快速或者慢速播放,可以设置拍摄速率:

self.shortVideoRecorder.recoderRate = PLSVideoRecoderRateTopFast;

2.8 结束拍摄

如果要结束某一段视频的录制,可以调用停止录制方法:

[self.shortVideoRecorder stopRecording];

调用停止录制之后,保存的视频会通过录制完成回调返回出来:

– (void)shortVideoRecorder:(PLShortVideoRecorder *)recorder didFinishRecordingToOutputFileAtURL:(NSURL *)fileURL fileDuration:(CGFloat)fileDuration totalDuration:(CGFloat)totalDuration { }

停止音视频采集。如果不再需要拍摄视频,可以调用停止采集方法来结束拍摄:

[self.shortVideoRecorder stopCaptureSession];

视频编辑

3.1 开始编辑

编辑类 PLShortVideoEditor 支持渲染音视频、水印、滤镜、背景音乐、MV 特效等功能

初始化和启动编辑:

self.shortVideoEditor = [[PLShortVideoEditor alloc] initWithAsset:asset videoSize:CGSizeZero]; self.shortVideoEditor.delegate = self; self.shortVideoEditor.loopEnabled = YES; [self.view addSubview:self.shortVideoEditor.preview]; [self.shortVideoEditor startEditing];

3.2 添加背景音乐

添加背景音乐

[self.shortVideoEditor addMusic:musicURL timeRange:timeRange volume:1.0];

调节背景音乐音量

[self.shortVideoEditor updateMusic:timeRange volume:0.5];

3.3 添加文字特效

添加文字的逻辑和添加贴纸使用的是同一个逻辑,用户可以使用七牛短视频 Demo 中已经包装好的添加文字、贴纸的类 PLSStickerView:

PLSStickerView *stickerView = [[PLSStickerView alloc] initWithFrame:CGRectMake(0, 0, 200, 50)]; // 以字典的形式,保存 stickerView 信息 NSMutableDictionary *stickerSettings = [[NSMutableDictionary alloc] init]; stickerSettings[PLSStickerKey] = stickerView; stickerSettings[PLSSizeKey] = [NSValue valueWithCGSize:viewSize]; stickerSettings[PLSPointKey] = [NSValue valueWithCGPoint:viewPoint]; CGFloat rotation = atan2f(transform.b, transform.a); rotation = rotation * (180 / M_PI); stickerSettings[PLSRotationKey] = [NSNumber numberWithFloat:rotation]; [self.stickerSettingsArray addObject:stickerSettings];

3.4 添加抖音特效

七牛短视频 SDK 没有集成特效,但是和人脸贴纸一样,可以轻松的接入第三方的特效。下面我们还以添加 涂图 的特效为例,演示特效的添加方式

首先,初始化特效添加器:

self.filterProcessor = [[TuSDKFilterProcessor alloc] initWithFormatType:kCVPixelFormatType_32BGRA isOriginalOrientation:isOriginalOrientation]; self.filterProcessor.delegate = self; self.filterProcessor.mediaEffectDelegate = self; // 默认关闭动态贴纸功能,即关闭人脸识别功能 self.filterProcessor.enableLiveSticker = NO;

添加灵魂出窍特效:

TuSDKMediaSceneEffectData *effectData = [[TuSDKMediaSceneEffectData alloc] initWithEffectsCode:@\”LiveSoulOut01\”];effectData.atTimeRange = [TuSDKTimeRange makeTimeRangeWithStart:kCMTimeZero end:CMTimeMake(INTMAX_MAX, 1)];[self.filterProcessor addMediaEffect:effectData];

应用特效。在短视频编辑视频数据回调里面,将特效应用,以便预览特效效果:

– (CVPixelBufferRef)shortVideoEditor:(PLShortVideoEditor *)editor didGetOriginPixelBuffer:(CVPixelBufferRef)pixelBuffer timestamp:(CMTime)timestamp { // 应用特效 pixelBuffer = [self.filterProcessor syncProcessPixelBuffer:pixelBuffer frameTime:timestamp]; [self.filterProcessor destroyFrameData]; return pixelBuffer; }

视频导出

上面我们的短视频编辑就完成了,现在我们将编辑的视频使用 PLSAVAssetExportSession

导出来保存到本地相册

初始化视频导出器:

NSMutableDictionary *outputSettings = [[NSMutableDictionary alloc] init]; NSMutableDictionary *movieSettings = [[NSMutableDictionary alloc] init]; NSMutableDictionary *backgroundAudioSettings = [NSMutableDictionary alloc] init]; NSMutableArray *stickerSettingsArray = [[NSMutableArray alloc] init]; NSMutableArray *audioSettingsArray = [[NSMutableArray alloc] init]; // 将导出信息设置到 outputSettings 中 // do setting… AVAsset *asset = movieSettings[PLSAssetKey]; PLSAVAssetExportSession *exportSession = [[PLSAVAssetExportSession alloc] initWithAsset:asset]; exportSession.outputFileType = PLSFileTypeMPEG4; exportSession.shouldOptimizeForNetworkUse = YES; exportSession.outputSettings = self.outputSettings; exportSession.delegate = self; exportSession.isExportMovieToPhotosAlbum = YES;

设置导出视频相关 block:

__weak typeof(self) weakSelf = self; [exportSession setCompletionBlock:^(NSURL *url) { NSLog(@\”视频已保存到相册中\”); }]; [exportSession setFailureBlock:^(NSError *error) { NSLog(@\”导出视频失败\”); }]; [exportSession setProcessingBlock:^(float progress) { NSLog(@\”视频导出完成百分比: %f\”, process); }];

实现 PLSAVAssetExportSessionDelegate 的视频数据回调方法,进行特效处理:

– (CVPixelBufferRef)assetExportSession:(PLSAVAssetExportSession *)assetExportSession didOutputPixelBuffer:(CVPixelBufferRef)pixelBuffer timestamp:(CMTime)timestamp { // 特效处理 pixelBuffer = [self.filterProcessor syncProcessPixelBuffer:pixelBuffer frameTime:timestamp]; [self.filterProcessor destroyFrameData]; return pixelBuffer; }

总结

以上操作就是使用七牛短视频 SDK 快速完成一个类似抖音短视频应用的介绍。七牛云短视频还提供了很多功能点,如:

录制阶段

实时滤镜、实时美颜、自动横竖屏控制、AR 特效拍摄、分段倍速拍摄、素材视频合拍、录屏功能、View 录制、贴纸功能、背景音乐、大眼/瘦脸

编辑阶段

实时水印、视频拼接、时光倒流、分段特效、MV 特效、贴纸功能、大眼/瘦脸、多视频合并、视频切割、多音效、倍速处理、视频旋转、配音

这些功能的具体使用在这就不多加描述,了解详情可至七牛云短视频 SDK 文档查看。

短视频虽说可以一天开发快速上线,但是在实际过程中,还是会有很多坑的,最通用的点即为兼容性和性能:

• 兼容性:现在手机类型众多,尤其是 Android 端,机型多、Android 系统各版本间存在差异,且不同厂家对 Android 原生系统做了或多或少的修改,某些功能点在少数手机上变得不再可用。因此开发过程中需要多测试不同机型和不同版本的系统,避免产品上线之后少数用户抱怨功能点不好用、用不了甚至是 crash 等严重问题。

• 性能:由于 4G 网络的普及,用户对视频的清晰度要求越来越高,这要求视频需要较高的分辨率。移动终端处理能力有限,而处理高分辨的视频,是很耗内存和 CPU 的,尤其是一些低端手机配置很低,在短视频录制或者编辑阶段添加滤镜、MV 特效等处理中很容易出现丢帧或者保存出来的视频画面模糊。因此对视频帧的缩放、剪裁、加滤镜、加 MV 等处理尽量使用 GPU 来做,这些要求对 OpenGL 有较深的认识。

2019年短视频的风越刮越猛,但形式不仅仅局限于泛娱乐平台,越来越多的综合平台将嵌入短视频,提高用户活跃率和应用打开率,从而搭建平台内的垂直短视频,迎来短视频 2.0 时代。开发者们可基于以上实践实现拍摄、编辑功能,帮助短视频产品快速上线。

更多抖音项目实战问题,关注 转发 评论私信 抖音 即可获取相应项目实战视频集锦。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2023年3月27日 上午8:41
下一篇 2023年3月27日 上午8:51

相关推荐

  • 湖州玩具检测科研项目

    湖州玩具检测科研项目 近年来,随着儿童玩具市场的不断扩大,玩具安全问题也日益受到关注。湖州市作为浙江省的一个重要城市,玩具市场更是备受关注。为了保障儿童的合法权益,湖州市开展了一系…

    科研百科 2025年2月1日
    0
  • 八核64位处理器 全新英菲克i8盒子评测

    如今智能电视新品层出不穷,特别是互联网电视价格不断走低,不过要想体验智能还有性价比更高的方案,购买一款价格2-300百元的盒子就可以让电视变得智能。英菲克在网络机顶盒耕耘多年,去年…

    科研百科 2022年7月28日
    755
  • 确定科研项目是否可行

    确定科研项目是否可行为是研究科学领域的重要问题之一。在确定科研项目是否可行为时,我们需要考虑许多因素,包括项目的可行性、时间表、预算、技术和资源限制等。在本文中,我们将探讨确定科研…

    科研百科 2025年3月14日
    1
  • 金螳螂项目管理指挥系统

    金螳螂项目管理指挥系统:提升项目管理效率的神器 金螳螂项目管理指挥系统是一款功能强大的项目管理工具,它可以帮助项目经理和团队成员高效地组织和管理项目活动。通过使用金螳螂项目管理指挥…

    科研百科 2025年1月22日
    2
  • 发表还是不发表?两篇科研论文的传奇故事(发表还是不发表-两篇科研论文的传奇故事)

    荷兰和美国的两个科研小组,通过修改禽流感H5N1病毒基因,在实验室研制出了可通过空气传播的H5N1病毒变异体。 在相关研究论文的发表问题上,美国官方机构、世界卫生组织和科学家们,有…

    科研百科 2024年4月15日
    117
  • 新材料研发项目管理系统

    新材料研发项目管理系统 随着科技的不断发展,新材料研发已经成为了一个日益重要的领域。新材料具有许多独特的性质和特点,因此,新材料的研发对于人类社会的发展具有重要的意义。但是,新材料…

    科研百科 2025年1月12日
    0
  • 经开区项目信息管理系统

    经开区项目信息管理系统 随着企业竞争的加剧,企业需要不断地提高管理水平,以应对日益激烈的市场竞争。经开区作为一个经济发展较快的地区,也意识到了这个问题,并建立起了项目信息管理系统,…

    科研百科 2025年1月28日
    0
  • crm管理系统crm管理软件

    crm管理系统 CRM管理软件: 企业成功的关键因素 随着现代企业的竞争日益激烈,企业需要不断地提高生产力和效率, CRM管理系统 CRM管理软件是实现这一目标的关键。本文将探讨C…

    科研百科 2024年8月21日
    35
  • 常见的七种小程序推广方法指南(常见的七种小程序推广方法指南有哪些)

    万事开头难。对于商家来说,小程序运营过程中最难的就是微信小程序推广和拉新,这也是小程序运营过程中至关重要的一环。所以今天就来说说常见的推广新方法的小程序。 社群分享:社交关系带来用…

    科研百科 2023年4月7日
    325
  • 三里乡“厕所革命”:从脏乱差到净亮美(三里乡在哪里)

    建始网讯(通讯员 曾雅倩)厕所不堪入目、难以下脚,也许只是生活中尴尬的瞬间,让那些看起来是个别的、轻微的,但影响核心价值的“小短板”,如果不被重视,便很容易给国家形象带来负面影响,…

    科研百科 2023年10月12日
    171