要做一个录音功能 拾音器支持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("###读取线程结束啦###");
}
}