原来FFmpeg这么有意思(一)

18,766 阅读6分钟

前言

其实FFmpeg大家都耳熟能详的的一个东西了,知名的ijkplayer 就是有Bilibili开源出来的播放器也是基于FFmpeg做出来的。但是FFmpeg不仅仅止于音视频的播放裁剪功能,还能干些更有趣的事情,就比如说视频的画面拼接,对于一个Android开发者来说,一想到FFmpeg c/c++是跑不掉的。下载官方库,然后编译成不同平台的so,然后在通过jni集成到项目中,这一个开头就难倒了不少开发者。一个问题是如何编译出这个so。如何把编译好的文件集成到项目中。这个我之后的文章会详细说明,这里我只和大家说说有趣在哪里。

说到这里,不得不说,现在各个大厂都在做统一前端的开发语言和框架,搞得开发者TMD头都大,其实不还是做得都是一些UI页面,通过不同的方式渲染,如果真的要做一些定制化的功能,还是离开不了原生。

Android FFmpeg视频画面拼接

通过标题大家可能还是不太明白啥意思,我就上几张我做的这个App的截图吧,顺便放几张动态图,可能大家能知道个大概功能。其实大家看了之后,可能感觉感觉市面上已经有做到了这种效果的App了,但是作为一个Android攻城狮,必须要知道他是怎么做出来的,在ios上做这种效果很容易,有原生的Api提供,但是苦逼的Android 那只能通过C/C++来实现,原生搞的话很难。

这个App大概有以下功能(目前并未开源,项目地址

  • 视频画面拼接(主要的)
  • 视频宽高裁剪
  • 视频时长裁剪
  • 添加视频边框及修改边框颜色
  • 添加视频封面
  • 添加视频背景图片
  • 添加视频水印
  • 添加背景音乐

下面是App做出来的两个视频转gif的图片

threemegerone.gif

onebyone.gif

想看视频的 话点击下面的链接即可 三合一视频 二合一视频

这个app已有下面的页面,不过现在还没有开源,还有很多地方要改。功能是实现了。但是页面还有很多优化的地方,所以啊 FFmpeg真的很牛逼。接下来我会教大家自己怎么实现这个功能。那么来看看做出来的视频如何,某音好像没有这个功能哦,

first.png

second.png

third.png

four.png

如何实现这种效果

这一期,我只是教大家如何通过shell 命令实现一个视频画面拼接。首先从最基础的功能来实现吧。然后在根据当前的功能进行扩展。至于FFmpeg库的编译,一时半会儿也说不完。参数配置也很麻烦,尤其是不同的平台坑很多。这里我就以最简单的方式交大家如何实现吧

第一步

既然要做功能,第一步当然是找相应的工具了,我们可以通过FFmpeg官网找到,对应自己平台的静态库,大家别下错了哈,static binary不要下载错了,下载成源文件了。因为官方已经给我们编译好了静态库,可以直接通过shell 脚本就可以简单的走起来。

FFmpeg官方网站库

打开链接,我这边选中的是mac os 可以看到底下提供了 static 库。我们可以直接下载下来就行了。Ubuntu 和windows 都是一样的 都有现成的库。可以下载下来。

ffmpeg static.png

下载下来就是一个这个东西。我这边大概71M。还挺大的,因为里面官方给我们把大部分基本的功能都给编译进去了。所以这么大,但是如果我们自己编译的话,会小很多。可以吧一下不需要的东西直接disable 屏幕快照 2019-03-03 下午6.39.38.png

第二步

那当然是打开我们的terminal,windows 直接win+R 然后cmd就ok,然后cd 到我们下载的ffmpeg静态库的文件路径,执行一下命令,不出意外的话,这时候你应该可以看到以下页面

./ffmpeg

如果出现一下内容,说明这时候你的ffmpeg 已经ok了

屏幕快照 2019-03-03 下午6.48.23.png

如果说权限不足的话 ,cd到你的静态库路径下执行这个就可以了。加个sudo,然后在change mode 一下 赋予777权限

chmod +x  ffmpeg
chmod 777 ffmpeg

这时候ffmpeg环境已经准备好了。接下来万事俱备只欠东风了。

第三步

视频拼接,那么如何视频拼接呢,不用担心 ffmpeg 已经给我们做好了相应的封装了。只要了解相应的命令就可以完成了最基础的视频拼接功能了。其实ffmpeg不仅仅如此啊,他的功能太强大了。

先简单的来几个命令看看,查看视频文件信息

./ffmpeg -i input.mp4

这时候我们可以看到视频的具体信息fps,宽高啊,视频质量啊,等等很多信息

屏幕快照 2019-03-03 下午7.05.36.png

-i 的指令就是入参的,接下来我们直接看如何通过命令把一个视频合在一起,就比如上面两个视频合在一起的小姐姐,我们通过电脑简单的来合成一下。

./ffmpeg -i input2.mp4  -i input2.mp4  -filter_complex [0][1]vstack -y output.mp4 

成功的话应该是以下页面

屏幕快照 2019-03-03 下午7.06.08.png

这一个MP4文件是同级目录下的文件,大家可以换成自己的文件名就可以,至于filter_complex吗?我这边就大白话讲了,就相当于我们java 中的函数一样,你把输入给他 在这个方法体内,把相应的输出给你。 vstack 可以官网看到这样的介绍 Stack input videos vertically.就是垂直拼接视频的意思,同理如何想水平的话,只要把vstack 改成hstack就可以了,老铁们是不是很简单,很给力,

最主要的是自己通过命令行就可以完成一些视频的基本操作,什么ps,Photoshop,我命令行就ok了。哈哈哈哈哈哈哈哈

刚刚作出来的视频效果,截图给大家看看

vstack.png

说好的小姐姐呢,tmd 这是什么鬼很可怕,博主换了个视频 哈哈哈,但是这个效果的话产品看到会骂死人的,接下来的文章将会给大家讲解如何优化视频效果。

Ending

希望给老铁们带来的是知识的储备而不是时间的浪费。这一期就说到这里,最简单的方式实现视频画面的拼接,下一期将会给大家带来更多的内容。大家也可以在留言里说说更想了解哪一方面的内容。我会根据大家的意见来写,

原来FFmpeg这么有意思 (二)