1

我正在尝试使用 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 元数据吗?还是我误会了?

4

1 回答 1

0

AWS 刚刚添加了我可以使用的 GetClip API。

https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/API_reader_GetClip.html

于 2020-04-30T18:14:40.953 回答