3

我试图能够从 MPEG、MPEG-TS 和 MPEG-PS 文件和实时流(网络/UDP/RTP 流)中挑选出帧(视频和元数据)。我正在考虑使用 JCODEC 来执行此操作,我首先尝试使用 FrameGrab / FrameGrab8Bit 类,但遇到了一个错误,即这些格式“暂时不受支持”。我研究了一些提交,看看我是否可以只使用旧代码,但看起来这两个文件自 2013 / 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/

4

1 回答 1

3

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

是的,在 MP4 的范围内不支持 MPEG TS。你不能真正在 TS 流中寻找(除非你事先索引整个流)。

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

因此,在 SeekableDemuxerTrack 之上实现 TS demuxer 似乎没有多大意义。我们实际上并没有过多关注 TS 解复用器,因此非常欢迎任何输入。

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

于 2017-04-19T17:08:13.757 回答