如何在Android中压缩视频

  介绍

如何在Android中压缩视频?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

<强>使用方法

基本原理:将Android环境下可执行文件ffmpeg存放在本地,代码执行ffmpeg的压缩命令。

//将开源库中资产目录的ffmpeg可执行文件,拷贝到,应用程序的数据/数据/文件目录      FFmpeg.getInstance(这).loadBinary (null);

执行ffmpeg的一个命令:比如查看ffmpeg的当前版本:。/ffmpeg - version

如何在Android中压缩视频

接着就可以在代码中,使用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中压缩视频