在Java中使用ffmpeg作为进程录制实时流

在Java中使用ffmpeg作为进程录制实时流,java,ffmpeg,Java,Ffmpeg,我不知道如何用Java启动用ffmpeg录制实时流的过程 我尝试了几种解决方案,但我当前的代码如下(简化): public void startDownload(){ 字符串[]进程args=新字符串[]{ “ffmpeg”, “-我”, "https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8", “-c”, “复制”, “-bsf:a”, “aac_adtstoasc”, “C:\\temp\\test.mp4” };

我不知道如何用Java启动用ffmpeg录制实时流的过程

我尝试了几种解决方案,但我当前的代码如下(简化):

public void startDownload(){
字符串[]进程args=新字符串[]{
“ffmpeg”,
“-我”,
"https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8", 
“-c”,
“复制”,
“-bsf:a”,
“aac_adtstoasc”,
“C:\\temp\\test.mp4”
};
ProcessBuilder ProcessBuilder=新的ProcessBuilder(processArgs);
试一试{
process=processBuilder.start();
process.wairFor();//我需要这个吗?实际上,流一直在运行,直到我手动停止它。
BufferedReader br=新的BufferedReader(新的InputStreamReader(process.getInputStream());
字符串行=null;
而((line=br.readLine())!=null){//这将永远阻塞
系统输出打印项次(行);
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
问题是,有些东西阻碍了这个过程的开始。在这个例子中,
br.readLine()
会永远阻塞它,我无法从这个过程中获得任何输出

但是在Intellij中终止jar/停止启动配置之后,流程开始工作,我必须通过任务管理器终止它

顺便说一句,运行一个不记录实时流的进程就像执行
ffmpeg
一样有效


我使用的是Windows、JDK 14、IntelliJ。

我可以自己解决。 您必须通过管道将输入流和输出流传输到
BufferedReader
,并且需要读取其所有行

我的代码当前如下所示:

public void startDownload(){
字符串[]进程args=新字符串[]{
“ffmpeg”,
“-我”,
"https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8", 
“-c”,
“复制”,
“-bsf:a”,
“aac_adtstoasc”,
“C:\\temp\\test.mp4”
};
ProcessBuilder ProcessBuilder=新的ProcessBuilder(processArgs);
process=processBuilder.start();
BufferedReader stdInput=新的BufferedReader(新的InputStreamReader(process.getInputStream());
BufferedReader stdError=新的BufferedReader(新的InputStreamReader(process.getErrorStream());
字符串行=”;
字符串newLineCharacter=System.getProperty(“line.separator”);
布尔值isOutReady=false;
布尔ISerorReady=false;
布尔isErrorOut=真;
布尔ISERRORROR=true;
布尔值isPrintToConsole=false;
while(process.isAlive()){
做{
isOutReady=stdInput.ready();
isErrorOut=真;
iSeries错误=真;
if(isOutReady){
line=stdInput.readLine();
isErrorOut=错误;
if(isPrintToConsole){
System.out.println(行+换行符);
}
}
ISerorReady=stdError.ready();
如果(iSeries准备就绪){
line=stdError.readLine();
iSeries错误=错误;
if(isPrintToConsole){
System.out.println(“错误:“+行+换行符”);
}
}
如果(!process.isAlive()){
if(isPrintToConsole){
System.out.println(“过程模具:“+行+换行符”);
}
行=空;
iSeries错误=错误;
process.waitFor();
}
}while(line!=null);
waitFor(100,时间单位毫秒);
}
}