使用FFmpeg4android 实现视频 水印 剪切 压缩 旋转

来源:互联网 发布:杂志订阅 知乎 编辑:程序博客网 时间:2024/05/19 23:17

翻看了一下自己的上一篇博客,7月5号写的......,瞬间不高兴了,写博客贵在坚持,而自己在这段时间确松懈下来了,实在不应该呀!罪过罪过!

最近这一段时间内,公司的项目迭代更新需要添加新的功能包括:视频的录制和压缩上传等....,这些功能中 视频压缩上传不是很好解决。大概花了我一周左右的时间去研究和写demo.过程是痛苦的,最终黄天不负有心人啊,还是弄出来了。测试结果:录制5分钟 77M  压缩之后 11M 左右,并且视频的清晰度和原视频的清晰度并没有什么差别。接下来我将直接给大家说一下我是怎么实现的:

使用ffmpeg4android 实现视频的压缩

在进行android压缩上传的相关搜索中,提到最多的一个词就是FFMPEG,那么什么是FFMPEG呢?FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。而android目前解决视频的剪切和压缩的话好像就只能是用FFMEG。ffmepg 是在linux上写的,需要运行linux 命令进行进行视频的操作的。FFMPEG FOR ANDROID 你会查到相关的ffmpeg 移植都android 上的相关资料。不过我并不是采用的这种方法解决的问题,说实话上面这种方法,编译过程还是相当复杂,我采用的是一个第三方开源库也就是 ffmpeg4android。 ffmpeg4android 你只需使用java语言去操作linux命令即可,无须考虑C语言和NDK。官方网址:http://androidwarzone.blogspot.co.il/2011/12/ffmpeg4android.html。大家可以在这上面下载最新库接下来我会向大家介绍一些命令:

(1)最简单常规命令:

  ffmpeg -y -i /sdcard/videokit/in.mp4 -strict experimental -s 160x120 -r 25 -vcodec mpeg4 -b 150k -ab 48000 -ac 2 -ar 22050 /sdcard/videokit/out.mp4

         其中: -y -i 后接录制好的视频地址, -strict experiment  就是开启一些实验性的功能。 -s 输出的分辨率 如 640*480 480*480 -r 视频的帧数 -vcodec 视频编码-ab 128(音频数据流量,一般选择32、64、96、128) ac 声道 1 单声道 2 双声道 -ar 音频采样率。 一般的话控制视频输出质量参数 - s -b 增大-s 和 -b 都会提高视频的输出质量,当然相应的视频的size也会增大。

(2)截取视频特定时间的图片:
ffmpeg -y -i /sdcard/videokit/in.mp4 -strict experimental -an -r 1/2 -ss 00:00:00.000 -t 00:00:03 /sdcard/videokit/filename%03d.jpg

        其中: -ss 视频开始

(3)视频裁剪:
ffmpeg -y -i /sdcard/videokit/short.mp4 -strict experimental -vf crop=100:100:0:0  -r 15 -aspect 1:1 -ab 12288 -vcodec mpeg4 -b 2097152 -sample_fmt s16 /sdcard/videokit/out.mp4

 其中: crop里的参数依次为: 宽度,高度,left(距离左上角坐标),top(距离顶下角坐标)

(4)添加水印:

String[] complexCommand = {"ffmpeg","-y" ,"-i", "/sdcard/videokit/in.mp4","-strict","experimental", "-vf", "movie=/sdcard/videokit/watermark.png [watermark]; [in][watermark] overlay=main_w-overlay_w-10:10 [out]","-s", "320x240","-r", "30", "-b", "15496k", "-vcodec", "mpeg4","-ab", "48000", "-ac", "2", "-ar", "22050", "/sdcard/videokit/out.mp4"};

  容易出现的错误:

(1) 需要注意的是这些命令之间每个参数和值之间有且只有一个空格,不然运行程序就会提示Command validation failed.(无效命令)

(2)同学们会发现不管怎么运行某些命令都会出错,如运行如下命令就会出错:

ffmpeg -y -i /sdcard/videokit/in.mp4 -strict experimental -vcodeclibx264 -preset ultrafast -crf 24 -acodec aac -ar 44100 -ac 2 -b:a 96k -s 320x240 -aspect 4:3 /sdcard/videokit/out3.mp4。一般命令中出现红字部分就会出错。这是由于libvideokit.so中并未集成x264编码造成的 这时候解决办法如下:

(1)点击下载extras_xx.zip   

(2)解压压缩包,将

     -- armeabi-v7a
         -- libvideokit.so.full_with_x264 文件重命名为 libvideokit.so 替换掉下载好的库的 armeabi-v7a中的 libvideokit.so ,重新编译即可运行上面命令了。

最后的话我罗列出我的写的项目中使用到的command:

 commandStr = "ffmpeg -y -i " + url + " -strict experimental -vf crop=480:480:0:0 -r 30 -aspect 1:1 -ab 44100 -ac 1 -ar 22050 -vcodec libx264 -preset fast -crf 26 " + demoVideoFolder + "video-out.mp4" + " -r 1/3 -ss 00:00:00.000 -t 00:00:03 " + demoVideoFolder + "cover.jpg";
 这个命令包括 视频剪切 压缩  以及 截取图片。77M大概能压缩到11M左右。

ffmpeg 参数讲解链接地址:http://www.cnblogs.com/chen1987lei/archive/2010/12/03/1895242.html

ffmpeg 视频压缩相关参数设链接地址:https://segmentfault.com/a/1190000002502526   (crf 这个参数一定要注意,在上述命令中我设置的26 ,如果同学想要更低的压缩的话28也行,再低的话,视频质量上就会有明显的不同


下载库的话需要翻墙 ,csdn只允许上传小于70M的文件,没有办法给大家上传到csdn了,见谅!下载地址:http://androidwarzone.blogspot.co.il/2011/12/ffmpeg4android.html    在使用过程中有什么疑问可留言!

2 0