美文网首页android应用框架Android开源项目视频
仿微信视频拍摄UI, 基于ffmpeg的视频录制编辑(上)

仿微信视频拍摄UI, 基于ffmpeg的视频录制编辑(上)

作者: Zhaoss | 来源:发表于2017-03-01 12:37 被阅读8041次

    源码和apk下载,如果喜欢点一下star啦

    这是下篇, 新增了分段拍摄, 视频加速和视频裁剪:

     仿微信视频拍摄UI, 基于ffmpeg的视频录制编辑(下)

    本项目所使用的so库是VCamera,个人免费, 禁止商用,只用作demo演示

    因为最近项目做了关于视频拍摄和视频处理的需求, 所以特来分享一下, 做了一个基于微信录制,  分析ffmpeg视频编辑的demo, 首先看下使用效果:

    功能主要包含5点: 

    1.基于ffmpeg的视频拍摄及合成;

    2.自定义拍摄按钮, 长按放大并且显示拍摄进度;

    3.自定义view, 实现手绘涂鸦;

    4.自定义可触摸旋转缩放位移的表情文字view;

    5.基于ffmpeg的图片和视频合成处理.

    界面风格高仿微信, 只不过微信的编辑处理是作用于图片, 而我们的是基于视频, 所以如果你有需求, 把视频编辑处理换成图片编辑, 更是简单.

    1.实现使用ffmpeg录制视频

    首先导入lib库和ffmpeg的录制java文件, 我使用的是第三方VCamera封装的ffmpeg, 他没有jar包, 所以需要将con.yixia包下的所有文件都copy过来:

    请注意! com.yixia的包名也要完整的copy过来, 要不然找不到so库, 会崩溃!

    然后在application里面初始化VCamera:

    这个时候, 你就可以在SurfaceView上看见拍摄预览界面了, 

    然后mMediaRecorder.startRecord()拍摄视频, 

    调用mMediaRecorder.stopRecord()停止录制视频, 

    因为拍摄出来的文件是ts视频流, 所以还要调用mMediaRecorder.startEncoding()开始合成MP4视频文件.

    MediaRecorderBase类还可以设置视频各个参数, 如:

    2.自定义拍摄按钮, 长按放大并且显示拍摄进度


    自定义RecordedButton继承View, 在onDraw里分三部分绘制:

    在拍摄模式下, 改变radius(半径), 达到放大或者缩小外圈和内圈圆的效果, 不断增加girth值达到显示拍摄进度的效果, 是不是很简单.

    3.自定义view, 实现手绘涂鸦


    自定义TuyaView继承View, 重写onTouch(), 在手指点下和移动时实时绘制触摸轨迹:

    在手指按下时创建new Path()对象, 记录本次手指触摸移动轨迹, 并且实时调用invalidate() 达到不断调用onDraw()的目的, 然后使用canvas.drawPath(path,paint)绘制触摸路径, 是不是非常简单.

    4.自定义可触摸旋转缩放位移的表情文字view


    这个view稍微有点麻烦, 但我单独写了一篇文章(点我跳转), 非常详细的讲解了这个view, 而且封装的非常好, 只要addView到布局中就可以使用了, 大家可以点击链接过去看一下.

    5.基于ffmpeg的图片和视频合成处理


    这也是demo的最后一步, 将涂鸦,和表情文字全部合成到视频当中, 首先是得到需要合成的图片, 我们可以通过view.draw(Canvas canvas),得到布局的bitmap:

    然后通过ffmpeg来执行图片和视频的合成, 具体语句是这样的:

    ffmpeg -i videoPath -i imagePath -filter_complex overlay=0:0 -vcodec libx264 -profile:v baseline -preset ultrafast -b:v 3000k -g 25 -f mp4 outPath

    我把参数讲解一下: videoPath代表你要编辑视频的路径

    imagePath代表你要合成的图片路径

    outPath是合成之后的输出视频路径

    这些是我们需要替换的参数至于一些别的, 例如:

    overlay=0:0表示图片坐标位置, 0:0表示x轴=0,y轴=0

    -vcodec后面表示视频输出格式, 3000k码率, 25帧数, 总之ffmpeg的参数还有很多, 如果感兴趣可以去ffmpeg官网看命令大全.

    向UtilityAdapter.FFmpegRun()里传入ffmpeg语句就可以执行了, 返回值 int , 如果等于0就是成功, 非0则是失败, FFmpegRun()方法的第一参数如果传入空字符串就是异步执行视频处理, 否则就是同步执行, 这点要注意.

    最后求一下关注, 源码下载,求点star(ps: 如果我分享的技术对您有所帮助, 或者解决了您的一些问题, 请点一下我喜欢和github上的star哦!!!github主页我会经常在上面分享我工作中遇到的问题和酷炫的特效实现的, 关注一下啦)

    相关文章

      网友评论

      • Honest2021:博主,用您这个拍照,有时候处理图片,会出现黑屏情况,您有遇到过吗?
      • 天下第九九八十一:我:楼主,你github删我评论也就算了,咋还骂我呢?
        下面,你有两条支线可以走:
        一(默默删评论)
        二(谩骂,再次删评论)
        支线二可能性大一点。
        谩骂极有可能是这样——
        "呵呵,骂的就是你,XXX(以及各种暴露楼主母猪家教的粗俗词汇)
        ……
        6bc17f5482a8:@Zhaoss 表示clone下来运行完全没问题,简单的项目使用绝对没问题,不知道他的issue为啥说运行不起来,我简单的修改了下,拍摄完不编辑直接返回路径也是没问题的
        Zhaoss:删你评论是因为不想和你多做纠缠 和你这种人犯不着BB 你还没完了 https://github.com/agxxxx/AIDLMusicPlayer/issues/2 看你提的lssues 也是个喷子一个 大过年的 祝你家人身体健康?
        Zhaoss:第一 我什么时候骂你了呢? 我说看你这种人 恶心也算骂你? 表达一下自己想法不行?
        第二 我用VCamera的开源库 我也在README里面黑体加粗注明了 也在简书注明了 按照开源协议 我的代码也开源了 我违反了那条? 什么叫假开源?
        第三 我删你评论时不行和你这种脑子都不长的人BB, 我花时间写的项目 也没有任何商业收费 免费拿出来给大家用 有那么多star 证明也帮助了不少人, 但最后还要被你这种人BB 是真的影响心情,
      • android_yiluo:"/data/app/com.dome-2/lib/arm/libutility.so" is too small to be an ELF executable: only found 0 bytes 我这出现这个问题了楼主
        android_yiluo:楼主我着有点问题,能加我qq聊聊吗938361820
      • czc1001:拍摄时间超过1分半后,demo会崩溃,报:E/BufferQueueProducer: [SurfaceView](this:0x7fa57ba000,id:57934,api:4,p:296,c:-1) cancelBuffer: BufferQueue has been abandoned。这个怎么解决呢
      • RamboMing:大神,你好,压缩本地视频,如何获取处理进度?
      • 青宁呀:为什么没有剪切时长功能?github上面的图是假的?
        Zhaoss:@Alan青宁 WeiXinRecordedDemo/WeiXinRecorded/app/src/main/java/com/example/zhaoshuang/weixinrecordeddemo/CutTimeActivity.java 在gifhub上都能看到activity文件 为什么你就找不到呢
        青宁呀:@Zhaoss 我说的是剪切时长
        Zhaoss:为什么别人找到了 一共2个文件夹 都看下不行吗 而且这是上篇 还有下篇呢
      • 62de48dd0dc0:大佬,这个东西真心不错,点个赞,我有这样试过,我直接在编辑界面传我本地视频文件的url地址,然后添加涂鸦,表情,然后就是一直卡在视频编译中了。。求解啊
        Zhaoss:@你的他而不是她的他 肯定要根据视频尺寸动态算宽高 拼接ffmpeg语句的
        62de48dd0dc0:而且,直接传入本地视频文件,视频变形啊
      • 小宏why:楼主大神,请问我想获取到视频编辑或者压缩的进度,该怎么做???
      • 一骑绝尘Louisk:你好,由于64位so库缺失,在vivo X9等手机上直接崩溃。。。。。。 求arm64位的libutility.so
      • BertSir:老哥 找到了一个更好解决前置摄像头倒置的方法 在startRecord里把transpose的值改正后置的时候为1前置的时候为2就OK了,就不用在合成完之后再处理视频了,效率更高
        Zhaoss:@BertSir 厉害了 谢谢你
      • 楚门的世界3181:7.0的手机上出现Detected problems with app native libraries的问题,第一次拍的时候,会弹这个,这个,怎么解决呢?
      • 风影_638f:好文章
      • 2c8bb55d14dc:请问大神我导入项目中,在libs文件中添加了.so文件,也把yixia连包名一起复制过来了,target也改为23一下了,为什么还是会报这个错呢java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader couldn't find "libutility.so"
        2c8bb55d14dc:@Zhaoss 可以了,谢谢:blush:
        Zhaoss:@骁_a046 你试试把我的项目作为model导进来
      • 2c8bb55d14dc:请问大神要想压缩视频大小,通过设置码率可以吗, 我设置了怎么没效果呢
        2c8bb55d14dc:@Zhaoss 设置宽高文件大小确实变化了,不过只设置码率一直没有变化, 可能是我设置错了,请问大神需要在什么地方设置呢
        Zhaoss:设置码率和设置录制宽高 肯定有效果的 你先看下录制出来的文件清晰度有变化没 如果没变化 说明你设错了
      • cornflower10:大神视频压缩速度怎么优化
        cornflower10:@Zhaoss 求教程
        Zhaoss:@cornflower10 要通过so库优化
      • 1728fedc61c1:你好 ,录像时间长了之后,文件编译速度会很慢,请问有什么解决办法吗 ?
      • 2ffb547a1925:请问VCamera在7.0的手机上出现Detected problems with app native libraries的问题怎么处理?
        楚门的世界3181:解决这个问题了吗,我适配7。0也遇到这个问题了,每次第一次拍的时候,会弹这个,然后后边在拍就没事了
      • 6ca4c2a30257:找不到方法怎么破 UnsatisfiedLinkError: Native method not found
        Zhaoss:请注意! com.yixia的包名也要完整的copy过来, 要不然找不到so库, 会崩溃! 仔细看文章
        6ca4c2a30257:@小贱_9aef 引用了啊
        8cc7d9fe0eb2:你没有在bulid.gradle引用lib库吧
      • 8cc7d9fe0eb2:大佬,退出你的demo,再重进,录制视频后,只展现第一帧,这个丢帧的情况是因为什么?ffmpeg被kill了吗?
        4fd54d3d62a6:@Zhaoss 能说下出现解决思路吗
        8cc7d9fe0eb2:@Zhaoss OK了。谢谢大佬
        Zhaoss:你更新一下代码 我解决这个问题了
      • huangyirui:如果公司项目只需要视频录制和回删的功能,可以用么?
      • 8cc7d9fe0eb2:int i = UtilityAdapter.FFmpegRun("", sb.toString());
        返回的 i= 1 ,应该怎么办啊
        Zhaoss:@小贱_9aef 每个so库里面的优化都不一样 你去看下3.0的文档
        8cc7d9fe0eb2:@Zhaoss 我把你的,ibutility.so库(这应该是VCamera2.0的SDK吧)换成了libffmpeg.so等四个文件(VCamera3.0的SDK),然后在把图片合成到视频里的那个方法行不通,就返回1,编辑失败
        Zhaoss:兄弟 返回1 表示编辑失败 有可能是语法不对 有可能是文件错误 但是就这么直接问我 我也不知道怎么解决啊
      • 6f59546e728c:作者好,已经赞赏,挺好的东西! 但是我这里出现一个问题,有时候录制的时候,出来是视频之前前面一帧,就闪一下,要不就是自己时候了,去视频编辑界面的都是黑的~,不知道咋回事了
        Zhaoss: @张德胜_6297 去编辑页面视频黑的,说明视频文件不存在,因为这是个免费的库,所以不是很稳定
      • 3f5d89a2cdb0:试过用VCamera的库, 自己写了一条压缩视频的命令去执行, 速度太感人了...10s的视频加图片水印跑了4分钟, 压缩也很慢, 没办法改用MediaCodec了, 看了下Telegram的源码,压缩视频也是用的MediaCodec
        3f5d89a2cdb0:@niiiiiK 可以参考下telegram的代码 完全开源的
        niiiiiK:你好,请问可以分享下用MediaCodec来压缩视频的代码么,最近也在搞这个,对这方面没什么了解。
        Zhaoss:@Zi0n42 恩 库这个东西 想换随时都可以换 文章主要讲的是ffmpeg的使用方法 和 那些自定义ui的讲解
      • wenzhihao123:可以 要是自己封装ffmpeg实现底层就更帅了。:grin:
      • 香沙小熊:哈哈,很赞。
      • lingyu1530:视频处理核心都在这个ffmpeg库,根本不能商用,会侵权
        天下第九九八十一:@小于小于 。。。使用LGPL 的动态库库是不需要开源的, 但是你要是静态链接的话 也是需要遵守LGPL的。
        这也可以。。
        小于小于:@Zhaoss 楼主,那商用怎么办?:blush:
        Zhaoss:你自己编译一个ffmpeg库不就行了, 而且这个库本来就不能用作商业,版本太老了 而且一些底层优化也不是很好
      • 4cb0e623ea62:大佬,这个暂时不支持6.0的系统吗?我在低版本的可以拍照,但是在6.0直接提示合成失败了
        a7687d04ea64:我的安卓7.1的合成成功了呀
        Zhaoss:@Z梦飞扬 因为本地的libutiliyt编译的版本是23以下的, 所以如果编译版本为23或以上时, 就会UnsatisfiedLinkError错误
      • c977d2782bbe:java.lang.UnsatisfiedLinkError: No implementation found for void com.xianghuocircle.video_record.yixia.videoeditor.adapter.UtilityAdapter.FFmpegInit(java.lang.Object, java.lang.String)
        Zhaoss:请copy完整的报名(com.yixia) 到工程目录下
      • yinianzhijian:你好,录制视频有抖动的原因是为什么呀,大神?
      • Dracove:爽哥牛逼,浏览网页竟然不小心看到你了
        Zhaoss:@Dracove 我偷怕的女老师太多了 你说一下偷拍的哪个
        Dracove:@Zhaoss 你忘了咱俩一起偷拍美女老师
        Zhaoss:@Dracove 你谁呀
      • 冰冰的冻结:在掘金评论了几次发现 老是发不出去 想问一下 大神有没有自己编译新版ffmpeg 来 做这样的一个demo呢
      • Anonymous___:哈哈,很赞
        Zhaoss: @Anonymous___ 我才看出来是你,哈哈

      本文标题:仿微信视频拍摄UI, 基于ffmpeg的视频录制编辑(上)

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