java - 获取MPEG-TS流媒体信息

标签 java video

我正在制作一个播放器,可以使用 Xuggler for JAVA 播放 MPEG-TS 流并在一帧中一次显示其所有视频(用于监视目的)。

我的问题是确定该流包含哪些节目(电视节目)以及它的流是什么......

例如:音频流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 中看到输出但无法读取它...

最佳答案

我刚刚解决了这个问题,希望有人可以利用它: 事实证明 FFprobe 正在写入 stderr,而不是 stdout, 所以而不是:

getInputStream()

我用过:

getErrorStream()

现在我所要做的就是解析它:)

关于java - 获取MPEG-TS流媒体信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24610913/

相关文章:

Java Spark 溢出内存映射 OutOfMemoryError 错误

Java 反射 API。如果内部类不是公共(public)的,则无法实例化内部类

video - FFMPEG : Obtain the system time corresponding to each frame present in a video

java - 如何获取视频/音频信息,例如持续时间和高度?

java - 如何将图像从一个 fragment 发送到另一个 fragment ?

java - 在 Java 中迭代日志文件。扫描拉取文件

video - ffmpeg 文字水印左下角

javascript - 使用 JavaScript 修改 DOM 元素属性

c - 如何使用 libogg 多路复用 Vorbis 和 Theora 流

Java创建Mac面板