微信公众号录音文件的播放与保存(amr文件转mp3)

 更新时间:2021年08月12日 10:44:21   作者:llsydn  
本文主要介绍了微信公众号录音文件的播放与保存(amr文件转mp3),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

音频转码工具,主要用于将微信语音 amr 格式转换为 mp3 格式以便在 html5 的 audio 标签中进行播放

1.调用微信提供的接口获取录音的InputStream字节流

public InputStream getInputStream(String mediaId) {
    InputStream is = null;
    try {
        String URL_DOWNLOAD_TEMP_MEDIA = "https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID";
        String url = URL_DOWNLOAD_TEMP_MEDIA.replace("ACCESS_TOKEN", "自己写代码获取accessToken").replace("MEDIA_ID", mediaId);
        URL urlGet = new URL(url);
        HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();
        http.setRequestMethod("GET"); // 必须是get方式请求
        http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        http.setDoOutput(true);
        http.setDoInput(true);
        System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒
        System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒
        http.connect();
        // 获取文件转化为byte流
        is = http.getInputStream();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return is;
}

2.将获取到的字节流保存为amr文件

public String downloadMediaId(HttpServletRequest request, String mediaId) {
    String relfilePath = null;
    InputStream inputStream = getInputStream(mediaId);
    FileOutputStream fileOutputStream = null;
    try {
        //服务器资源保存路径
        String savePath = request.getSession().getServletContext().getRealPath("/") + "upload/" + DateUtil.getYear() + "/wxmedia/audio/";
        savePath = savePath + "audio/"; 
        String filename = String.valueOf(System.currentTimeMillis()) + ".amr";
        relfilePath = "upload/" + DateUtil.getYear() + "/wxmedia/audio/" + filename;
        File file = new File(savePath);
        if (!file.exists()) {
            file.mkdirs();
        }
        byte[] data = new byte[1024];
        int len = 0;
        fileOutputStream = new FileOutputStream(savePath + filename);
        while ((len = inputStream.read(data)) != -1) {
            // 判断结果是否有错
            if (new String(data).indexOf("errmsg") > -1) {
                return null;
            }
            fileOutputStream.write(data, 0, len);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (fileOutputStream != null) {
            try {
                fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return relfilePath;
}

3.将保存的amr文件转成mp3文件

public void amrToMp3(String sourcePath, String targetPath) {
    File source = new File(sourcePath);
    File target = new File(targetPath);
    AudioUtils.amrToMp3(source, target);
}

4.所需的jar包依赖

<!--amr文件转音频map文件-->
<dependency>
    <groupId>com.github.dadiyang</groupId>
    <artifactId>jave</artifactId>
    <version>1.0.3</version>
</dependency>

音频转码工具

支持 Linux/Windows/Mac 平台
因为是基于 JAVE 项目的修改,而 JAVE 是依赖 ffmpeg 所以可以适用于所有 ffmpeg 所支持的文件格式的转换。具体可以查看 JAVE 官方文档

原理

初始化时判断当前运行环境,将bin目录中对应的 ffmpeg 可执行文件拷贝到临时目录中
根据文件类型及配置通过 Runtime.getRuntime().exec(cmd) 执行 ffmpeg 对应的转码命令

JAVE 项目的问题

ffmpeg 是依赖运行环境的,JAVE 项目封装了ffmpeg,它通过上述的原理使 java 可以调用ffmpeg而且支持跨平台。

  • 项目老旧没再维护。官网最近版本是2009年发布的,其依赖的ffmpeg早已过时,很多情况下用不了。
  • 转码一直报异常 EncoderException: Stream mapping
  • 没有发布maven仓库,而且 JAVE 本身也不是一个maven项目
  • 不支持mac

本项目特点

本项目为解决上述问题而生。

  • 这是一个maven项目,而且已发布到中央仓库
  • 项目依赖的 ffmpeg 可执行文件经过验证可以使用(单元测试中提供了一个简单的检验方法)
  • 解决了amr转mp3出现的 EncoderException: Stream mapping
  • 支持 Linux/Windows/Mac 平台

扩展

如果程序无法通过拷贝资源文件的方式获取到 ffmpeg 的可执行文件或者内置的 ffmpeg 不支持你所使用的操作系统
你可以通过环境变量或者在 java 中设置 System.setProperty("ffmpeg.home", "ffmpeg可执行文件所在的目录") 的方式指定你的系统中安装的可用的 ffmpeg 文件的目录

如 System.setProperty("ffmpeg.home", "/usr/local/bin/")

到此这篇关于微信公众号录音文件的播放与保存(amr文件转mp3)的文章就介绍到这了,更多相关微信公众号录音内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何用JavaScript检测当前浏览器是无头浏览器

    如何用JavaScript检测当前浏览器是无头浏览器

    这篇文章主要介绍了如何用JavaScript检测当前浏览器是无头浏览器,对无头浏览器感兴趣的同学,可以参考一下
    2021-04-04
  • 设置BFC功能及使用示例详解

    设置BFC功能及使用示例详解

    这篇文章主要为大家介绍了设置BFC功能及使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Openlayers学习之地图比例尺控件

    Openlayers学习之地图比例尺控件

    这篇文章主要为大家详细介绍了Openlayers学习之地图比例尺控件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • 整理Javascript基础语法学习笔记

    整理Javascript基础语法学习笔记

    整理Javascript基础语法学习笔记,之前一系列的文章是跟我学习Javascript,本文就是进一步学习javascript基础语法,希望大家继续关注
    2015-11-11
  • 树结构之JavaScript

    树结构之JavaScript

    本文主要介绍了JavaScript树结构的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • 微信小程序开发技巧汇总

    微信小程序开发技巧汇总

    这篇文章主要介绍了微信小程序开发技巧汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 基于javascript实现彩票随机数生成(简单版)

    基于javascript实现彩票随机数生成(简单版)

    这篇文章主要介绍了基于javascript实现彩票随机数生成的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • 深入浅析JavaScript中的RegExp对象

    深入浅析JavaScript中的RegExp对象

    正则表达式(regular expression)是一种表达文本模式(即字符串结构)的方法,有点像字符串的模板,常常用作按照“给定模式”匹配文本的工具。下面通过本文给大家分享js 中的regexp对象,需要的朋友参考下吧
    2017-09-09
  • 20170918 前端开发周报之JS前端开发必看

    20170918 前端开发周报之JS前端开发必看

    本文给大家分享了最新版js 前端开发周报,内容非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-09-09
  • JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)

    JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)

    本篇文章主要介绍了JS获取屏幕,浏览器窗口大小,网页高度宽度的实现代码。需要的朋友可以过来参考下,希望对大家有所帮助
    2013-12-12

最新评论