2014-09-30 2 views
0

I 미디어 (파일/라이브 스트림 ...) 프로빙 FFprobe라는 프로그램을 갖고 출력을 읽고, 예를 들어, 다른 포맷의 결과 :EXE 파일을 실행하고 OutputStream에

ffprobe.exe -i test.ts -print_format xml -show_programs 

이 출력을 제공한다 :

<?xml version="1.0" encoding="UTF-8"?> 
<ffprobe> 
    <programs> 
     <program program_id="1201" program_num="1201" nb_streams="2" pmt_pid="1000" pcr_pid="2011" start_pts="45394227044" start_time="45394.227044"> 
      <tag key="service_name" value="Arabica TV"/> 
      <tag key="service_provider" value="Nilesat"/> 
      <streams> 
       <stream index="10" codec_name="mpeg2video" codec_long_name="MPEG-2 video" profile="Main" codec_type="video" codec_time_base="1/50" codec_tag_string="[2][0][0][0]" codec_tag="0x0002" width="720" height="576" has_b_frames="1" sample_aspect_ratio="16:15" display_aspect_ratio="4:3" pix_fmt="yuv420p" level="8" timecode="08:28:54:09" id="0x7db" r_frame_rate="25/1" avg_frame_rate="25/1" time_base="1/90000" start_pts="4085542516" start_time="45394.916844" max_bit_rate="2348000"> 
        <disposition default="0" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0"/> 
       </stream> 
       <stream index="4" codec_name="mp2" codec_long_name="MP2 (MPEG audio layer 2)" codec_type="audio" codec_time_base="1/48000" codec_tag_string="[0][0][0][0]" codec_tag="0x0000" sample_fmt="s16p" sample_rate="48000" channels="2" channel_layout="stereo" bits_per_sample="0" id="0xbcf" r_frame_rate="0/0" avg_frame_rate="0/0" time_base="1/90000" start_pts="4085480434" start_time="45394.227044" bit_rate="384000"> 
        <disposition default="0" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0"/> 
       </stream> 
      </streams> 
     </program> 
... more programs 

내가 결과가 확인되면 파일에 다음 ProcessBuilder를하고 스캐너 및 ID 쓰기를 사용하여 자바에서이 정보를 검색 할 수 있습니다 ...하지만 그런게 :

Process proc = new ProcessBuilder("ffprobe.exe","-i", ... same arguments); 
Scanner sc = new Scanner (proc.getInputStream()) // im 100% sure its not errorStream 
while(sc.hasNext()){ 
    System.out.println(sc.nextLine()); 
} 

응용 프로그램이 출력이 끊어지기 만하면 프로세스가 계속 실행 중이며 스캐너가 다음에 처리된다는 것을 알지만 왜 그럴 수 있는지 알 수 없습니다. 결과 및 ofc ">"로 파일에 쓸 수 있습니다

Ive는 -print_format 옵션을 사용하지 않고 오류 스트림의 일반 텍스트 정보를 제공합니다. (나는 그 오류를 알고 있습니다. 2> not >>), 그리고 자바에서 오류 스트림을 읽을 수 있지만 아주 아주 unorganized 사촌을 구문 분석을위한 것이 아닙니다.

Input #0, mpegts, from 'PBR_REC_20140426094852_486.ts': 
    Duration: 00:13:34.30, start: 7791.344722, bitrate: 42154 kb/s 
    Program 1201 
    Metadata: 
     service_name : Arabica TV 
     service_provider: Nilesat 
    Stream #0:19[0x7db]: Video: mpeg2video (Main) ([2][0][0][0]/0x0002), yuv420p(tv), 720x576 [SAR 16:15 DAR 4:3], max. 2348 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc 
    Stream #0:3[0xbcf]: Audio: mp2, 48000 Hz, stereo, s16p, 384 kb/s 
    Program 1202 
    Metadata: 
     service_name : NBN 
     service_provider: NILESAT 
    Stream #0:10[0x7d1]: Video: mpeg2video (Main) ([2][0][0][0]/0x0002), yuv420p(tv), 720x576 [SAR 16:15 DAR 4:3], max. 2600 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc 
    Stream #0:11[0xbba](eng): Audio: mp2 ([3][0][0][0]/0x0003), 48000 Hz, stereo, s16p, 125 kb/s 
    Program 1203 
    Metadata: 
     service_name : Heya TV 
     service_provider: NILESAT 
    Stream #0:5[0x7d2]: Video: mpeg2video (Main) ([2][0][0][0]/0x0002), yuv420p(tv), 720x576 [SAR 16:15 DAR 4:3], max. 2600 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc 
    Stream #0:6[0xbbc](eng): Audio: mp2 ([3][0][0][0]/0x0003), 48000 Hz, mono, s16p, 125 kb/s 
    Program 1204 ... more programs 

지금은 조직 보일 수 있습니다 및 "분석 - 수"그리고 난 실제로 어떤 시점에 일을 파서를 만들었지 만, 경우에 따라서는이 구조에 충실 나던와 나는 XML을 필요로 그 이유를 전체 구문 분석, 유적/json ...

-print_format은 출력 스트림으로 출력됩니다.

Im이 장소의 목적이 아닌 FFprobe를 사용하는 방법에 대한 도움을 요청하지 않고, Windows에서 실행되는 동안 출력 스트림이 java에서 출력 스트림을 가져올 수없는 이유를 묻는 질문에 Im.

나는 processbuilder가 고통 스러울 수도 있다는 것을 알고 있기 때문에 아파치 commons-exec를 시도했다. 완벽하게 실행되었고 System.in (intput과 red는 오류 용)에서 보였지만 아파치로 스트림을 얻는 것은 불가능했다. 이해가 안돼, 내가 이것을 시도 example

xisp 파서는 이미 돌봐, 난 단지 자바에서 첫 번째 명령을 실행하고 출력을 읽을 필요가 있지만 넣어 몇 가지 이유가 작동하지 않습니다. 당신은 당신이 그렇지 않으면이 과정을 차단하여 소비 할 필요가 오류 스트림을 인쇄 할 수 없다하더라도

public static void runProcess(ProcessBuilder pb) throws IOException { 
    pb.redirectErrorStream(true); 
    Process p = pb.start(); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    String line; 
    while ((line = reader.readLine()) != null) { 
     System.out.println(line); 
    } 
} 

:

+0

ffprobe 프로세스가 표준 입력을 기다리고있을 수 있습니다. 이것을 고치는 가장 쉬운 방법은 프로세스를 시작하기 전에 ProcessBuilder에서'redirectInput (ProcessBuilder.Redirect.INHERIT)'를 호출하는 것입니다. – VGR

+0

@ VGR, 그게 작동하지 않았다 – vlatkozelka

답변

1

나는 일반적으로이 유틸리티 방법의 변형을 사용합니다. 어떤 경우에는 별도의 스레드에서 소비하고 메인 스레드의 입력 스트림 만 인쇄해야합니다.

+0

이 시도를 포기하지만 어떻게이 일을하고있는 다른 무엇입니까? – vlatkozelka

+0

잘 작동했지만 오류 및 inputstream (혼합)을 출력하고 있으며, 내가했던 것과 기본적으로 다른 방법을 설명 할 수 있습니까? BufferedReader를 사용했습니다. 스캐너를 사용했습니다. – vlatkozelka

+1

@vlatkozelka는 버전 작업을 수행합니다. 오류 스트림을 리디렉션 하시겠습니까? 오류 스트림을 인쇄하고 싶지 않더라도 소비해야하는 경우에는 프로세스를 차단합니다. 어떤 경우에는 별도의 스레드에서 소비하고 메인 스레드의 입력 스트림 만 인쇄해야합니다. – assylias

관련 문제