我正在尝试从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)
我在等我的时间吗?这些格式是否在图书馆的某个地方得到支持,而我却找不到它们?
此外,在完成代码并制作快速测试应用程序之后,似乎所有你从多路分离器中获得的都是视频帧。有没有办法获得与视频帧相关的元数据帧?
中的测试文件答案 0 :(得分:2)
如果将来有人也有这个问题。我从项目开发人员的GitHub页面得到了这个问题的回复。响应:
是的,MP4不支持MPEG TS。您无法在TS流中寻找(除非您事先索引整个流)。
我还询问了如何实现该功能。我认为可以通过重新编写MekDemuxer类来构建SeekableDemuxerTrack,以便与FrameGrab8Bit类兼容,并获得以下响应:
因此,在SeekableDemuxerTrack之上实现TS demuxer并不是很有意义。我们实际上并没有太多关注TS demuxer,所以任何输入都是非常受欢迎的。
我认为这(从SeekableDemuxerTrack接口构建MTSDemuxer类)可以用于文件(因为你已经拥有了所有内容)。但是如果没有完全充实这种想法,我无法肯定地说(这种解决方案无法用于实时MPEG-TS / PS连接,这绝对是有道理的。)