1.安装ffmpeg Mac: 不需要安装,直接在官网下载 http://ffmpeg.org/download.html 下载地址:https://evermeet.cx/ffmpeg/(免安装版,将其copy到自己的目录,直接可以用) ffmpeg安装后,输入ffmepg -version命令,查看是否支持opencore-amr的解码器 Linux: 下载地址:https://www.johnvansickle.com/ffmpeg/ 我选择的是: x86_64 build(适合自己的服务器)也是免安装版 2.amr格式需要opencore-amr 其下载地址:https://sourceforge.net/projects/opencore-amr/ amr编译方法:参考自:http://blog.csdn.net/tylz04/article/details/9041739
其编译方法; chmod 755 opencore-amr-0.1.3.tar.gz //改变文件操作权限 tar -xzvf opencore-amr-0.1.3.tar.gz //解压文件 cd opencore-amr-0.1.3 //进入到opencore-amr文件夹内 ./configure --enable-shared=no --enable-static=yes //配置 make //编译 make installffmpeg会自己寻找解码器 ffmpeg查看是否支持opencore-amr: 终端输入: ffmpeg查看 –enable-libopencore-armnb和–enable-libopencore-amrwb表示支持opencore-amr解码器
configuration: --cc=/usr/bin/clang --prefix=/opt/ffmpeg --extra-version=tessus --enable-avisynth --enable-fontconfig --enable-gpl --enable-libass --enable-libbluray --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-libschroedinger --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzmq --enable-libzvbi --enable-version3 --disable-ffplay --disable-indev=qtkit3.mp3与wav转amr代码
/** ffmpeg的安装目录,用于启用ffmpeg */ private static final String ffmpeg = "/usr/local/ffmpeg-3.3-64bit-static/ffmpeg"; /** * -ab(-b:a) bitrate 设置音频码率 * -ar freq 设置音频采样率 * -c:a(-acodec) 设置声音解码器 * -y 覆盖输出文件,若果源文件已经存在,那么不经提示,直接覆盖 * -vol 音量大小 * -ac (声道数1和2) * @param sourcePath 源文件地址,输出位置:源文件文件夹内,只改变文件格式 */ public static boolean changeToAmer(String sourcePath){ try { String prefix = sourcePath.substring(0,sourcePath.lastIndexOf(".")); String commend = ffmpeg + " -i " + sourcePath + " -c:a libopencore_amrnb -ac 1 -ar 8000 -b:a 7.95K -y " + prefix + ".amr"; VideoUtilsExt.executeCommend(commend); } catch (IOException e) { e.printStackTrace(); return false; } return true; } public static void executeCommend(String commend) throws IOException{ System.out.println(commend); Process process = new ProcessBuilder(Arrays.asList(commend.split(" "))).redirectErrorStream(true).start(); new MyPrintStream(process.getInputStream()).start(); try { process.waitFor(); } catch (InterruptedException e) { e.printStackTrace(); } }补充:MyPrintStream内部类,其实就是将视频转换的获得的流打印出来(包括ffmeg相关信息,命令行,以及转换过程,异常信息等)
class MyPrintStream extends Thread{ InputStream iStream = null; public MyPrintStream(InputStream iStream) { this.iStream = iStream; } @Override public void run() { try{ int r = 0; while ((r = iStream.read())!= -1) { System.out.print((char)(r)); } }catch(Exception e){ e.printStackTrace(); } } }另外,如果视频转换的并发量比较大,可以创建一个线程池,将转换代码放到线程里面完成。