关于微信录音的坑-Linux服务器上进行音频格式的转换

近期在开发一个企业微信的应用,里面涉及到了录音功能。记录一下遇到的问题。

主要问题是,因为永久素材的数量限制,临时素材时间得限制。音频文件只能先在前端上传给微信,接着后台下载到服务器上。

所以我调用了微信接口,录完得音频文件成功保存到了服务器。不过HTML不支持amr格式的音频,就利用微信下载下来的音频流直接改成MP3格式的文件,本想着大功告成。后面发现微信浏览器还是无法播放音频。就只好换一种方法了,后面在网上了解了一下,我感觉Linux系统不支持直接通过修改文件后缀的方式修改音频。

这里就要利用第三方软件了:ffmpeg。ffmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件)。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的。ffmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行。

下面开始贴代码:

下载安装yasm。yasm是一个完全重写的NASM汇编。目前,它支持x86和AMD64指令集,接受NASM和气体汇编语法,产出二进制, ELF32 , ELF64 , COFF , Mach - O的( 32和64 ) , RDOFF2 ,的Win32和Win64对象的格式,并生成STABS 调试信息的来源,DWARF 2 ,CodeView 8格式。之所以在FFmpeg中用这个,主要是支持编译ffmpeg-x264.

wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar xzvf yasm-1.3.0.tar.gz
cd yasm-1.3.0
./configure
make
make install

部分格式需额外下载解码器,非必选的安装。看自身情况:

  1. lame :lame-3.99.5.tar.gz Url:http://sourceforge.net/project/showfiles.php?group_id=290&package_id=309 
  2. libogg :libogg-1.3.1.tar.gz Url:http://www.xiph.org/downloads/ 
  3. libvorbis :libvorbis-1.3.3.tar.gz Url:http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.3.tar.gz
  4. xvid :xvidcore-1.3.2.tar.gz  Url:http://downloads.xvid.org/downloads/xvidcore-1.3.2.tar.gz 
  5. x264 :latest_x264.tar.bz2 (其中包含的目录是 x264-snapshot-20131023-2245)  Url:http://www.videolan.org/developers/x264.html  ===ftp://ftp.videolan.org/pub/videolan/x264/snapshots/
  6. libdts :libdca-0.0.5.tar.bz2 libdca-0.0.5.tar.bz2  ===Url: http://www.videolan.org/developers/libdca.html
  7. faad2 :faad2-2.7.tar.gz  faad2-2.7.tar.gz ===http://www.audiocoding.com/downloads.html 
  8. faac :faac-1.28.tar.gz === http://www.audiocoding.com/downloads.html
  9. amr-nb: amrnb-10.0.0.0.tar.bz2 === http://ftp.penguin.cz/pub/users/utx/amr/
  10. amr-wb:amrwb-7.0.0.1.tar.bz2  ===http://ftp.penguin.cz/pub/users/utx/amr/ 

最关键的一步, 安装ffmpeg:

wget http://ffmpeg.org/releases/ffmpeg-3.1.3.tar.gz
tar -zxvf ffmpeg-3.1.3.tar.gz
cd ffmpeg-3.1.3 
./configure --prefix=/usr/local/ffmpeg2 --enable-libmp3lame --enable-libvorbis --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-libfaac --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libx264 --enable-libxvid --enable-postproc --enable-ffserver --enable-ffplay
   make 
   make install 

 在./configure的时候会报错, 提示说没有libopencore-amrnb和libopencore-amrwb两个库. 我参考了 [2], 使用如下命令安装它们:

sudo apt-get install libopencore-amrnb-dev libopencore-amrwb-dev

 如果./configure的时候加入 --enable-shared, 编译安装没有问题. 但是运行ffmpeg命令就会出错:

relocation error: /usr/local/lib/libavfilter.so.3: symbol sws_get_class, version LIBSWSCALE_2 not defined in file libswscale.so.2 with link time reference;

这时可以参考 [3], 大意是说跟gstreamer的动态库冲突了, 要卸载gstreamer. 但是如果卸载了gstreamer我的多媒体软件多不能用了. 所以我卸载了ffmpeg并重新编译成静态库. 安装完之后, 运行ffmpeg成功, 输出如下: 

ffmpeg version 3.1.3 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-16)
  configuration: 
  libavutil      55. 28.100 / 55. 28.100
  libavcodec     57. 48.101 / 57. 48.101
  libavformat    57. 41.100 / 57. 41.100
  libavdevice    57.  0.101 / 57.  0.101
  libavfilter     6. 47.100 /  6. 47.100
  libswscale      4.  1.100 /  4.  1.100
  libswresample   2.  1.100 /  2.  1.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Use -h to get full help or, even better, run 'man ffmpeg'

 开始音频转码:

public  String changeAmrToMp3(String sourcePath) {
		System.out.println("开始转换音频格式");
		String extension = sourcePath.substring(sourcePath.lastIndexOf(".")); 
		String targetPath = sourcePath.replace(extension, ".wav"); 
	
     
        List<String> commend = new ArrayList<String>();  
        commend.add("ffmpeg");  
        commend.add("   -i   ");  
        commend.add(sourcePath);  
        commend.add("  "+targetPath);  
        try {  
            Runtime runtime = Runtime.getRuntime();  
            Process proce = null; 
           
            String cmd = "";  
            String cut = "     ffmpeg   -i   "  
                    + sourcePath  
                    + "   "+targetPath;
            String cutCmd = cmd + cut;  
            proce = runtime.exec(cutCmd);  
            //调用线程命令进行转码
            ProcessBuilder builder = new ProcessBuilder(commend);                 
             builder.command(commend);  
            builder.start();  
            System.out.println("命令"+commend);
            System.out.println("cutCmd命令"+cutCmd);
            return targetPath;  
        } catch (Exception e) {  
            e.printStackTrace();  
            System.out.println("转换音频格式失败");
            return null;  
        }  
    }  

在网上看到有些人使用了线程命令成功了,我的没成功。就换了Runtime方法。

用命令测试结果:

 

没安装MP3得解码器,所以无法转码成MP3。换成了wav格式的音频:

 安装好的软件里自带支持wav格式的。成功~

 参考文章:https://www.cnblogs.com/tohxyblog/p/6640786.html

参考文章:https://www.cnblogs.com/jiangzhaowei/p/8269987.html

参考文章:https://www.cnblogs.com/wanghetao/p/3386311.html

参考文章:http://www.cnblogs.com/AllenChou/p/7048528.html

参考文章:https://blog.csdn.net/wmt1432/article/details/52056279

感谢以上文章作者的帮助!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值