Поддерживает ли JCODEC MPEG-TS или MPEG-PS?

Я пытаюсь выбрать кадры (видео и метаданные) из файлов 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;
...

но я столкнулся с ошибкой утверждения заголовка пакета в классе 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/


person AeroBuffalo    schedule 14.04.2017    source источник


Ответы (1)


На случай, если у кого-то в будущем возникнет этот вопрос. Я получил ответ от разработчика на странице проекта GitHub на этот вопрос. Ответ:

Да, MPEG TS не поддерживается в такой степени, как MP4. Вы не можете искать в потоках TS (если вы не проиндексируете весь поток заранее).

Я также спросил о том, как реализовать эту функцию. Я подумал, что это можно сделать, переработав класс MTSDemuxer, чтобы он был построен на основе SeekableDemuxerTrack, чтобы все было совместимо с классом FrameGrab8Bit, и получил следующий ответ:

Так что не похоже, что есть большой смысл реализовывать демультиплексор TS поверх SeekableDemuxerTrack. На самом деле мы не уделяли много внимания демультиплексору TS, так что любой отзыв приветствуется.

Я думаю, что это (построение класса MTSDemuxer из интерфейса SeekableDemuxerTrack) будет работать для файлов (поскольку у вас уже есть все). Но, не конкретизируя эту мысль полностью, я не мог сказать наверняка (определенно имеет смысл, что это решение не будет работать для живого соединения MPEG-TS/PS).

person AeroBuffalo    schedule 19.04.2017
comment
есть предположения, что можно было бы использовать для обработки живого MPEG-TS/PS с помощью java? - person Bender; 13.12.2019
comment
@ Бендер Извини, но нет. Проект так и не продвинулся, обработав поток TS из файла. - person AeroBuffalo; 14.12.2019