我正在尝试使用 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 来处理标签。但是,在调试过程中, process(tag, metadata) 方法永远不会被调用。我像这样使用 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*/;
}
鉴于此,我应该使用另一个类来提取 GetMedia 文档中描述的 AWS 元数据吗?还是我误会了?