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

标签 java video-streaming libav

在这里,我尝试使用Libavavconv工具对来自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/

相关文章:

java - CompassADFAdaptor 类型中的错误 : The method convertProspectIds(Map<String, String>) 不适用于参数 (List<String>)

ruby-on-rails - 回形针视频倾斜(不保持纵横比)

android - 在android中将视频流式传输到网络

ffmpeg - libav* 解码不正确

ffmpeg - 如何获取DVD中的标题和章节信息?

audio - Libav API : How to modify the start time of an audio stream?

java - Android 本地通知不适用于三星 Galaxy

java - 处理自定义 header 中的 jsessionid (Tomcat 6)

python-3.x - 使用 Python OpenCV 和 GStreamer 从 UDP 接收器读取 RTSP 流

java - Java 播放多媒体