Поддерживает ли JCODEC MPEG-TS или MPEG-PS
Я пытаюсь выбрать кадры (видео и метаданные) из файлов 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;
...
но я столкнулся с ошибкой подтверждения заголовка пакета в классе 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/
1 ответ
На случай, если у кого-нибудь в будущем возникнет этот вопрос. Я получил ответ от разработчика на странице проекта GitHub на этот вопрос. Отклик:
Да, MPEG TS не поддерживается до такой степени, как MP4. Вы не можете действительно искать в потоках TS (если только вы не проиндексировали весь поток заранее).
Я также спросил о том, как реализовать эту функцию. Я подумал, что это можно сделать, переработав класс MTSDemuxer, который будет построен из SeekableDemuxerTrack, чтобы все было совместимо с классом FrameGrab8Bit, и получил следующий ответ:
Так что, похоже, нет смысла реализовывать демультиплексор TS поверх SeekableDemuxerTrack. На самом деле мы не уделяли большого внимания демультиплексору TS, поэтому любые отзывы приветствуются.
Я думаю, что это (создание класса MTSDemuxer из интерфейса SeekableDemuxerTrack) будет работать для файлов (так как у вас уже есть все). Но без полной реализации этой мысли я не могу сказать наверняка (определенно имеет смысл, что это решение не будет работать для живого соединения MPEG-TS / PS).