eyeon项目总结 音频转换 amr->mp3 web项目路径实践经验(血泪史)

来点感慨:
不到最后关头总是不想去解决一些较为麻烦的事情,今天解决的问题都是之前项目中的盲点,一直不想去解决。一整天的时间,解决的问题不多,而且没有效率,不过发现的问题不尝试去解决,总结会使问题。所以我就来写博客了,希望大家忽略这段哈,重点在下面。

问题一:音频文件的装换 列子 amr->mp3

问题来源:微信录音之后的语音信息存储格式为amr,而amr文件在网页上不好播放,所以需要进行转码

解决方式:当然是调用jar包了,只不过java 调用的 jave(没错 是 e) 存在一些问题(无关紧要了),但是跨平台方面就有比较大的问题了,在linux下面自己直接用java调用了系统命令。
先上代码了 windows
package cn.edu.dlmu.wechat.bean;
import it.sauronsoftware.jave.AudioAttributes;
import it.sauronsoftware.jave.Encoder;
import it.sauronsoftware.jave.EncoderException;
import it.sauronsoftware.jave.EncodingAttributes;
import it.sauronsoftware.jave.InputFormatException;
import java.io.File;
public class ChangeAudioFormat {
    public static void changeToMp3(String sourcePath, String targetPath) {
        File source = new File(sourcePath);
        File target = new File(targetPath);
        AudioAttributes audio = new AudioAttributes();
        Encoder encoder = new Encoder();
        audio.setCodec("libmp3lame");
        EncodingAttributes attrs = new EncodingAttributes();
        attrs.setFormat("mp3");
        attrs.setAudioAttributes(audio);

        try {
            encoder.encode(source, target, attrs);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InputFormatException e) {
            e.printStackTrace();
        } catch (EncoderException e) {
            System.out.println("有错但是成功转换了");
        }
    }
}
备注:这代码也是自己从网上找的,但是亲测有效,只不过把EncoderException 拦截了,因为成功转码了,报的错误就没那么重要了。——>>>>jave官方下载地址
linux代码
import it.sauronsoftware.jave.EncoderException;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
    public static void main(String[] args) {
        String sPath = "./arm/test.amr";
        String tPath = "./mp3/test.mp3";
        try {
            new Main().changeAmrToMp3(sPath,tPath);
        } catch (EncoderException e) {
            e.printStackTrace();
        }
    }

    public void changeAmrToMp3(String sourcePath, String targetPath) throws IllegalArgumentException, EncoderException {
        String webroot = "";
        Runtime run = null;
        try {
            run = Runtime.getRuntime();
            long start=System.currentTimeMillis();
            System.out.println(new File(webroot).getAbsolutePath());
            //执行ffmpeg.exe,前面是ffmpeg.exe的地址,中间是需要转换的文件地址,后面是转换后的文件地址。-i是转换方式,意思是可编码解码,mp3编码方式采用的是libmp3lame
            Process p=run.exec("ffmpeg -i "+sourcePath+" -acodec libmp3lame "+targetPath);
            //释放进程

            BufferedReader br1 = new BufferedReader(new OutputStreamWriter(p.getOutputStream()));

            p.getOutputStream().close();

            p.getInputStream().close();

            BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
            String line = null;
            //逐行读取输出到控制台
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }

            p.waitFor();
            long end=System.currentTimeMillis();
            System.out.println(sourcePath+" convert success, costs:"+(end-start)+"ms");
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            //run调用lame解码器最后释放内存
            run.freeMemory();
        }
    }
}
# 备注 这里需要 在linux上安装ffmpeg,其实在windows下面也是调用的ffmpeg只是被封装了而已,对于获取系统调用的输入输出流自己还不太明白,希望之后可以好好学学(有些童鞋可能会发向在命令行好使,在程序里面就不好使了,可能是因为缓存的原因)(不要怪自己,程序员本来就是为了应对这种理所当然的bug的)
问题二 java web 路径问题 使用的是jfinal 其他框架没有尝试

问题来源:由于项目需要,需要在项目中存取图片路径,刚开始自己使用的是绝对路径

项目目录是这样的

项目目录

想要吧 图图片数据存储到 (~)webapps/evidence/文件夹下面,当开始是在本地调试的没有布署,就直接使用绝对路径了 D:\jfinal-demo\jfinal-demo-web\src\main\webapp\evidence\
效果是达到了,但是部署到tomcat上之后发现,人家不认账,使用绝对路径不好使了,因为tomcat部署之后的路径是这样的D:\tomcat\webapps\jfinal-demo-web\evidence\
你可能会说,那就把绝对路径再改一下呗,你是认真的吗?你还是程序员吗?你难道想被领导臭骂吗?因为之歌项目之后还要部署到linux上,所以还是找一个解决办法吧!!!!

在这里我尝试了两种方法
第一种 使用 System.getProperties(“user.dir”); 获取当前的工作路径 path 然后使用path+/evidence来保存,一部署发现项目被存到了 D:\tomacat\bin\evidence下面了 (好气哦)
第二种方法 在控制器中找寻路径 因为这里想到 java web 工程部署到 tomcat下面之后其实主要的路径就只剩下webapp下面的了,其他的不是变成classes了就是不知道去哪里了
# 部署之后的路径:

部署之后的内容

后来终于领悟了其中的精髓 因为看到了一行代码 这样写的:
String path = getRequest().getSession().getServletContext().getRealPath("/evidence/tipreportMore");
哇 好长 !!!

解释一下:部署完成之后 “/”代表的就是项目的根目录,而evidence则为其下的需要存放图片的文件夹,只要获取到这个 ‘/’根目录下的文件夹的绝对路径就好 上面的方法就是起这个作用的。

这样就可以使用相对路径的 真实路径来 找到绝对路径了

最后再抱怨一下 微信开发是真的坑啊,在别人的基础上开发东西是真的难受。好像在在有限的时间里有很高的效率或者沉浸在自己喜欢的事情里!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
其实作为H5想要做语音识别,自认为还说有各种弊端得,同时还是微信公众号里面,如果小程序得话,或许会简单一点,但是这里是在公众号里面开发,在这个过程中查阅个各种资料,其实里面得东西都大同小异,但是大多数并不全, 首先微信公众号里面得H5开发语音录入,试过各种方法,由于是java渣渣,页面技术只是了解简单得,因此在使用标签得时候,本身并不能适用于当前得需求,因此最后只能选择了微信自带得录音功能,使用微信提供的接口,(具体得接口使用还是去看微信接口得使用) 由于使用微信得接口得话,首先要上传到它得服务器上面去(虽然也有本地得文件储存id,但是好像并没有用),这里就涉及到了一个serverid,这个值是存在于微信临时素材库得id,后期要用它来获取录音得文件。 通过微信提供得获取临时素材文件得接口,得到了文件(具体方法网上一搜一大堆,后期我也会将完整得代码放进资源里面),但是这里有一个坑得问题,他的格式为.amr得格式,但是最后的目的是转换为文字,因此这里涉及到了格式转换 主要用了现成得技术,也是通过下载资源获取得jar以及实现得方法,将.amr转换为了MP3格式 然后就就是最后一部了,将mp3音频文件转换为文字,我这里用的是讯飞得技术,当然百度得也可以, 其实整个需求得这个流程已经完成了,但是不得不说里面遇到得坑,由于是渣渣,除了人们总说的,转换mp3得时候会报N/A得错误,我还遇到了unkowFormat这个错误。 这里只是记录一下自己在查询资料时没有一个符合自己需求得资料,同时也希望以后有这样需求得人,可以将思路捋的更加清楚,也可以进行交流.
分析这段代码的作用,逐句注释:<launch> <!-- set to value="gdbserver localhost:10000" for remote debugging --> <arg name="launch_prefix" default="" /> <!-- configure camera input --> <arg name="camera_name" default="mynteye" /> <arg name="image_topic" default="image_rect" /> <arg name="queue_size" default="1" /> <arg name="svo_file" default="" /> <!-- <arg name="svo_file" default="path/to/svo/file.svo"> --> <arg name="stream" default="" /> <!-- <arg name="stream" default="<ip_address>:<port>"> --> <!-- 相机名称 --> <arg name="camera_model" default="mynteye" /> <!-- 已经启动了所有的mynteye节点 --> <include file="$(find mynteye_wrapper_d)/launch/mynteye.launch"/> <!-- <node pkg="apriltag_ros" type="undersort_image_node" output="screen"> --> <node name="rviz" pkg="rviz" type="rviz" args="-d $(find mynteye_wrapper_d)/rviz/mynteye_withTags.rviz" output="screen"/> <!-- apriltag_ros continuous detection node --> <node pkg="apriltag_ros" type="apriltag_ros_continuous_node" name="apriltag_ros_continuous_node" clear_params="true" output="screen" launch-prefix="$(arg launch_prefix)"> <!-- Remap topics from those used in code to those on the ROS network --> <!-- 相机节点 --> <remap from="image_rect" to="/undistorted_image"/> <!-- <remap from="image_rect" to="//mynteye/left/image_color"/> --> <remap from="camera_info" to="/mynteye/left/camera_info" /> <param name="publish_tag_detections_image" type="bool" value="true" /><!-- default: false --> <param name="queue_size" type="int" value="$(arg queue_size)" /> <!-- load parameters (incl. tag family, tags, etc.) --> <rosparam command="load" file="$(find apriltag_ros)/config/settings.yaml"/> <rosparam command="load" file="$(find apriltag_ros)/config/tags.yaml"/> </node> </launch>
06-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值