Инструмент для транскодирования аудио, в основном используемый для преобразования формата голосового amr WeChat в формат mp3 для воспроизведения в аудиотеге html5.
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
принцип
- Определите текущую операционную среду во время инициализации и скопируйте соответствующий исполняемый файл ffmpeg из каталога bin во временный каталог.
- Выполните команду транскодирования, соответствующую ffmpeg, через Runtime.getRuntime().exec(cmd) в соответствии с типом файла и конфигурацией.
Проблемы с проектом JAVE
ffmpeg зависит от операционной среды.Проект JAVE инкапсулирует ffmpeg, что позволяет java вызывать ffmpeg и поддерживает кроссплатформенность с помощью вышеуказанных принципов.
- Проект старый и больше не поддерживается. Последняя версия официального сайта была выпущена в 2009 году, а ffmpeg, на который она опирается, устарел и во многих случаях не может быть использован.
- Транскодирование продолжает сообщать об исключении EncoderException: сопоставление потоков
- Репозиторий maven не выпущен, и сам JAVE не является проектом maven.
- Мак не поддерживается
Особенности этого проекта
Этот проект родился для решения вышеуказанных проблем.
- Это проект maven, который публикуется вцентральный склад.
- Проверяется доступность исполняемого файла ffmpeg, от которого зависит проект (в модульном тесте предусмотрен простой метод проверки).
- Решено EncoderException: сопоставление потоков, возникающее при преобразовании amr в mp3.
- Поддержка платформы Linux/Windows/Mac
расширять
Если программа не может получить исполняемый файл ffmpeg путем копирования файла ресурсов или встроенный ffmpeg не поддерживает используемую вами операционную систему
Вы можете установить его через переменные среды или в javaSystem.setProperty("ffmpeg.home", "ffmpeg可执行文件所在的目录")
способ указать каталог доступных файлов ffmpeg, установленных в вашей системе
как System.setProperty("ffmpeg.home", "/usr/local/bin/")