我正在制作一个可播放MPEG-TS流的播放器,并使用Xuggler for JAVA在一帧中一次显示所有视频(用于监控目的)。
我的问题是要确定这个流所拥有的节目(电视节目)以及它的流是什么......
例如:音频流1和视频流3属于节目“BBC”。
现在我已经通过使用MediaInfo http://mediaarea.net/en/MediaInfo/来使用.ts文件了:
MediaInfo.exe -LogFile =“log.txt”“some .ts file”....它记录了这样的文件:
Menu #2
ID : 1001 (0x3E9)
Menu ID : 1202 (0x4B2)
Duration : 13mn 33s
List : 2001 (0x7D1) (MPEG Video) / 3002 (0xBBA) (MPEG Audio, English)
Language : / English
Service name : NBN
Service provider : NILESAT
Service type : digital television
UTC 2006-03-28 00:00:00 : en:NBN / en:Nilesat / / / 99:00:00 / Running
然后我在java
中解析了该文件但是我需要为实时流做这项工作,当我给MediaInfo一个URL而不是一个文件时,它会给出这个错误:
Libcurl library not found
我也尝试过vlc命令,但事实证明它没有这个选项,只能在gui中使用(显示编解码器信息)......
玩家已经在工作了,我也得到了一个提取器......只需要这个媒体信息就可以了...任何想法?
编辑:我发现FFprobe与FFmpeg捆绑http://www.ffmpeg.org/可以完成任务 但由于某种原因,我无法从输入流中读取任何内容 这是输出的样子:Input #0, mpegts, from 'D:\record ts\PBR_REC_20140426094852_484.ts':
Duration: N/A, start: 6164.538011, bitrate: N/A
Program 1201
Metadata:
service_name : Arabica TV
service_provider: Nilesat
Stream #0:10[0x7db]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv42
0p(tv), 720x576 [SAR 16:15 DAR 4:3], max. 2348 kb/s, 25 fps, 25 tbr, 90k tbn, 50
tbc
Stream #0:4[0xbcf]: Audio: mp2, 48000 Hz, stereo, s16p, 384 kb/s
Program 1202
我在JAVA中试过这个:
try {
Process process ;
Scanner sc;
ProcessBuilder processBuilder = new ProcessBuilder("C:\\Users\\vlatkozelka\\Desktop\\ffmpeg-20140623-git-ca35037-win64-static\\bin\\ffprobe.exe","-i",filename);
process=processBuilder.start();
sc=new Scanner(process.getInputStream());
process=processBuilder.start();
while(sc.hasNext()){
System.out.println(sc.nextLine());
}
} catch (IOException ex) {
Logger.getLogger(ChannelDivider.class.getName()).log(Level.SEVERE, null, ex);
}
但sc.hasNext()只是挂起就像没有输入一样 然后我尝试使用>写入带有cmd的文件;但它给了我一个空白的文件
然而尝试使用FFprobe -h(帮助命令)的两种方法确实给出了非常令我困惑的输出,我看到cmd中的输出但是无法读取它...请帮助
提前致谢
答案 0 :(得分:0)
我刚刚解决了这个问题,希望有人可以使用它: 事实证明,FFprobe写的是stderr,而不是stdout, 所以代替:
getInputStream()
我用过:
getErrorStream()
现在我所要做的就是解析:)