美文网首页Android音视频系列
原来FFmpeg这么有意思

原来FFmpeg这么有意思

作者: cuieney | 来源:发表于2019-03-03 20:07 被阅读91次

    前言

    其实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真的很牛逼。接下来我会教大家自己怎么实现这个功能。那么来看看做出来的视频如何,某音好像没有这个功能哦,

    app.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这么有意思

        本文链接:https://www.haomeiwen.com/subject/jrpmuqtx.html