java在linux下调用ffmpeg命令遇到的问题和解决办法

在命令行里直接执行ffmpeg没有问题,但用java调用就不行了。

原因是ffmpeg在linux的shell命令行下当然能执行(如果ffmpeg在/usr/bin下),但java调用的时候并不是shell模式,所以不能直接执行

解决办法:

请用完整的ffmpeg路径,另外需要使用shell命令执行。代码如下:

exec = Runtime.getRuntime().exec(new String[]{"sh","-c",cmd});
printProcessMsg(exec);
int i = exec.waitFor();

其中cmd是命令

下面是部分java代码:

if(os.indexOf("linux")>=0){
    cmd = cleanUpBean.getFfmpegBinPath()+File.separator+"ffmpeg -loglevel quiet -y -i \"concat:"+tsSplice+"\" -bsf:a aac_adtstoasc -acodec copy -vcodec copy -f mp4 "+alarmMp4DestPath+File.separator+mediaBean.getUuid()+".mp4";
    exec = Runtime.getRuntime().exec(new String[]{"sh","-c",cmd});
}else if(os.indexOf("windows")>=0){
    cmd = "cmd /c "+folderTsPath.substring(0,folderTsPath.indexOf(":")+1)+" && cd " + folderTsPath + " && "+cleanUpBean.getFfmpegBinPath()+File.separator+"ffmpeg.exe -loglevel quiet -y -i \"concat:"+tsSplice+"\" -bsf:a aac_adtstoasc -acodec copy -vcodec copy "+alarmMp4DestPath+File.separator+mediaBean.getUuid()+".mp4";
    exec = Runtime.getRuntime().exec(cmd);
}else{
    _log.warn("未知的操作系统:{}",os);
    return;
}
_log.info("ffmpeg copy cmd is: {}",cmd);
                printProcessMsg(exec);
                int i = exec.waitFor();
                _log.info("Process waitFor 返回结果:{}",i);

 

/**
 * 处理process输出流和错误流,防止进程阻塞,在process.waitFor();前调用
 * @param exec
 * @throws IOException
 */
private void printProcessMsg(Process exec) throws IOException {
    //防止ffmpeg进程塞满缓存造成死锁
    InputStream error = exec.getErrorStream();
    InputStream is = exec.getInputStream();

    StringBuffer result = new StringBuffer();
    String line = null;
    try {
        BufferedReader br = new BufferedReader(new InputStreamReader(error,"GBK"));
        BufferedReader br2 = new BufferedReader(new InputStreamReader(is,"GBK"));

        while((line = br.readLine()) != null){
            result.append(line+"\n");
        }
        _log.info("FFMPEG视频转换进程错误信息:"+result.toString());

        result = new StringBuffer();
        line = null;

        while((line = br2.readLine()) != null){
            result.append(line+"\n");
        }
        _log.info("FFMPEG视频转换进程输出内容为:"+result.toString());
    }catch (IOException e2){
        e2.printStackTrace();
    }finally {
        error.close();
        is.close();
    }

}
  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值