Я пытаюсь создать свой собственный анализатор потоков, используя библиотеку Kinesis Video Stream. Я хотел бы разобрать фрагменты и затем записать .mkv на диск. В соответствии с примером я пытаюсь использовать FragmentMetadataVisitor, чтобы получить следующий номер фрагмента для выполнения последующего GetMediaRequest. Отладка, похоже, что ни один из MkvElements не содержит метаданных «TAG». Также, глядя на исходный код, похоже, что FragmentMetadataVistior игнорирует теги AWS:
public void visit(MkvDataElement dataElement) throws MkvElementVisitException {
if (mkvTagProcessor.isPresent()) {
if (MkvTypeInfos.TAGNAME.equals(dataElement.getElementMetaData().getTypeInfo())) {
tagName = getMkvElementStringVal(dataElement);
} else if (MkvTypeInfos.TAGSTRING.equals(dataElement.getElementMetaData().getTypeInfo())) {
tagValue = getMkvElementStringVal(dataElement);
}
if (tagName != null && tagValue != null) {
// Only process non-internal tags
if (!tagName.startsWith(AWS_KINESISVIDEO_TAGNAME_PREFIX)) {
mkvTagProcessor.get().process(new MkvTag(tagName, tagValue), currentFragmentMetadata);
}
// Empty the values for new tag
tagName = null;
tagValue = null;
}
}
}
}
Я использую BasicMkvTagProcessor для обработки тегов. Однако при отладке метод процесса (тег, метаданные) никогда не вызывается. Я использую FragmentMetadataVisitor следующим образом:
StreamingMkvReader streamingMkvReader =
StreamingMkvReader.createDefault(new InputStreamParserByteSource(result.getPayload()));
try(WritableByteChannel channel = FileChannel.open(generatePath(), StandardOpenOption.APPEND,StandardOpenOption.CREATE)){
while(streamingMkvReader.mightHaveNext()){
Optional<MkvElement> nextItem = streamingMkvReader.nextIfAvailable();
if(nextItem.isEmpty()){
return Optional.empty();
}
MkvElement item = nextItem.get();
/*Write to file*/
} catch(IOException e){
throw new RuntimeException("Failed to create file.", e);
} catch(MkvElementVisitException e){
throw new RuntimeException("An error occurred while writing MkvElement to file.");
}
return /*new StartSelector for next fragment using fragmentMetadataVisitor.getCurrentFragmentMetadata() to find the last fragment number*/;
}
Учитывая это, есть ли другой класс, который я должен использовать для извлечения метаданных AWS, описанных в документации GetMedia? Или я недоразумение?