如何在Android中压缩视频?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
<强>使用方法强>
基本原理:将Android环境下可执行文件ffmpeg存放在本地,代码执行ffmpeg的压缩命令。
//将开源库中资产目录的ffmpeg可执行文件,拷贝到,应用程序的数据/数据/文件目录 FFmpeg.getInstance(这).loadBinary (null);
执行ffmpeg的一个命令:比如查看ffmpeg的当前版本:。/ffmpeg - version
接着就可以在代码中,使用ffmpeg的各种命令了:把命令写入String[],然后调用ffmpeg。执行即可
<强>获取视频文件的信息强>
String [], command =, new String[]{“我,,,arg.filePath}; try { ,,,,,fFmpeg.execute(命令,new ExecuteBinaryResponseHandler () { ,,,,,,@Override ,,,,,,,public void onStart (), {} ,,,,,,@Override ,,,,,,,public void onProgress (String 消息),{ ,,,,,,,,,Log.e (“dml",,“onProgress:, message is “, +,消息); ,,,,,,,} ,,,,,,@Override ,,,,,,,public void onFailure (String 消息),{ ,,,,,,,,,Log.e (“dml",,“onFailure:, message is “, +,消息); ,,,,,,,} ,,,,,,@Override ,,,,,,,public void 调用onSuccess (String 消息),{ ,,,,,,,,,Log.e (“dml",,“onSuccess:, message is “, +,消息); ,,,,,,,} ,,,,,,@Override ,,,,,,,public void onFinish (), { ,,,,,,,,,Log.e (“dml",,“onFinish:,“); ,,,,,,,} ,,,,,}); ,,,},catch (FFmpegCommandAlreadyRunningException e), { ,,,,,e.printStackTrace (); ,,,}
压缩视频:
String [], commands =, new String [] {“-threads",“1“,“我,,,arg.filePath,,“c: v",,“libx264",“-crf",“30”,“-preset",,“superfast",,“-y",,“-acodec",“libmp3lame", arg.thumbVideoPath}; fFmpeg.execute(命令,new ExecuteBinaryResponseHandler () {});
参数解释:
- <李>
线程:执行线程数,传入1单线程压缩
李> <李>我:输入路径,传入视频文件的路径
李> <李>- c: v:编码格式,一般都是指定libx264
李> <李>crf:编码质量,取值范围是0-51,默认值为23日,数字越小输出视频的质量越高。这里的30是我们经过测试得到的经验值
李> <李>预设:转码速度,超快的,超快的,非常快,快,快,媒介,慢,慢,veryslow和placebo.ultrafast编码速度最快,但压缩率低,生成的文件更大,安慰剂则正好相反.x264所取的默认值为媒介。需要说明的是,预设主要是影响编码的速度,并不会很大的影响编码出来的结果的质量。
李> <李>-acodec:音频编码,一般采用libmp3lame
李> <李>arg.thumbVideoPath:最后传入的是视频压缩后保存的路径
李> <李>- y:输出时覆盖输出目录已存在的同名文件(如果不加此参数,就不会覆盖)
李><强>问题解决强>
此开源库用于视频压缩在实际开发中存在不少问题,下面一一解决
<强> 1。压缩进度反馈强>
执行转码命令后,onProgress只是不停输出字符串,而且文本很长需要正则表达式从中截取转码进度反馈:
@Override ,,,,,,,public void onProgress (String s), { ,,,,,,,,,Pattern timePattern =, Pattern.compile (“(& lt;==) [d: \ \] *“); ,,,,,,,,,Scanner sc =, new 扫描仪(年代); ,,,,,,,,,String match =, sc.findWithinHorizon (timePattern, 0); ,,,,,,,,,if (match !=, null), { ,,,,,,,,,,,String [], matchSplit =, match.split (“:”); ,,,,,,,,,,,if (持续时间!=,0),{ ,,,,,,,,,,,,,float progress =, (Integer.parseInt (matchSplit [0]), *, 3600, + null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null如何在Android中压缩视频