2014-01-23 3 views
0

Здесь я пытаюсь кодировать поток живого RTMP приходит от сервера Flash Media Server и трансляции потока низкой скорости передачи бит с помощью avconv инструмента Libav. Libav установлен на Ubuntu OS. Закодированный поток работает для 8 минут. Поскольку инструмент avconv запускается с использованием среды времени java. Java код приведен ниже -avconv инструмента выполнен из Java во время выполнения остановки кодирования через 8 минут

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 
+0

Я понимаю, что это слишком поздно, но, возможно, этот проект будет полезен для вас: https://github.com/vbauer/avconv4java –

ответ

1

Я предполагаю, что это код предназначен для слива 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 (стандартного вывода) до тех пор, процесс завершен, затем будет читать от in (stderr). Это означает, что если процесс записывает больше данных в stderr, чем может вмещать буфер, он будет блокировать - демонстрируя именно то поведение, которое вы видите. Это не определенно причина, но, похоже, мне кажется.

Вы должны читать из этих потоков в разных потоках, в основном - таким образом вы будете читать от потоки как, не дожидаясь завершения процесса.

+0

Благодаря Sir.On основы вашего предположения я прочитал оба потока в два различные потоки, которые приводят к следующему ответу. Не сомневайтесь, если какой-либо недостаток будет покрыт. –

+0

@YuvrajKakkar: Только я не уверен, что стоит опубликовать в качестве ответа без каких-либо объяснительных текстов. (Ваше исключение «обработка» в целом не идеальна, но это другое дело.) Однако важно то, исправляет ли она проблему - не так ли? –

+0

Сэр, я собираюсь протестировать его по крайней мере через 2 часа. Тогда я дам вам знать. Но пока это приемлемо для 30-минутного видео –

0
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(); 
        } 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^