首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Java运行时执行的avconv工具在8分钟后停止编码

从Java运行时执行的avconv工具在8分钟后停止编码
EN

Stack Overflow用户
提问于 2014-01-23 06:47:59
回答 2查看 770关注 0票数 0

在这里,我试图编码来自Flash的实时rtmp流,并使用avconv工具Libav广播低比特率流。Libav安装在Ubuntu 上。编码流只运行8分钟。作为avconv工具是通过使用java运行时环境启动的。以下是Java代码-

代码语言:javascript
复制
    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小时。命令行语句如下所示-

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2014-01-23 06:52:44

我假设这段代码是用来从进程中提取stdout/stderr的:

代码语言:javascript
复制
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写入的数据超出其缓冲区所能容纳的范围,它就会阻塞--准确地显示您所看到的行为。这肯定不是原因,但在我看来可能是这样。

基本上,您应该在不同的线程中读取这些流-这样您就可以从这两个流中读取,而不必等待进程完成。

票数 1
EN

Stack Overflow用户

发布于 2014-01-23 08:19:57

代码语言:javascript
复制
    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();   
                  } 
        } 
    } 
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21301247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档