在这里,我试图编码来自Flash的实时rtmp流,并使用avconv工具Libav广播低比特率流。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发布于 2014-01-23 06:52:44
我假设这段代码是用来从进程中提取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写入的数据超出其缓冲区所能容纳的范围,它就会阻塞--准确地显示您所看到的行为。这肯定不是原因,但在我看来可能是这样。
基本上,您应该在不同的线程中读取这些流-这样您就可以从这两个流中读取,而不必等待进程完成。
发布于 2014-01-23 08:19:57
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);
StreamGobbler errorGobbler = new StreamGobbler(pr.getErrorStream(), "ERROR");
StreamGobbler outputGobbler = new StreamGobbler(pr.getInputStream(), "OUTPUT");
errorGobbler.start();
outputGobbler.start();
int exitVal = pr.waitFor();
System.out.println("ExitValue: " + exitVal);
}catch(Exception e){e.printStackTrace();}
}
}
class StreamGobbler extends Thread {
InputStream is;
String type;
StreamGobbler(InputStream is, String type) {
this.is = is;
this.type = type;
}
public void run() {
try {
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line=null;
while ( (line = br.readLine()) != null)
System.out.println(type + ">" + line);
} catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}
}https://stackoverflow.com/questions/21301247
复制相似问题