java 使用FFmpeg保存RTSP音频流

要做一个录音功能 拾音器支持RTSP流 网上找了个demo 稍微改了一下 有不对的地方希望大家指正


    import java.io.InputStream;
    import java.io.OutputStream;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Scanner;
     
    public class FFMPEGTest implements Runnable{
        InputStream in ; // 正常输出流
        boolean stop ; // 结束进程
        Process pro ;
        public FFMPEGTest(Process process, InputStream in ){
            this.in = in;
            this.pro = process;
        }
        public void setStop(boolean stop) {
            this.stop = stop;
        }
        public static void main(String[] args) throws Exception{
            System.out.println("###使用进程的方式进行编码###");
            // 1. 视频转换视频
              String rtspUrl = "rtsp://192.168.1.101/audiotracker_1";
              SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
              Date now = new Date();
              Date afterDate = new Date(now .getTime() + 300000);
              String dest = "D:/sound/"+sdf.format(now)+"——"+sdf.format(afterDate)+".mp3";
              System.out.println("+++++++++++++++++++"+dest);
              convert(rtspUrl, dest);
            
            System.out.println("###end###");
        }
     
        public static void convert(String src,String dest)throws Exception{
            String ffcmdpath = "D:\\ffmpeg\\bin\\ffmpeg.exe";
            StringBuilder cmd = new StringBuilder();
            cmd.append(ffcmdpath)
            .append(" -rtsp_transport tcp ") // 使用tcp的命令,默认是udp
            .append(" -i ").append(src)
            .append(" -allowed_media_types audio")//只获取音频
            .append(" -ac 1")
            .append(" -ar 16k")
            .append("-vol 512")//音量
            .append(" -format s16le ")
            .append(" -acodec libmp3lame")//MP3编码格式
            .append(" -y ") // 覆盖
            .append(dest);
            System.out.println("cmd="+cmd.toString());
            Process process = Runtime.getRuntime().exec(cmd.toString());
            // 输出内容
            FFMPEGTest twffIn = new FFMPEGTest(process, process.getInputStream());
            FFMPEGTest twffInErr = new FFMPEGTest(process,process.getErrorStream());
            Thread t = new Thread(twffIn);
            Thread t1 = new Thread(twffInErr);
            t.start();t1.start();
            Thread.sleep(30000);
            stopConvert(process);
            int i = process.waitFor(); // 一定要配合2个 inputstream ,要不然会一直阻塞
            twffIn.setStop(true);twffInErr.setStop(true); // 停止 线程
            
        }
        
        public static boolean stopConvert(Process process ){
            System.out.println("###send q cmd ");
            try{
                OutputStream os = process.getOutputStream();
                os.write("q".getBytes());
                os.flush(); // 一定要
            }catch(Exception err){
                err.printStackTrace();
                return false;
            }
            return true;
        }
        
        @Override
        public void run() {
            Scanner scanner = new Scanner(in);
            while(!stop){
                if(scanner.hasNext()){
                    String s = scanner.nextLine();
                    System.out.println(s);
                }else{
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
            scanner.close();
            System.out.println("###读取线程结束啦###");
        }
    }
 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值