JCODEC是否支持MPEG-TS或MPEG-PS

时间:2017-04-14 23:46:09

标签: java mpeg mpeg2-ts jcodec

我正在尝试从MPEG,MPEG-TS和MPEG-PS文件以及直播(网络/ UDP / RTP流)中挑选帧(视频和元数据)。我正在考虑使用JCODEC来做这件事,我开始试图使用FrameGrab / FrameGrab8Bit类,并遇到一个错误,这些格式“暂时不受支持”。我查看了一些提交,看看我是否可以使用旧代码,但看起来这两个文件分别自2103/2015以来“暂时不支持”这些格式。

然后我尝试通过输入以下代码将内容插回到FrameGrab8Bit类中......

public static FrameGrab8Bit createFrameGrab8Bit(SeekableByteChannel in) throws IOException, JCodecException {
...
SeekableDemuxerTrack videoTrack = null;
...
case MPEG_PS:
   MPSDemuxer psd = new MPSDemuxer(in);
   List tracks = psd.getVideoTracks();
   videoTrack = (SeekableDemuxerTrack)tracks.get(0);
   break;
case MPEG_TS:
   in.setPosition(0);
   MTSDemuxer tsd = new MTSDemuxer(in);
   ReadableByteChannel program = tsd.getProgram(481);
   MPSDemuxer ptsd = new MPSDemuxer(program);
   List<MPEGDemuxerTrack> tstracks = ptsd.getVideoTracks();
   MPEGDemuxerTrack muxtrack = tstracks.get(0); 
   videoTrack = (SeekableDemuxerTrack)tstracks.get(0);
   break;
...

但是我在parsePacket函数的MTSDemuxer.java类中遇到了数据包头断言失败:

public static MTSPacket parsePacket(ByteBuffer buffer) {
   int marker = buffer.get() & 0xff;
   int marker = by & 0xff;
   Assert.assertEquals(0x47, marker);
...

我发现当我重置可搜索字节通道的位置(即:in.setPosition(0))时,代码会使其超过断言,但在videoTrack = (SeekableDemuxerTrack)tstracks.get(0)时失败(tstracks.get(0)不能转换为SeekableDemuxerTrack)

我在等我的时间吗?这些格式是否在图书馆的某个地方得到支持,而我却找不到它们?

此外,在完成代码并制作快速测试应用程序之后,似乎所有你从多路分离器中获得的都是视频帧。有没有办法获得与视频帧相关的元数据帧?

供参考,我使用的是http://samples.ffmpeg.org/MPEG2/mpegts-klv/

中的测试文件

1 个答案:

答案 0 :(得分:2)

如果将来有人也有这个问题。我从项目开发人员的GitHub页面得到了这个问题的回复。响应:

  

是的,MP4不支持MPEG TS。您无法在TS流中寻找(除非您事先索引整个流)。

我还询问了如何实现该功能。我认为可以通过重新编写MekDemuxer类来构建SeekableDemuxerTrack,以便与FrameGrab8Bit类兼容,并获得以下响应:

  

因此,在SeekableDemuxerTrack之上实现TS demuxer并不是很有意义。我们实际上并没有太多关注TS demuxer,所以任何输入都是非常受欢迎的。

我认为这(从SeekableDemuxerTrack接口构建MTSDemuxer类)可以用于文件(因为你已经拥有了所有内容)。但是如果没有完全充实这种想法,我无法肯定地说(这种解决方案无法用于实时MPEG-TS / PS连接,这绝对是有道理的。)