短视频编辑 可实时交互的播放器(短视频api)

2023-03-06 12:16:37 密语知识 思思

如何开发一个类似剪影或抖音的视频剪辑工具?

其开发任务如上图,一个短视频生产app的首要任务在于实现一个高度可实时交互的播放器,在播放预览时支持多种编辑能力。

最初我们调研了多种方案,乍一看Android原生播放器肯定不够用,估计要在众多c++的开源播放器中寻找参考方案,最好自己实现一个播放器,高度灵活高度可控。然而我们发现exo这个男团播放器的厉害之处,虽然这个播放器如此常用,但是我们不知道其潜力值爆表,可以拓展得如此强大。

事实上直到现在,我们仍然在自研视频剪辑工具中使用exoplayer做编辑预览。为什么选择exoplayer,基于以下几点原因(一句话,性价比高):

使用基于exoplayer播放器进行二次开发,快速高效实现视频剪辑功能。视频剪辑播放器用于视频编辑过程中的实时预览播放,支持有功能有:

针对上述视频剪辑所需要支持的功能,逐一对照explayer的api文档,寻找拓展实现的方法。

其中,视频旋转、文字贴纸、美颜滤镜、素材转场需要调用setVideoSurface控制视频呈现层,自定义GLSurfaceView,使用opengl实现对视频的旋转、美颜滤镜、添加贴纸。exoplayer播放输出的surface与自定义GLSurfaceView的渲染纹理相绑定。

视频裁剪播放使用ClippingMediaSource设置裁剪素材,按api文档传入起始时间和结束时间。

多个视频拼接播放,使用ConcatenatingMediaSource可以用来无缝地合并播放多个素材,为了能对单个素材进行编辑,isAtomic设为true。

变速使用setPlaybackParameters设置速度参数

这三个功能使用exoplayer已提供的api就可以实现,相对容易。在执行编辑操作后即时更新播放器素材和参数即可。在我们的产品中,有一个撤销操作的交互,所以需要保留一份数据拷贝,如果用户撤销操作则更新为原来的数据。

exoplayer本身不支持图片格式的素材播放。注入一个自定义渲染器来实现图片(格式为jpg、png、gif等)

其中ImageRender继承BaseRenderer,实现了图片的自定义渲染。render主要工作是将每帧数据解码流渲染为屏幕图像。对于图片来说,我们定义ImageMediaSourceImage、SampleStreamImpl和ImageMediaPeriod,分别继承于BaseMediaSource、SampleStream和MediaPeriod,从原素材解析并传送每帧图片数据。图片不需要真正的解码,实现SampleStream的readData方法读取图片uri为解码buffer。

实现图片播放的核心在于实现render接口:

在这个方法内,我们创建opengl环境,将bitmap绘制到屏幕上

添加的文字或贴纸支持移动、旋转、缩放和设置时间轴。对于多个文字贴纸,我们最终包装为一个与渲染屏幕同尺寸的bitmap,在这个bitmap的画布上绘制一系列带坐标大小、起止时间的小bitmap(即stickerItem.getBitmap)。

将这张贴纸画布bitmap与原视频帧像素混合就实现了所有文字贴纸的绘制。用opengl绘制贴纸,就是对屏幕上像素做一个水印滤镜的运算。采用GLSL内建的mix函数做两个纹理的混合,以下是水印滤镜所用的片元着色器。

和文字贴纸一样,要实现实时的美颜滤镜效果,必须使用帧缓冲fbo。帧缓冲的每一存储单元对应着屏幕每一个像素。而美颜滤镜涉及较复杂算法,由部门内的人工智能组提供sdk接入,在绘制过程中调用sdk方法如下,就是使用fbo进行一次图像纹理转换。传入参数为屏幕方向、摄像头方向和渲染尺寸。

目前产品实现了左右移、上下移、拉近拉远、顺时针逆时针旋转等几种转场效果。转场的实现方法是:对于两个在其中添加了转场的素材,在上一个素材的最后1000ms绘制转场滤镜,转场滤镜即将两张图片的像素以一定的规律进行渲染,转场算法由opengl使用glsl着色器实现。转场基类的片元着色器如下,移动转场(左右向移动和上下移动)、缩放转场(拉近拉远)、旋转转场对getFromColor与getToColor执行的行为不同。

以移动转场的转场glsl着色器为例

转场的具体实现参考了GPUImageFilter库,和美颜滤镜以及文字贴纸不同的是,转场滤镜需要在渲染前预先设置将下个素材的首帧图。

在预览编辑过程中,由于音乐并不需要真正合成于视频中,因此可以使用另一个播放器单独播放音频,我们采用android更原始的MediaPlayer单独播放音乐,单独支持音乐的裁剪播放和seek。

抽帧预览即每隔固定时间取视频的一帧图片构成时间轴,我们使用ffmpegMediaMetadataRetriever库进行抽帧 ,使用方法为

该库内部使用ffmpeg进行解码取帧,接口易用但是其软件解码方式效率过低,相对较慢。因为exoplayer播放器是默认使用硬件解码的,可以采用另一个exoplayer播放器快速播放一次素材,然后每隔一段时间获取屏幕图像,但此种方法开销过大,两个exoplayer播放器不利于管理。

最后,我们发现常用的图片加载库glide也能进行视频抽帧,使用更为简单方便,其内部采用mediaMetadataRetriever进行抽帧。

1.调整素材,拼接、裁剪、变速

2.转场、文字贴纸、美颜滤镜

Flutter开源app---开眼短视频

在玩安卓上有款组件化开源app的项目,一款模仿 Eyepetizer | 开眼视频的 开源app,这款app设计风格特别喜欢的,比较简洁,美观,然后最近又在学flutter的知识,于是就写了一款flutter版本的开源短视频,效果也是听不错的,废话不多说,先上效果图。

先附上项目地址:

项目api会在后面的参考链接里,或者直接项目内查看。

项目地址:

更新:6/30 项目新增下拉刷新,上拉加载功能

kotlin版本开眼短视频开发中,敬请期待...

总结:在此感谢参考的伙伴的文章,写的也很好,然后我将这个项目改写成了flutter,当中也学习到了很多flutter相关的知识,后续还有继续巩固,不断学习。

参考链接(包含本项目的api)

视频第三方sdk哪个比较好用?

SDK的中文名叫“软件开发工具包”(本文中将之简称为软件包或软件开发包),它被开发出来是为了减少程序员工作量的,有公司开发出某种软件的某一功能,把它封装成SDK(比如美颜SDK就是能够实现美颜功能的SDK),出售给其他公司做开发用,其他公司如果想要给软件开发出某种功能,但又不想从头开始搞开发,可以付钱省事。

说到API和SDK,很多朋友容易把他们弄混,所以我们在这里把它们放在一起说:

1、 仔细的解释

你可以把SDK想象成一个虚拟的程序包,在这个程序包中有一份做好的软件功能,这份程序包几乎是全封闭的,只有一个小小接口可以联通外界,这个接口就是API。

如果我们现在短视频中增加某个功能(比如美颜、萌颜、云存储)但又不想自己亲手去做这个功能,我们可以选择使用这个“SDK”软件包,我们把我们的程序连接上API接口,就可以使用SDK软件包里的功能了。

2、 简洁的解释

重新梳理一下就是:

SDK=放着你想要的软件功能的软件包

API=SDK上唯一的接口

如果你想在自己的短视频app上开发一些SDK软件包中已有的功能,你可以把自己的短视频软件与SDK包上的API接口连接起来,以获得开发包中的功能。

3、 形象的解释

有一杯饮料,它的名字叫做“SDK”。饮料上插着吸管,吸管的名字叫“API”。我们把你的嘴唇叫做“短视频软件”如果你想让SDK饮料杯里的饮料进到你嘴里(让软件拥有SDK中的功能),你必须通过API这根吸管来实现(通过API连接你的软件和SDK软件开发包),否则你就喝不到饮料。

SDK可以分为系统SDK和应用SDK.所谓的系统SDK是为特定的软件包,软件框架,硬件平台,操作系统等应用时所使用的开发工具集合.而应用SDK则是基于系统SDK开发的独立于具体业务而具有特定功能的集合。

内容准确完整,一个优秀的SDK开发人员在编写文档前会做充分的接口场景调用验证,已保证内容的准确和完整。

易读易用,SDK开发人员作为文档的第一个读者和使用者,在使用文档过程中应该有意识的降低自己的姿态,时常假想一个很low的开发者在阅读自己文档时候的样子,通过积极阅读和不断改进确保一个不是很擅长编程的开发者也能使用我们的SDK。

精简文档,一个优秀的SDK开发人员会通过减少重复、避免冗余、整洁代码等措施来精简文档的内容,同时这也减少了文档的维护成本。

更新日志,文档

描述清楚相对上个版本的所有变更(优化项酌情考虑是否添加)。

SDK开发中,需要尽量避免依赖第三方库,使用通用的Android SDK自带的官方库能满足需求即可,以免引起不必要的冲突。

或者三方库不要放到lib包下,默认打包进去封装过程中的aar二次打包问题;

比如,不要为了一个简单的JSON数据转换就引入Fastjson 、Gson之类的第三方json解析转换库。

如果确实因为项目需要,要引入一些开源库,可以通过源码集成的形式引入,再更改一下包名,避免集成冲突。

奶茶视频下载汅api在哪里下载

奶茶视频下载汅api在网页上下载。具体方法如下:

1、首先打开浏览器,搜索“奶茶视频下载汅api”;

2、其次,选择“奶茶视频下载汅api”的版本;

3、最后点击下载即可。《奶茶视频下载汅api》免费是一款深受喜爱的短视频播放平台。不管用户想看什么类型的短视频内容,这里都可以快速找到。

「开源」专业的免费视频管理系统,适合做短视频垂直细分内容平台

呆错短视频系统是一款专业的免费视频管理系统,适合做短视频垂直细分内容平台。

使用Apache-2.0开源协议

呆错短视频系统(DaiCuoVideo)是一款专业的免费视频管理系统,适合做短视频垂直细分内容平台。

内核安全稳定、PHP+MYSQL/SQLITE架构、跨平台运行。ThinkPhp+Jquery+BootStrap组合、超强负载能力助您轻松运营百万级站点。

呆错短视频系统一套模板自适应电脑、手机、平板多个终端入口,完美适配微信、百度等多种APP浏览器,也可以独立设置移动端与电脑端模板分离。

开源免费无加密

呆错短视频系统无需授权即可商业使用,代码全部开源免费且无任何加密。

系统安全稳定

ThinkPhp+Jquery+BootStrap组合、超强负载能力助您轻松运营百万级站点。

响应式设计

自适应电脑、手机、平板多个终端入口,也可以独立设置移动端与电脑端模板分离。

视频模块

可上传横屏、竖屏短视频或引用第三方视频站链接

分类模块

无限级分类、多层级分类结构、支持独立设置

标签模块

按标签关键字聚合、常用于专题、自定义归类

解析模块

后台一键切换视频解析接口,轻松去除视频水印

聚合模块

规避版权风险,引导用户至第三方视频网站播放

SEO模块

每个页面支持单独设置标题、关键字、描述信息

SiteMap模块

网站地图sitemap在线生成,手动提交搜索引擎

采集模块

内置API资源站采集,可快速接入细分行业数据

API模块

内置资源站分享接口,可通过授权方式变现

搜索模块

内置防假墙搜索功能,过滤频繁恶意请求

统计模块

实时人气值数据统计,网站流量心中有数

字段模块

支持自定义扩展字段以解决不同行业需求

呆错短视频系统 内容模型 所使用到的数据库初始基础字段与扩展字段列表与说明如下。

info开头的为基础字段,video开头的为扩展字段、后台自定义的字段可以与此一起结合使用。

通常在模板开发时需要使用到这些字段、可用于foreach循环标签内,也可以用于详情页标签。

访问一飞开源:

android音视频开发一安卓常用API

Android SDK 提供了两套音频采集的API,分别是:MediaRecorder 和 AudioRecord,前者是一个更加上层一点的API,它可以直接把手机麦克风录入的音频数据进行编码压缩(如AMR、MP3等)并存成文件,而后者则更接近底层,能够更加自由灵活地控制,可以得到原始的一帧帧PCM音频数据。如果想简单地做一个录音机,录制成音频文件,则推荐使用 MediaRecorder,而如果需要对音频做进一步的算法处理、或者采用第三方的编码库进行压缩、以及网络传输等应用,则建议使用 AudioRecord,其实 MediaRecorder 底层也是调用了 AudioRecord 与 Android Framework 层的 AudioFlinger 进行交互的。直播中实时采集音频自然是要用AudioRecord了。

2.1 播放声音可以用MediaPlayer和AudioTrack,两者都提供了Java API供应用开发者使用。虽然都可以播放声音,但两者还是有很大的区别的。

2.2 其中最大的区别是MediaPlayer可以播放多种格式的声音文件,例如MP3,AAC,WAV,OGG,MIDI等。MediaPlayer会在framework层创建对应的音频解码器。而AudioTrack只能播放已经解码的PCM流,如果对比支持的文件格式的话则是AudioTrack只支持wav格式的音频文件,因为wav格式的音频文件大部分都是PCM流。AudioTrack不创建解码器,所以只能播放不需要解码的wav文件。

2.3 MediaPlayer在framework层还是会创建AudioTrack,把解码后的PCM数流传递给AudioTrack,AudioTrack再传递给AudioFlinger进行混音,然后才传递给硬件播放,所以是MediaPlayer包含了AudioTrack。

2.4 在接触Android音频播放API的时候,发现SoundPool也可以用于播放音频。下面是三者的使用场景:MediaPlayer 更加适合在后台长时间播放本地音乐文件或者在线的流式资源; SoundPool 则适合播放比较短的音频片段,比如游戏声音、按键声、铃声片段等等,它可以同时播放多个音频; 而 AudioTrack 则更接近底层,提供了非常强大的控制能力,支持低延迟播放,适合流媒体和VoIP语音电话等场景。

使用 Camera API 采集视频数据并保存到文件,分别使用 SurfaceView、TextureView 来预览 Camera 数据,取到 NV21 的数据回调。

4.1 一个音视频文件是由音频和视频组成的,我们可以通过MediaExtractor、MediaMuxer把音频或视频给单独抽取出来,抽取出来的音频和视频能单独播放; 

4.2 MediaMuxer的作用是生成音频或视频文件;还可以把音频与视频混合成一个音视频文件。

文献资料