使用servlet过滤器播放amr音频
来源:互联网 发布:c语言入门pdf下载 编辑:程序博客网 时间:2024/05/28 20:18
前话
怎样播放amr音频?这个问题让我好烦恼,在网上找了一些资料,quicktime插件虽然可以播放amr格式的音频,但是不满足项目的要求,html5也不能播放amr格式的音频。后来想到将amr音频转成其他HTML5支持的格式不久行了,后来在网上找到JAVE
能转换音频和视频,但是我在转换的过程中老是报如下的异常:
- it.sauronsoftware.jave.EncoderException.EncoderException:Duration: N/A, bitrate: N/A
Duration: N/A, bitrate: N/A,而JAVE的这段代码(在it.sauronsoftware.jave.Encoder#public void encode(File source, File target, EncodingAttributes attributes, EncoderProgressListener listener) 中):
- if (step == 0) {
- if (line.startsWith("WARNING: ")) {
- if (listener != null) {
- listener.message(line);
- }
- } else if (!line.startsWith("Output #0")) {
- throw new EncoderException(line);
- } else {
- step++;
- }
- }
实现过程
本文是将amr文件转成mp3文件,然后输出到浏览器,思路:通过过滤器拦截以amr结尾的请求,对请求的路径进行处理,获取到文件所在的真实位置,如果文件不存在则让请求通过,如果存在则找同名的mp3文件,如果同名的mp3文件不存在则将amr转成mp3文件,并以相同的名字以mp3为后缀存储。设置相应的类型为MP3的MIME类型,读取mp3文件并输出。
- package cn.zq.amrplay.web.filter;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import javax.servlet.Filter;
- import javax.servlet.FilterChain;
- import javax.servlet.FilterConfig;
- import javax.servlet.ServletException;
- import javax.servlet.ServletRequest;
- import javax.servlet.ServletResponse;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import cn.zq.amrplay.util.AudioUtils;
- /**
- * <p>此过滤器用来拦截所有以amr后缀结尾的请求,并转换成mp3流输出,输出<strong>MIME</strong>类型为audio/mpeg。</p>
- * @author Riccio Zhang
- *
- */
- public class Amr2Mp3Filter implements Filter{
- /**
- * mp3扩展名对应的MIME类型,值为"audio/mpeg"
- */
- public final static String MP3_MIME_TYPE = "audio/mpeg";
- public void init(FilterConfig filterConfig) throws ServletException {}
- public void destroy() {}
- public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain)
- throws IOException, ServletException {
- HttpServletRequest request;
- HttpServletResponse response;
- try {
- request = (HttpServletRequest) req;
- response = (HttpServletResponse) resp;
- } catch (ClassCastException e) {
- throw new ServletException("non-HTTP request or response");
- }
- String requstURI = request.getRequestURI();
- String contextPath = request.getContextPath();
- String resPath = requstURI;
- //去掉requstURI中contextPath部分和参数部分
- if(contextPath.length() > 0) {
- resPath = resPath.substring(contextPath.length());
- }
- int index = 0;
- if((index = resPath.lastIndexOf("?")) != -1) {
- resPath = resPath.substring(0, index);
- }
- String resRealPath = req.getServletContext().getRealPath(resPath);
- String mp3ResRealPath = resRealPath.replaceFirst(".amr$", ".mp3");
- File mp3File = new File(mp3ResRealPath);
- if(!mp3File.exists()) {
- File amrFile = new File(resRealPath);
- if(!amrFile.exists()) {
- filterChain.doFilter(request, response);
- return;
- }
- AudioUtils.amr2mp3(amrFile.getAbsolutePath(), mp3File.getAbsolutePath());
- }
- response.setContentLength((int)mp3File.length());
- response.setContentType(MP3_MIME_TYPE);
- InputStream in = new FileInputStream(mp3File);
- OutputStream out = response.getOutputStream();
- try {
- byte[] buf = new byte[1024];
- int len = -1;
- while((len = in.read(buf)) != -1) {
- out.write(buf, 0, len);
- }
- } finally {
- try {
- in.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- out.flush();
- }
- }
- }
音频转换的工具类:
- package cn.zq.amrplay.util;
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- public class AudioUtils {
- /**
- * ffmpeg.exe文件所在的路径
- */
- private final static String FFMPEG_PATH;
- static {
- FFMPEG_PATH = AudioUtils.class.getResource("ffmpeg.exe").getFile();
- }
- /**
- * 将一个amr文件转换成mp3文件
- * @param amrFile
- * @param mp3File
- * @throws IOException
- */
- public static void amr2mp3(String amrFileName, String mp3FileName) throws IOException {
- Runtime runtime = Runtime.getRuntime();
- Process process = runtime.exec(FFMPEG_PATH + " -i "+amrFileName+" -ar 8000 -ac 1 -y -ab 12.4k " + mp3FileName);
- InputStream in = process.getErrorStream();
- BufferedReader br = new BufferedReader(new InputStreamReader(in));
- try {
- String line = null;
- while((line = br.readLine())!=null) {
- System.out.println(line);
- }
- if(process.exitValue() != 0 ) {
- //如果转换失败,这里需要删除这个文件(因为有时转换失败后的文件大小为0)
- new File(mp3FileName).delete();
- throw new RuntimeException("转换失败!");
- }
- } finally {
- //为了避免这里抛出的异常会覆盖上面抛出的异常,这里需要用捕获异常。
- try {
- in.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- }
下面简单说明下ffmpeg的几个命令参数:
- -i :指定输入文件
- -ar : 指定sampling rate(采样率),它的单位是HZ
- -ac:指定声道,1表示双声道,0表示单声道
- -ab:指定转换后的比特率
PS: 写到这里我才发现,这个工具类有点问题,由于项目代码是提前上传的,请将项目代码里的工具类替换为上面的代码。
过滤器配置:
- <filter>
- <filter-name>Amr2mp3Filter</filter-name>
- <filter-class>cn.zq.amrplay.web.filter.Amr2Mp3Filter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>Amr2mp3Filter</filter-name>
- <url-pattern>*.amr</url-pattern>
- </filter-mapping>
看一下效果:
资源链接:
- 本文示例代码下载地址:http://download.csdn.net/detail/qq791967024/9194647
- JAVE官网地址:http://www.sauronsoftware.it/projects/jave/(有下载地址,官方文档和例子)
- JAVE源码和jar包下载地址一:http://www.sauronsoftware.it/projects/jave/download.php?PHPSESSID=cgoi3vth901u5bsnemkej1h7p0(官方下载地址,速度非常慢)
- JAVE源码和jar包下载地址二:http://sourceforge.net/projects/jave/files/1.0.2/(下载速度比较快)
- ffmpeg官网地址:http://www.ffmpeg.org/(有windows,linux,MAC三个版本,还有一些文档,不过全是英文看起来有点费劲)
- ffmpeg中文资源一:http://bbs.chinavideo.org/archiver/?fid-10.html
- ffmpeg中文资源二:http://blog.csdn.net/hemingwang0902/article/details/4382429(这系列的文章还不错,不过有些不适合我们看)
阅读全文
0 0
- 使用servlet过滤器播放amr音频
- 使用servlet过滤器播放amr音频
- 播放amr格式的音频
- html页面播放amr音频
- 播放amr音频,后台进行mp3转码
- 多线程应用---使用WaveOut* API开发AMR音频播放器(含源码下载)
- 多线程应用---使用WaveOut* API开发AMR音频播放器(含源码下载)
- ios 使用音频队列播放amr格式转换成wav的格式,只有嘈杂声
- 使用DirectShow播放AMR文件
- 获取AMR格式音频的播放总时间
- 获取AMR格式音频的当前播放位置
- iOS 录音Wav 音频 转换 Amr ,Android 播放
- iOS 录音Wav 音频 转换 Amr ,Android 播放
- iOS 录音Wav 音频 转换 Amr ,Android 播放
- 关于web项目播放AMR格式音频的问题
- php 电脑端播放手机音频amr文件
- 使用MediaPlayer播放音频
- 使用MediaPlayer播放音频
- Vuex 是什么?
- 深度剖析虚拟继承
- 解剖标记点检测——Two-Stage Task-Oriented DNN
- Java的四种引用
- 顺序容器(vector、deque、list、forward_list、array 、string)
- 使用servlet过滤器播放amr音频
- Jersey采用模板Freemarker输出
- Python察阅手册(狐狸版)
- 利用gstreamer设计自已的图传 并整合到Qground Control地面站
- linux4
- aop记录
- 【Spark】Spark的Standalone模式安装部署
- 正则表达式笔记
- 利用AdaBoost元算法提高分类性能