Java JCODEC支持MPEG-TS还是MPEG-PS

Java JCODEC支持MPEG-TS还是MPEG-PS,java,mpeg,mpeg2-ts,jcodec,Java,Mpeg,Mpeg2 Ts,Jcodec,我正在尝试从MPEG、MPEG-TS和MPEG-PS文件以及实时流(网络/UDP/RTP流)中挑选帧(视频和元数据)。我正在研究使用JCODEC来实现这一点,我开始尝试使用FrameGrab/FrameGrab8Bit类,但遇到了一个错误,即这些格式“暂时不受支持”。我查看了一些提交,看看是否可以只使用旧代码,但看起来这两个文件的格式从2013/2015年以来都“暂时不受支持” 然后,我尝试通过输入以下代码将东西插回到FrameGrabb8bit类中 public static FrameGra

我正在尝试从MPEG、MPEG-TS和MPEG-PS文件以及实时流(网络/UDP/RTP流)中挑选帧(视频和元数据)。我正在研究使用JCODEC来实现这一点,我开始尝试使用FrameGrab/FrameGrab8Bit类,但遇到了一个错误,即这些格式“暂时不受支持”。我查看了一些提交,看看是否可以只使用旧代码,但看起来这两个文件的格式从2013/2015年以来都“暂时不受支持”

然后,我尝试通过输入以下代码将东西插回到FrameGrabb8bit类中

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;
...
我发现,当我重置可查找字节通道的位置时(即:
in.setPosition(0)
),代码通过了断言,但在
videoTrack=(seekabledemuxerack)tstracks.get(0)
tstracks.get(0)
无法转换为可查找的emuxerack)

我在浪费时间吗?库中的某个地方是否支持这些格式,而我却找不到它们

此外,在编写代码并制作快速测试应用程序之后,似乎从解复用器中得到的只是视频帧。是否无法获取与视频帧关联的元数据帧


作为参考,我使用的测试文件来自:

,以防将来有人也有这个问题。我在项目的GitHub页面上收到了一位开发人员对这个问题的回复。答复:

是的,MPEG TS不受MP4的支持。您无法在TS流中进行真正的搜索(除非您事先对整个流进行索引)

我还询问了如何实现该功能。我认为可以通过修改MTSDemuxer类来实现,该类将在SeekableDemuxerTrack的基础上构建,以便与FrameGrab8Bit类兼容,并得到以下响应:

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


我认为这(在SeekableDemuxerTrack接口上构建MTSDemuxer类)可以用于文件(因为您已经拥有了所有内容)。但是,如果没有充分充实这一思想,我就无法确定(这个解决方案对于实时MPEG-TS/PS连接来说显然是不可行的)。

有人猜测可以用java处理实时MPEG-TS/PS吗?@Bender抱歉,但没有。该项目从未通过处理文件中的TS流。
public static MTSPacket parsePacket(ByteBuffer buffer) {
   int marker = buffer.get() & 0xff;
   int marker = by & 0xff;
   Assert.assertEquals(0x47, marker);
...