我试图能够从 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/