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);
}
}
:
ffprobe 프로세스가 표준 입력을 기다리고있을 수 있습니다. 이것을 고치는 가장 쉬운 방법은 프로세스를 시작하기 전에 ProcessBuilder에서'redirectInput (ProcessBuilder.Redirect.INHERIT)'를 호출하는 것입니다. – VGR
@ VGR, 그게 작동하지 않았다 – vlatkozelka