我正试图从MPEG、MPEG-TS和MPEG-PS文件以及活动流(network / 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;
...但是,我在MTSDemuxer.java类中遇到了parsePacket函数中的数据包头断言失败:
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/的测试文件
发布于 2017-04-19 17:08:13
万一将来有人也有这个问题。在项目的GitHub页面上,我收到了一个开发人员对这个问题的答复。响应:
是的,MPEG TS不受MP4的支持。您不能在TS流中进行真正的搜索(除非在手动之前对整个流进行索引)。
我还询问了如何实现该功能。我认为可以通过重新处理要从MTSDemuxer构建的SeekableDemuxerTrack类来实现,这样就可以与FrameGrab8Bit类兼容,并得到以下响应:
因此,在SeekableDemuxerTrack上实现TS demuxer似乎没有多大意义。我们实际上并没有对TS演示器给予太多的关注,所以任何输入都是非常欢迎的。
我认为这(在SeekableDemuxerTrack接口上构建SeekableDemuxerTrack类)将适用于文件(因为您已经拥有了所有的东西)。但是,如果没有充分阐述这一想法,我就不能肯定地说(这个解决方案对于MPEG-TS / PS连接来说是行不通的)。
https://stackoverflow.com/questions/43420618
复制相似问题