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

标签 java mpeg mpeg2-ts jcodec

我正在尝试能够从 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 类中遇到了数据包 header 断言失败:

public static MTSPacket parsePacket(ByteBuffer buffer) {
   int marker = buffer.get() & 0xff;
   int marker = by & 0xff;
   Assert.assertEquals(0x47, marker);
...

我发现,当我重置可搜索字节 channel 的位置时(即:in.setPosition(0)),代码使其通过断言,但随后在 videoTrack = (SeekableDemuxerTrack)tstracks.get(0) (tstracks.get(0) 无法转换为 SeekableDemuxerTrack)

我是在浪费时间吗?库中是否支持这些格式,我只是找不到它们?

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

作为引用,我使用的测试文件来自:http://samples.ffmpeg.org/MPEG2/mpegts-klv/

最佳答案

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

Yeah, MPEG TS is not supported to the extent MP4 is. You can't really seek in TS streams (unless you index the entire stream before hand).

我还询问了如何实现该功能。我认为这可以通过修改 MTSDemuxer 类来完成,该类是从 SeekableDemuxerTrack 构建的,这样事情就会与 FrameGrab8Bit 类兼容,并得到以下响应:

So it doesn't look like there's much sense to implement TS demuxer on top of SeekableDemuxerTrack. We haven't given much attention to TS demuxer actually, so any input is very welcome.

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

关于java - JCODEC 支持 MPEG-TS 还是 MPEG-PS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43420618/

相关文章:

java - 为什么引入 Autocloseable 而不是扩展 Closeable 中可能出现的异常

java - 写入图像后无法将响应 header 设置为 http 状态 302 的位置

html - 仅播放音频 HLS (m3u8) 和 MPEG DASH (mpd)

.net - 在 MonoTouch 上即时转换 MPEG 文件

c++ - MPEG2 演示时间戳 (PTS) 计算

java - 将 Java GUI 组件绘制到图像文件

java - 奇怪的数组返回类型

c++ - 尝试研究 shine MPEG Layer-III 编码器 - 获取 "redeclaration of C++ built-in type ' bool'"

ffmpeg - 如何通过 ffmpeg 将 .MTS 文件 (AVCHD) 转换为 .mp4,而无需正确重新编码 H264 视频流?

video-streaming - 如何在 Gstreamer 中使用 mpegtsmux 进行网络摄像头流式传输