java的lame类库将raw格式转为mp3格式

此文为原创,转载请征得本人同意并且在显眼位置标明本文链接

最近一个项目,需要使用java将未处理的raw格式转为mp3格式,网上找了好多案例均不可转raw格式,连格式工厂都不可以转。这个格式真的是太古老了,无奈之下老板亲自动手写了一段代码,通过jni之后调用命令行来进行转换,此文记录一路踩坑填坑,无兴趣者可直接跳转文末下载最终代码。
话不多说,下面上代码。

public static void main(String[] args) {
    String rawPath = "F:/raw.raw";
    String mp3Path = rawPath.replace(".raw", ".mp3");
try {  
  String command = "F:/lame.exe  -r "+rawPath+" -s 15 -m m " + mp3Path;  
  Process process = Runtime.getRuntime().exec(command);
} catch (Throwable e) {  
  e.printStackTrace();  
 } 

此段代码即可实现通过lame.exe将raw格式转为mp3。
可将command在命令行运行即可观察效果。
但此时会有一个问题即为 process为异步执行,在运行时此段代码时,raw文件正在进行转换操作,但是后面代码已经需要调用转换完成的MP3文件,此时会拿不到文件。一顿谷歌之后,发现有大神给出解决办法,

 int waitFor = process.waitFor();

在执行完process后,调用此行代码,则可使程序等待该方法执行完成之后再继续运行。但此时会出现程序到此步骤则停止运行问题,查询资料后发现问题。

jdk官方文档
如有必要,一直要等到由该 Process 对象表示的进程已经终止。如果已终止该子进程,此方法立即返回。但是直接调用这个方法会导致当前线程阻塞,直到退出子进程。
因为本地的系统对标准输入和输出所提供的缓冲池有效,所以错误的对标准输出快速的写入何从标准输入快速的读入都有可能造成子进程的所,甚至死锁。

简单来说,就是主进程需要等待子进程process方法执行完成,所以主进程调用Process.waitfor等待子进程完成。子进程的过程就是不断打印信息(在命令行执行可以查看),主进程中可以通过Process.getInputStream和Process.getErrorStream来进行查看。
此时,子进程不断向主进程发送数据,但此时主进程已经挂起,当子进程和主进程之间缓冲区塞满后,子进程无法发送数据,也会挂起。
这样主进程等待子进程结束执行,子进程等待主进程处理数据,双方互相等待,最终导致死锁。

所以要解决如上问题,只需要在主进程挂起之前,不断处理子进程发送的数据就可以避免此种情况,所以我们在挂起之前再开启如下两个进程。

    new Thread() {
                @Override
                public void run() {
                    BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
                    String line = null;

                    try {
                        while ((line = in.readLine()) != null) {
                            // System.out.println("output: " + line);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        try {
                            in.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }.start();

            new Thread() {
                @Override
                public void run() {
                    BufferedReader err = new BufferedReader(new InputStreamReader(process.getErrorStream()));
                    String line = null;

                    try {
                        while ((line = err.readLine()) != null) {
                            // System.out.println("err: " + line);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        try {
                            
                            err.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }

            }.start();

此时该段代码则可使用。此bug据我所知目前尚无其他解决办法。如有需要只能先如此使用。
lame.exe及完整代码下载:mxno
github地址
如果能有个star我是超级开心的了。

此文为原创,转载请征得本人同意并且在显眼位置标明本文链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351