在这里,我尝试使用Libav的avconv工具对来自Flash Media Server的实时rtmp流进行编码并广播低比特率流。 Libav 安装在 Ubuntu 操作系统上。编码流仅运行 8 分钟。由于avconv工具是通过使用java运行时环境启动的。 Java 代码如下 -
public class RunnableStream implements Runnable
{
String inStream,outStream,width,height,bitRate,frameRate,fname,line,ar,audioBitRate,audioChannel;
public RunnableStream(String fname,String inStream,String outStream,String ar,String audioBitRate,String audioChannel,String width,String height,String bitRate,String frameRate)
{
this.fname=fname;
this.inStream=inStream;
this.outStream=outStream;
this.width=width;
this.height=height;
this.bitRate=bitRate;
this.frameRate=frameRate;
this.ar=ar;
this.audioBitRate=audioBitRate;
this.audioChannel=audioChannel;
}
public void run() {
Process pr;
try {
pr = Runtime.getRuntime().exec("avconv -async 15 -i "+inStream+" -shortest -s "+width +"*"+height +" -r " +frameRate+" -b:v "+bitRate+" -ab "+audioBitRate+" -ac "+audioChannel+" -ar "+ar+" -f flv "+outStream);
InputStream in1 = pr.getInputStream();
InputStream in = pr.getErrorStream();
int c1;
while ((c1 = in1.read()) != -1)
{
System.out.print((char)c1);
}
int c;
while ((c = in.read()) != -1)
{
System.out.print((char)c);
}
pr.waitFor();
in.close();
in1.close();
}catch(Exception e){e.printStackTrace();}
}
}
但是当相同的编码方案或命令直接应用于命令提示符时,它可以运行至少 1 小时。命令行语句如下 -
avconv -async 15 -i rtmp://IP/live/streamname -shortest -s 176*144 -r 10 -b:v 56k -ab 12k -ac 1 -ar 22050 -f flv rtmp://IP/live/streamname2
最佳答案
我假设这段代码是为了从进程中排出 stdout/stderr:
int c1;
while ((c1 = in1.read()) != -1)
{
System.out.print((char)c1);
}
int c;
while ((c = in.read()) != -1)
{
System.out.print((char)c);
}
不幸的是,它实际上只会从 in1
(stdout) 读取,直到进程完成,然后它将从 in
(stderr )。这意味着如果进程向 stderr 写入的数据多于其缓冲区可容纳的数据,它将阻塞 - 准确地展示您所看到的行为。这不是绝对的原因,但对我来说似乎很可能。
基本上,您应该在不同的线程中读取这些流 - 这样您就可以从两个流中读取数据,而无需等待进程完成。
关于java - 从 Java 运行时执行的 avconv 工具在 8 分钟后停止编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21301247/