Android开源:高仿微信视频录制,涂鸦水印添加
QuyenRLS
8年前
<h2>WeiXinRecordedDemo</h2> <pre> <code class="language-java">功能主要包含5点: 1.基于ffmpeg的视频拍摄及合成; 2.自定义拍摄按钮, 长按放大并且显示拍摄进度; 3.自定义view, 实现手绘涂鸦; 4.自定义可触摸旋转缩放位移的表情文字view; 5.基于ffmpeg的图片和视频合成处理.</code></pre> <p>界面风格高仿微信, 只不过微信的编辑处理是作用于图片, 而我们的是基于视频, 所以如果你有需求, 把视频编辑处理换成图片编辑, 更是简单.</p> <h2>1.实现使用ffmpeg录制视频</h2> <p style="text-align:center"><img src="https://simg.open-open.com/show/36f72e630f04231cd10efd95d1272915.png"></p> <p>首先导入lib库和ffmpeg的录制java文件, 我使用的是第三方VCamera封装的ffmpeg, 他没有jar包, 所以需要将con.yixia包下的所有文件都copy过来,</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/a65b1b162bf6a35df1682612d6dd414e.png"></p> <p>然后在application里面初始化VCamera:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/bde11628a6e0e6fa7d34df8d6ab430c9.png"> <img src="https://simg.open-open.com/show/939985b35e7e4e549ac025c9021806e5.png"></p> <p>这个时候, 你就可以在SurfaceView上看见拍摄预览界面了,</p> <p>然后mMediaRecorder.startRecord()拍摄视频,</p> <p>调用mMediaRecorder.stopRecord()停止录制视频,</p> <p>因为拍摄出来的文件是ts视频流, 所以还要调用mMediaRecorder.startEncoding()开始合成MP4视频文件.</p> <p style="text-align:center">MediaRecorderBase类还可以设置视频各个参数, 如: <img src="https://simg.open-open.com/show/408d91a727651e66bbd29ab7adff9aae.png"></p> <h2>2.自定义拍摄按钮, 长按放大并且显示拍摄进度</h2> <p style="text-align:center"><img src="https://simg.open-open.com/show/e35bb4537a8fa00dbae132b31a39c135.png"></p> <p style="text-align:center">自定义RecordedButton继承View, 在onDraw里分三部分绘制: <img src="https://simg.open-open.com/show/2bf356449c279bd65d4def6d3e0fa0ab.png"></p> <p>在拍摄模式下, 改变radius(半径), 达到放大或者缩小外圈和内圈圆的效果, 不断增加girth值达到显示拍摄进度的效果, 是不是很简单.</p> <h2>3.自定义view, 实现手绘涂鸦</h2> <p style="text-align:center"><img src="https://simg.open-open.com/show/2fa0adca2bdbde80e5fcdaaf13f7db83.png"></p> <p>自定义TuyaView继承View, 重写onTouch(), 在手指点下和移动时实时绘制触摸轨迹:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/1ae3c8f100767474b68fdd6c4b2c91f8.png"></p> <p>在手指按下时创建new Path()对象, 记录本次手指触摸移动轨迹, 并且实时调用invalidate() 达到不断调用onDraw()的目的, 然后使用canvas.drawPath(path,paint)绘制触摸路径, 是不是非常简单.</p> <h2>4.自定义可触摸旋转缩放位移的表情文字view</h2> <p style="text-align:center"><img src="https://simg.open-open.com/show/0e5a248b8ccb80195181046ced601cf1.png"></p> <p>这个view稍微有点麻烦, 但我单独写了一篇文章 <a href="/misc/goto?guid=4959739521110934499" rel="nofollow,noindex">点击跳转</a> , 非常详细的讲解了这个view, 而且封装的非常好, 只要addView到布局中就可以使用了, 大家可以点击链接过去看一下.</p> <h2>5.基于ffmpeg的图片和视频合成处理</h2> <p>这也是demo的最后一步, 将涂鸦,和表情文字全部合成到视频当中, 首先是得到需要合成的图片, 我们可以通过view.draw(Canvas canvas),得到布局的bitmap:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/d8f5dc5147fb708014155016a87aa808.png"></p> <p>然后通过ffmpeg来执行图片和视频的合成, 具体语句是这样的:</p> <p>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</p> <p>我把参数讲解一下: videoPath代表你要编辑视频的路径</p> <p>imagePath代表你要合成的图片路径</p> <p>outPath是合成之后的输出视频路径</p> <p>这些是我们需要替换的参数至于一些别的, 例如:</p> <p>overlay=0:0表示图片坐标位置, 0:0表示x轴=0,y轴=0</p> <p>-vcodec后面表示视频输出格式, 3000k码率, 25帧数, 总之ffmpeg的参数还有很多, 如果感兴趣可以去ffmpeg官网看命令大全.</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/fa91795398582b23ce09054f58de75ac.png"></p> <p>向UtilityAdapter.FFmpegRun()里传入ffmpeg语句就可以执行了, 返回值 int , 如果等于0就是成功, 非0则是失败, FFmpegRun()方法的第一参数如果传入空字符串就是异步执行视频处理, 否则就是同步执行, 这点要注意.</p> <p>如果这篇文章对大家有所帮助, 希望可以点一下star哦, 我会经常在上面分享我工作中遇到的问题和酷炫的特效实现.</p> <p> </p> <p> </p> <p> </p>