我正在尝试使用Kinesis Video Stream库创建自己的流解析器。我想解析这些片段,然后将.mkv写入磁盘。按照示例,我尝试使用FragmentMetadataVisitor获取下一个片段编号,以执行后续的GetMediaRequest。调试时,似乎所有MkvElement都不包含“ 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,元数据)方法。我正在像这样使用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元数据?还是我误会了?
AWS刚刚添加了我可以使用的GetClip API。
https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/API_reader_GetClip.html