GithubHelp home page GithubHelp logo

aws / amazon-kinesis-video-streams-parser-library Goto Github PK

View Code? Open in Web Editor NEW
101.0 28.0 52.0 25.6 MB

Amazon Kinesis Video Streams parser library is for developers to include in their applications that makes it easy to work with the output of video streams such as retrieving frame-level objects, metadata for fragments, and more.

License: Apache License 2.0

Java 100.00%

amazon-kinesis-video-streams-parser-library's Introduction

Amazon Kinesis Video Streams Parser Library

License

This library is licensed under the Apache 2.0 License.

Introduction

The Amazon Kinesis Video Streams Parser Library for Java enables Java developers to parse the streams returned by GetMedia calls to Amazon Kinesis Video. It contains:

  • A streaming Mkv Parser called StreamingMkvReader that provides an iterative interface to read the MkvElements in a stream.
  • Applications such as OutputSegmentMerger and FragmentMetadataVisitor built using the StreamingMkvReader .
  • A callback based parser called EBMLParser that minimizes data buffering and copying. StreamingMkvReader is built on top of EBMLParser
  • Unit tests for the applications and parsers that demonstrate how the applications work.

Building from Source

After you've downloaded the code from GitHub, you can build it using Maven. Use this command: mvn clean install

Details

StreamingMkvReader

StreamingMkvReader which provides an iterative interface to read MkvElements from a stream. A caller calls nextIfAvailable to get the next MkvElement. An MkvElement wrapped in an Optional is returned if a complete element is available. It buffers an individual MkvElement until it can return a complete MkvElement.
The mightHaveNext method returns true if there is a chance that additional MkvElements can be returned. It returns false when the end of the input stream has been reached.

MkvElement

There are three types of MkvElement vended by a MkvStreamReader:

  • MkvDataElement: This encapsulates Mkv Elements that are not master elements and contain data.
  • MkvStartMasterElement : This represents the start of a master Mkv element that contains child elements. Child elements can be other master elements or data elements.
  • MkvEndMasterElement : This represents the end of master element that contains child elements.

MkvElementVisitor

The MkvElementVisitor is a visitor pattern that helps process the events in the MkvElement hierarchy. It has a visit method for each type of MkvElement.

Visitors

A GetMedia call to Kinesis Video vends a stream of fragments where each fragment is encapsulated in a Mkv stream containing EBML and Segment elements. OutputSegmentMerger can be used to merge consecutive fragments that share the same EBML and Track data into a single Mkv stream with a shared EBML and Segment. This is useful for passing the output of GetMedia to any downstream processor that expects a single Mkv stream with one Segment. Its use can be seen in OutputSegmentMergerTest

FragmentMetadataVisitor is a MkvElementVisitor that collects the Kinesis Video specific meta-data (such as FragmentNumber and Server Side Timestamp ) for the current fragment being processed. The getCurrentFragmentMetadata method can be used to get the current fragment's metadata. Similarly getPreviousFragmentMetadata can be used get the previous fragment's metadata. The getMkvTrackMetadata method can be used to get the details of a particular track.

ElementSizeAndOffsetVisitor is a visitor that writes out the metadata of the Mkv elements in a stream. For each element the name, offset, header size and data size is written out. The output uses indentation to indicate the hierarchy of master elements and their child elements. ElementSizeAndOffsetVisitor is useful for looking into Mkv streams, where mkvinfo fails.

CountVisitor is a visitor that can be used to count the number of Mkv elements of different types in a Mkv stream.

CompositeMkvElementVisitor is a visitor that is made up of a number of constituent visitors. It calls accept on the visited MkvElement for each constituent visitor in the order in which the visitors are specified.

FrameVisitor is a visitor used to process the frames in the output of a GetMedia call. It invokes an implementation of the FrameVisitor.FrameProcessor and provides it with a Frame object and the metadata of the track to which the Frame belongs.

CopyVisitor is a visitor used to copy the raw bytes of the Mkv elements in a stream to an output stream.

ResponseStreamConsumers

The GetMediaResponseStreamConsumer is an abstract class used to consume the output of a GetMedia* call to Kinesis Video in a streaming fashion. It supports a single abstract method called process that is invoked to process the streaming payload of a GetMedia response. The first parameter for process method is the payload inputStream in a GetMediaResult returned by a call to GetMedia. Implementations of the process method of this interface should block until all the data in the inputStream has been processed or the process method decides to stop for some other reason. The second argument is a FragmentMetadataCallback which is invoked at the end of every processed fragment. The GetMediaResponseStreamConsumer provides a utility method processWithFragmentEndCallbacks that can be used by child classes to implement the end of fragment callbacks. The process method can be implemented using a combination of the visitors described earlier.

MergedOutputPiper

The MergedOutputPiper extends GetMediaResponseStreamConsumer to merge consecutive mkv streams in the output of GetMedia and pipes the merged stream to the stdin of a child process. It is meant to be used to pipe the output of a GetMedia* call to a processing application that can not deal with having multiple consecutive mkv streams. Gstreamer is one such application that requires a merged stream.

Example

KinesisVideoExample

KinesisVideoExample is an example that shows how the StreamingMkvReader and the different visitors can be integrated with the AWS SDK for the Kinesis Video. This example provides examples for

  • Create a stream, deleting and recreating if the stream of the same name already exists.
  • Call PutMedia to stream video fragments into the stream.
  • Simultaneously call GetMedia to stream video fragments out of the stream.
  • It uses the StreamingMkvReader to parse the returned the stream and apply the OutputSegmentMerger, FragmentMetadataVisitor visitors along with a local one as part of the same CompositeMkvElementVisitor visitor.

KinesisVideoRendererExample

KinesisVideoRendererExample shows parsing and rendering of KVS video stream fragments using JCodec(http://jcodec.org/) that were ingested using Producer SDK GStreamer sample application.

  • To run the example: Run the Unit test testExample in KinesisVideoRendererExampleTest. After starting the unitTest you should be able to view the frames in a JFrame.
  • If you want to store it as image files you could do it by adding (in KinesisVideoRendererExample after AWTUtil.toBufferedImage(rgb, renderImage); )
try {
    ImageIO.write(renderImage, "png", new File(String.format("frame-capture-%s.png", UUID.randomUUID())));
 } catch (IOException e) {
    log.warn("Couldn't convert to a PNG", e);
}

KinesisVideoGStreamerPiperExample

KinesisVideoGStreamerPiperExample is an example for continuously piping the output of GetMedia calls from a Kinesis Video stream to GStreamer. The test KinesisVideoGStreamerPiperExampleTest provides an example that pipes the output of a KVS GetMedia call to a Gstreamer pipeline. The Gstreamer pipeline is a toy example that demonstrates that Gstreamer can parse the mkv passed into it.

KinesisVideo - Rekognition Examples

Kinesis Video - Rekognition examples demonstrate how to combine Rekognition outputs (JSON) with KinesisVideo Streams output (H264 fragments) and render the frames with overlapping bounding boxes.

KinesisVideoRekognitionIntegrationExample

KinesisVideoRekognitionIntegrationExample decodes H264 frames and renders them with bounding boxes locally using JFrame. To run the sample, run KinesisVideoRekognitionIntegrationExampleTest with appropriate inputs.

KinesisVideoRekognitionLambdaExample

KinesisVideoRekognitionLambdaExample decodes H264 frames, overlaps bounding boxes, encodes to H264 frames again and ingests them into a new Kinesis Video streams using Kinesis Video Producer SDK. To run the sample follow the below steps:

  • Run mvn package from 'amazon-kinesis-video-streams-parser-library' folder. Upload './target/amazon-kinesis-video-streams-parser-library-$VERSION-shaded.jar' file to a S3 bucket.
  • Note the S3 bucket and key name.
  • Find the file LambdaExampleCFnTemplate.yml in the github package.
  • Goto AWS CloudFormation console and create stack using above template, follow the description to the input parameters.
  • Now start the producer to ingest data into Kinesis Video Streams for which the Rekognition stream processor is configured.
  • Lambda will be triggered as soon as the Rekognition stream processor starts emitting records in Kinesis Data Streams. Lambda will also create a new Kinesis Video streams with the input stream name + 'Rekognized' suffix and ingest frames overlapped with bounding boxes which should be viewable in Kinesis Video Streams console.
  • To troubleshoot any issues, use Monitoring tab in lambda and click 'View logs in Cloudwatch'.
  • NOTE: As this lambda executes resource intense decoding and encoding (using Jcodec which is not optimal https://github.com/jcodec/jcodec#performance--quality-considerations), the new Kinesis Video stream might be delayed significantly.

Release Notes

Release 1.2.4 (Mar 2022)

  • Update amazon-kinesis-client from 1.14.7 to 1.14.8

Release 1.2.3 (Feb 2022)

  • Update slf4j-reload4j and slf4j-api from 1.7.35 to 1.7.36
  • Update aws-lambda-java-events from 1.2.0 to 2.2.9
  • Update amazon-kinesis-video-streams-producer-sdk-java from 1.8.0 to 1.12.0
  • Update aws-java-sdk-bom from 1.11.487 to 1.12.162

Release 1.2.2 (Jan 2022)

  • Update slf4j-reload4j(slf4j-log4j12) and slf4j-api from 1.7.33 to 1.7.35
  • Update amazon-kinesis-client from 1.9.3 to 1.14.7
  • Update aws-lambda-java-core from 1.2.0 to 1.2.1
  • Update junit from 4.13.1 to 4.13.2
  • Update lombok from 1.18.16 to 1.18.22
  • Update commons-lang3 from 3.6 to 3.12.0
  • Update powermock-mockito-release-full from 1.6.3 to 1.6.4
  • Update maven-compiler-plugin from 3.2 to 3.9.0
  • Update lombok-maven-plugin from 1.18.16.0 to 1.18.20.0
  • Update maven-javadoc-plugin from 3.1.1 to 3.3.1
  • Update maven-source-plugin from 3.0.1 to 3.2.1
  • Update maven-shade-plugin from 2.3 to 3.2.4

Release 1.2.1 (Jan 2022)

  • Update slf4j-log4j12 and slf4j-api from 1.7.25 to 1.7.33
  • Update log4j-slf4j-impl from 2.8.2 to 2.17.1

Release 1.2.0 (Jan 2022)

  • Move from aws-lambda-java-log4j 1.1.0 to aws-lambda-java-log4j2 1.5.1 to address CVE
  • Update log4j to 2.17.1 to address CVE

Release 1.1.0 (Dec 2021)

  • Add ListFragment worker and update GetMediaForFragmentListWorker
  • Upgrade Log4j to 2.16 to address CVE

Release 1.0.15 (Aug 2020)

  • Added new cluster packing option to the OputputSegmentMerger to enable creation of a playable MKV file from a sparse KVS stream.
  • Added parsing of audio specific fields from the MKV track header.
  • Bump some dependency versions.
  • Modify the log level on some log messages.

Release 1.0.14 (Aug 2019)

  • Fixed frame timecode during re-encoding in KinesisVideoRekognitionLambdaExample
  • Fixed region for derived KVS Stream
  • Using default FaceType for external image ids that doesn't follow specified format
  • Upgraded JCodec version to 0.2.3 which provides scaling list support
  • Log improvements

Release 1.0.13 (Apr 2019)

  • Fix: Make process method in H264FrameProcessor and H264FrameDecoder throw FrameProcessException.

Release 1.0.12 (Mar 2019)

  • Bugfix: Fix KinesisVideoExampleTest example issue that was using non-exist test file.
  • Improve KinesisVideoRekognitionLambdaExample to use AWS CloudFormation Template to create resources.

Release 1.0.11 (Mar 2019)

  • Bugfix: KinesisVideoRekognitionIntegrationExample broken because the frame process callback is not invoked.

Release 1.0.10 (Feb 2019)

  • Bugfix: Close GetMedia connection to fix the connection leak issue.

Release 1.0.9 (Jan 2019)

  • Added KinesisVideo Rekgonition Lamba example which combines Rekognition output with KVS fragments to draw bounding boxes for detected faces and ingest into new KVS Stream.
  • Added Optional track number parameter in the FrameVisitor to process only frames with that track number.

Release 1.0.8 (Dec 2018)

  • Add close method for derived classes to cleanup resources.
  • Add exception type which could be used in downstream frame processing logic.
  • Make boolean value thread-safe in ContinuousGetMediaWorker.
  • Remove extra exception wrapping in CompositeMkvElementVisitor.
  • Declare exception throwing for some methods.
  • Enabled stack trace in ContinuousGetMediaWorker when there is an exception.

Release 1.0.7 (Sep 2018)

  • Add flag in KinesisVideoRendererExample and KinesisVideoExample to use the existing stream (and not doing PutMedia again if it exists already).
  • Added support to retrieve the information from FragmentMetadata and display in the image panel during rendering.

Release 1.0.6 (Sep 2018)

  • Introduce handling for empty fragment metadata
  • Added a new SimpleFrame Visitor to handle video with no tags
  • Refactored H264FrameDecoder, so that base class method can be reused by child class

Release 1.0.5 (May 2018)

  • Introduce GetMediaResponseStreamConsumer as an abstract class used to consume the output of a GetMedia* call to Kinesis Video in a streaming fashion. Child classes will use visitors to implement different consumers.
  • The MergedOutputPiper extends GetMediaResponseStreamConsumer to merge consecutive mkv streams in the output of GetMedia and pipes the merged stream to the stdin of a child process.
  • Add the capability and example to pipe the output of GetMedia calls to GStreamer using MergedOutputPiper.

Release 1.0.4 (April 2018)

  • Add example for KinesisVideo Streams integration with Rekognition and draw Bounding Boxes for every sampled frame.
  • Fix for stream ending before reporting tags visited.
  • Same test data file for parsing and rendering example.
  • Known Issues: In KinesisVideoRekognitionIntegrationExample, the decode/renderer sample using JCodec may not be able to decode all mkv files.

Release 1.0.3 (Februrary 2018)

  • In OutputSegmentMerger, make sure that the lastClusterTimecode is updated for the first fragment. If timecode is equal to that of a previous cluster, stop merging
  • FrameVisitor to process the frames in the output of a GetMedia call.
  • CopyVisitor to copy the raw bytes of the stream being parsed to an output stream.
  • Add example that shows parsing and rendering Kinesis Video Streams.
  • Known Issues: In KinesisVideoRendererExample, the decode/renderer sample using JCodec may not be able to decode all mkv files.

Release 1.0.2 (December 2017)

  • Add example that shows integration with Kinesis Video Streams.
  • Remove unnecessary import.

Release 1.0.1 (November 2017)

  • Update to include the url for Amazon Kinesis Video Streams in the pom.xml

Release 1.0.0 (November 2017)

  • First release of the Amazon Kinesis Video Parser Library.
  • Supports Mkv elements up to version 4.
  • Known issues:
    • EBMLMaxIDLength and EBMLMaxSizeLength are hardcoded as 4 and 8 bytes respectively
    • Unknown EBML elements not specified in MkvTypeInfos are not readable by the user using StreamingMkvReader.
    • Unknown EBML elements not specified in MkvTypeInfos of unknown length lead to an exception.
    • Does not do any CRC validation for any Mkv elements with the CRC-32 element.

amazon-kinesis-video-streams-parser-library's People

Contributors

bdhandap avatar byongwu avatar chehefen avatar dependabot[bot] avatar disa6302 avatar hassanctech avatar huijon02 avatar hyandell avatar jeremie1112 avatar josvijay avatar kyletran200 avatar littlewat avatar mixmastermitch avatar niyatim23 avatar qqia avatar sayantacc avatar unicornss avatar zhiyua-git avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

amazon-kinesis-video-streams-parser-library's Issues

KinesisVideoRendererExampleTest rendering video very fast

Hi,
I am running the KinesisVideoRendererExampleTest to render the example video vogels_480.mkv and vogels_330.mkv using Jframe but the video renders very fast that is the 30 secs video is rendered in 10 secs. Is there anything that i need to change from my end to get the video rendered as the source.

DEBUG / KinesisVideo: Received end-of-stream for ACKs. DEBUG / KinesisVideo: Finished reading ACKs stream DEBUG / KinesisVideo: Received all data, close INFO / KinesisVideo: Complete callback triggered for sampleKVS4 with statuscode 200

DEBUG / KinesisVideo: Received end-of-stream for ACKs.
DEBUG / KinesisVideo: Finished reading ACKs stream
DEBUG / KinesisVideo: Received all data, close
INFO / KinesisVideo: Complete callback triggered for sampleKVS4 with statuscode 200

This is came when putmedia running.kindly give example

No sample example of streaming video

Hi, I cloned the amazon-kinesis-video-streams-parser-library and imported the project to my Eclipse IDE as a Maven application.
I am trying to figure out how to parse the video stream and display it on a video player or web browser live using Java application.

Is there any way I can do this? The source codes doesn't contain any sample application. Not sure how to make this work. Also the demo source files has errors related to certain imports and fails to import/download needed dependencies. How should I run the program to stream video using amazon-kinesis-video-streams-parser-library?

Eclipse Java EE IDE for Web Developers.
Version: Oxygen.2 Release (4.7.2)
Build id: 20171218-0600
OS- Ubuntu 16.04 TLS

Thanks

Store Kinesis video stream to S3

Hello,

I am able to produce to AWS Kinesis stream, and able to view the media using "Media Preview". I would like to persist the video for longer term retention (around 30 days), and I am looking into persisting the video stream to S3. Is there a library or sample/reference code I can use to get started on the project.

Thank you,
Ahmed.

error while running rtsp stream

when I run the video file this code gives correct output by recognizing the face and shows output on another kinesis video stream but when I run rtsp video stream, the rekognized video stream shows a blank screen. In cloud watch the error is java.lang.RuntimeException: long term. Here is a full stack trace

java.lang.RuntimeException: long term at org.jcodec.codecs.h264.decode.RefListManager.reorder(RefListManager.java:156) at org.jcodec.codecs.h264.decode.RefListManager.buildRefListP(RefListManager.java:79) at org.jcodec.codecs.h264.decode.RefListManager.getRefList(RefListManager.java:42) at org.jcodec.codecs.h264.decode.SliceDecoder.decodeFromReader(SliceDecoder.java:71) at org.jcodec.codecs.h264.H264Decoder$FrameDecoder.decodeFrame(H264Decoder.java:152) at org.jcodec.codecs.h264.H264Decoder.decodeFrameFromNals(H264Decoder.java:103) at com.amazonaws.kinesisvideo.parser.utilities.H264FrameDecoder.decodeH264Frame(H264FrameDecoder.java:64) at com.amazonaws.kinesisvideo.parser.examples.lambda.H264FrameProcessor.process(H264FrameProcessor.java:104) at com.amazonaws.kinesisvideo.parser.utilities.FrameVisitor$FrameProcessor.process(FrameVisitor.java:73) at com.amazonaws.kinesisvideo.parser.utilities.FrameVisitor$FrameVisitorInternal.visit(FrameVisitor.java:105) at com.amazonaws.kinesisvideo.parser.mkv.MkvDataElement.accept(MkvDataElement.java:128) at com.amazonaws.kinesisvideo.parser.mkv.visitors.CompositeMkvElementVisitor.visitAll(CompositeMkvElementVisitor.java:67) at com.amazonaws.kinesisvideo.parser.mkv.visitors.CompositeMkvElementVisitor.visit(CompositeMkvElementVisitor.java:54) at com.amazonaws.kinesisvideo.parser.mkv.MkvDataElement.accept(MkvDataElement.java:128) at com.amazonaws.kinesisvideo.parser.mkv.StreamingMkvReader.apply(StreamingMkvReader.java:132) at com.amazonaws.kinesisvideo.parser.examples.GetMediaForFragmentListWorker.run(GetMediaForFragmentListWorker.java:64) at com.amazonaws.kinesisvideo.parser.examples.lambda.KinesisVideoRekognitionLambdaExample.processRekognizedOutputs(KinesisVideoRekognitionLambdaExample.java:124) at com.amazonaws.kinesisvideo.parser.examples.lambda.KinesisVideoRekognitionLambdaExample.handleRequest(KinesisVideoRekognitionLambdaExample.java:164) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at lambdainternal.EventHandlerLoader$PojoMethodRequestHandler.handleRequest(EventHandlerLoader.java:259) at lambdainternal.EventHandlerLoader$PojoHandlerAsStreamHandler.handleRequest(EventHandlerLoader.java:178) at lambdainternal.EventHandlerLoader$2.call(EventHandlerLoader.java:888) at lambdainternal.AWSLambda.startRuntime(AWSLambda.java:293) at lambdainternal.AWSLambda.(AWSLambda.java:64) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:114)

And also I did not understand detectedTime in code. I tried to print serverTimeStamp, producerTimeStamp as well as detectedTime. What I find is serverTimeStamp is always correct. But detectedTime is not always correct it provides a very wrong timestamp.

For examples:
This is serverTimeStamp 1.561984271535E9 which is correct.
And here is detected time 1.5619854765320477E9. Look at the time stamp it is not a valid timestamp.
So, what is the purpose of detectedTime when we have serverTimeStamp? and why detectedTime sometimes provide correct time and sometimes incorrect time?
Also as I attached full stack trace above what does this error mean what I am doing wrong?

readStream stops in about 40 minutes...

Hello,

I want to get stream's video for a long time.
But, StreamingMkvReader is suddenly stops in about 40 minutes ...
(The saved mkv file ends in about 1.8GB each time.)
Is this a specification?
I never quit by myself.

The producer is fine and keeps sending videos.
(I using https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp (in Raspberry Pi 3))

I using this librarys in my java program.

Path outputPath = Paths.get(outputFilePath); // forexample ~/output.mkv
OutputStream fileOutputStream = Files.newOutputStream(outputPath,
        StandardOpenOption.WRITE, StandardOpenOption.CREATE);

try (BufferedOutputStream outputStream = new BufferedOutputStream(fileOutputStream)) {
    outputStream.flush();

    StreamingMkvReader mkvStreamReader = StreamingMkvReader.createDefault(new InputStreamParserByteSource(result.getPayload()));
    OutputSegmentMerger outputSegmentMerger = OutputSegmentMerger.createDefault(fileOutputStream);

    long prevFragmentDoneTime = System.currentTimeMillis();

    // Apply the OutputSegmentMerger to the mkv elements from the mkv stream reader.
    try {
        while (mkvStreamReader.mightHaveNext()) {
            Optional<MkvElement> mkvElementOptional = mkvStreamReader.nextIfAvailable();

            if (mkvElementOptional.isPresent()) {
                MkvElement mkvElement = mkvElementOptional.get();
                //Apply the segment merger to this element.
                mkvElement.accept(outputSegmentMerger);

                //count the number of fragments merged.
                if (MkvTypeInfos.SEGMENT.equals(mkvElement.getElementMetaData().getTypeInfo())) {
                    if (mkvElement instanceof MkvEndMasterElement) {
                        System.out.println("Fragment numbers merged " + outputSegmentMerger.getClustersCount() + " took  "
                                + Long.toString(System.currentTimeMillis() - prevFragmentDoneTime) + " ms.");
                        prevFragmentDoneTime = System.currentTimeMillis();
                        outputStream.flush();
                    }
                }
            }
        }
    } catch (MkvElementVisitException e) {
        System.err.println("Exception from visitor to MkvElement " + e);
    }
}

I will attach a video end log.
You can see that byteSource has reached eof .

15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Stopping parsing
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.visitors.CompositeMkvElementVisitor - Composite visitor calling class com.amazonaws.kinesisvideo.parser.mkv.visitors.CountVisitor on element MkvStartMasterElement(super=MkvElement(elementMetaData=EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=26568, name=SimpleTag, level=3, type=MASTER, isRecursive=true), elementNumber=145995), elementPath=[EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=408125543, name=Segment, level=0, type=MASTER, isRecursive=false), elementNumber=145898), EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=307544935, name=Tags, level=1, type=MASTER, isRecursive=false), elementNumber=145990), EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=29555, name=Tag, level=2, type=MASTER, isRecursive=false), elementNumber=145991)]), dataSize=94)
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.visitors.CompositeMkvElementVisitor - Composite visitor calling class com.amazonaws.kinesisvideo.parser.utilities.OutputSegmentMerger$MergeVisitor on element MkvStartMasterElement(super=MkvElement(elementMetaData=EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=26568, name=SimpleTag, level=3, type=MASTER, isRecursive=true), elementNumber=145995), elementPath=[EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=408125543, name=Segment, level=0, type=MASTER, isRecursive=false), elementNumber=145898), EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=307544935, name=Tags, level=1, type=MASTER, isRecursive=false), elementNumber=145990), EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=29555, name=Tag, level=2, type=MASTER, isRecursive=false), elementNumber=145991)]), dataSize=94)
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Current element read state NEW
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Current element read state ID_DONE
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Current element read state SIZE_DONE
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Invoking onStartElement for current element EBMLParserInternalElement(startingOffset=1947192908, elementCount=145996, currentElementReadState=SIZE_DONE, id=17827, idNumBytes=2, dataSize=35, dataSizeNumBytes=4, elementMetaData=Optional[EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=17827, name=TagName, level=4, type=UTF_8, isRecursive=false), elementNumber=145996)])
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.MkvStreamReaderCallback - Data Element to start building EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=17827, name=TagName, level=4, type=UTF_8, isRecursive=false), elementNumber=145996) data size 35 
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Current element read state CONTENT_READING
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.MkvStreamReaderCallback - Data Element to start buffering data EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=17827, name=TagName, level=4, type=UTF_8, isRecursive=false), elementNumber=145996) bytes to read 35 
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Current element read state FINISHED
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Invoking onStartElement for current element EBMLParserInternalElement(startingOffset=1947192908, elementCount=145996, currentElementReadState=FINISHED, id=17827, idNumBytes=2, dataSize=35, dataSizeNumBytes=4, elementMetaData=Optional[EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=17827, name=TagName, level=4, type=UTF_8, isRecursive=false), elementNumber=145996)])
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.MkvStreamReaderCallback - Data Element to return EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=17827, name=TagName, level=4, type=UTF_8, isRecursive=false), elementNumber=145996) data size 35 
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Stopping parsing
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.visitors.CompositeMkvElementVisitor - Composite visitor calling class com.amazonaws.kinesisvideo.parser.mkv.visitors.CountVisitor on element MkvDataElement(super=MkvElement(elementMetaData=EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=17827, name=TagName, level=4, type=UTF_8, isRecursive=false), elementNumber=145996), elementPath=[EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=408125543, name=Segment, level=0, type=MASTER, isRecursive=false), elementNumber=145898), EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=307544935, name=Tags, level=1, type=MASTER, isRecursive=false), elementNumber=145990), EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=29555, name=Tag, level=2, type=MASTER, isRecursive=false), elementNumber=145991), EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=26568, name=SimpleTag, level=3, type=MASTER, isRecursive=true), elementNumber=145995)]), dataSize=35)
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.visitors.CompositeMkvElementVisitor - Composite visitor calling class com.amazonaws.kinesisvideo.parser.utilities.OutputSegmentMerger$MergeVisitor on element MkvDataElement(super=MkvElement(elementMetaData=EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=17827, name=TagName, level=4, type=UTF_8, isRecursive=false), elementNumber=145996), elementPath=[EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=408125543, name=Segment, level=0, type=MASTER, isRecursive=false), elementNumber=145898), EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=307544935, name=Tags, level=1, type=MASTER, isRecursive=false), elementNumber=145990), EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=29555, name=Tag, level=2, type=MASTER, isRecursive=false), elementNumber=145991), EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=26568, name=SimpleTag, level=3, type=MASTER, isRecursive=true), elementNumber=145995)]), dataSize=35)
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Current element read state NEW
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Current element read state ID_DONE
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Current element read state SIZE_DONE
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Invoking onStartElement for current element EBMLParserInternalElement(startingOffset=1947192949, elementCount=145997, currentElementReadState=SIZE_DONE, id=17543, idNumBytes=2, dataSize=47, dataSizeNumBytes=4, elementMetaData=Optional[EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=17543, name=TagString, level=4, type=UTF_8, isRecursive=false), elementNumber=145997)])
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.MkvStreamReaderCallback - Data Element to start building EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=17543, name=TagString, level=4, type=UTF_8, isRecursive=false), elementNumber=145997) data size 47 
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Current element read state CONTENT_READING
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.MkvStreamReaderCallback - Data Element to start buffering data EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=17543, name=TagString, level=4, type=UTF_8, isRecursive=false), elementNumber=145997) bytes to read 47 
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Current element read state FINISHED
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Invoking onStartElement for current element EBMLParserInternalElement(startingOffset=1947192949, elementCount=145997, currentElementReadState=FINISHED, id=17543, idNumBytes=2, dataSize=47, dataSizeNumBytes=4, elementMetaData=Optional[EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=17543, name=TagString, level=4, type=UTF_8, isRecursive=false), elementNumber=145997)])
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.MkvStreamReaderCallback - Data Element to return EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=17543, name=TagString, level=4, type=UTF_8, isRecursive=false), elementNumber=145997) data size 47 
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Removing master element EBMLParserInternalElement(startingOffset=1947192902, elementCount=145995, currentElementReadState=CONTENT_READING, id=26568, idNumBytes=2, dataSize=94, dataSizeNumBytes=4, elementMetaData=Optional[EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=26568, name=SimpleTag, level=3, type=MASTER, isRecursive=true), elementNumber=145995)]) based on size end 1947193002
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Invoking onStartElement for current element EBMLParserInternalElement(startingOffset=1947192902, elementCount=145995, currentElementReadState=CONTENT_READING, id=26568, idNumBytes=2, dataSize=94, dataSizeNumBytes=4, elementMetaData=Optional[EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=26568, name=SimpleTag, level=3, type=MASTER, isRecursive=true), elementNumber=145995)])
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.MkvStreamReaderCallback - End Master Element to return EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=26568, name=SimpleTag, level=3, type=MASTER, isRecursive=true), elementNumber=145995)
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Removing master element EBMLParserInternalElement(startingOffset=1947192840, elementCount=145991, currentElementReadState=CONTENT_READING, id=29555, idNumBytes=2, dataSize=156, dataSizeNumBytes=4, elementMetaData=Optional[EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=29555, name=Tag, level=2, type=MASTER, isRecursive=false), elementNumber=145991)]) based on size end 1947193002
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Invoking onStartElement for current element EBMLParserInternalElement(startingOffset=1947192840, elementCount=145991, currentElementReadState=CONTENT_READING, id=29555, idNumBytes=2, dataSize=156, dataSizeNumBytes=4, elementMetaData=Optional[EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=29555, name=Tag, level=2, type=MASTER, isRecursive=false), elementNumber=145991)])
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.MkvStreamReaderCallback - End Master Element to return EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=29555, name=Tag, level=2, type=MASTER, isRecursive=false), elementNumber=145991)
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Removing master element EBMLParserInternalElement(startingOffset=1947192832, elementCount=145990, currentElementReadState=CONTENT_READING, id=307544935, idNumBytes=4, dataSize=162, dataSizeNumBytes=4, elementMetaData=Optional[EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=307544935, name=Tags, level=1, type=MASTER, isRecursive=false), elementNumber=145990)]) based on size end 1947193002
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Invoking onStartElement for current element EBMLParserInternalElement(startingOffset=1947192832, elementCount=145990, currentElementReadState=CONTENT_READING, id=307544935, idNumBytes=4, dataSize=162, dataSizeNumBytes=4, elementMetaData=Optional[EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=307544935, name=Tags, level=1, type=MASTER, isRecursive=false), elementNumber=145990)])
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.MkvStreamReaderCallback - End Master Element to return EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=307544935, name=Tags, level=1, type=MASTER, isRecursive=false), elementNumber=145990)
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Stopping parsing
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.visitors.CompositeMkvElementVisitor - Composite visitor calling class com.amazonaws.kinesisvideo.parser.mkv.visitors.CountVisitor on element MkvDataElement(super=MkvElement(elementMetaData=EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=17543, name=TagString, level=4, type=UTF_8, isRecursive=false), elementNumber=145997), elementPath=[EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=408125543, name=Segment, level=0, type=MASTER, isRecursive=false), elementNumber=145898), EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=307544935, name=Tags, level=1, type=MASTER, isRecursive=false), elementNumber=145990), EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=29555, name=Tag, level=2, type=MASTER, isRecursive=false), elementNumber=145991), EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=26568, name=SimpleTag, level=3, type=MASTER, isRecursive=true), elementNumber=145995)]), dataSize=47)
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.visitors.CompositeMkvElementVisitor - Composite visitor calling class com.amazonaws.kinesisvideo.parser.utilities.OutputSegmentMerger$MergeVisitor on element MkvDataElement(super=MkvElement(elementMetaData=EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=17543, name=TagString, level=4, type=UTF_8, isRecursive=false), elementNumber=145997), elementPath=[EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=408125543, name=Segment, level=0, type=MASTER, isRecursive=false), elementNumber=145898), EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=307544935, name=Tags, level=1, type=MASTER, isRecursive=false), elementNumber=145990), EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=29555, name=Tag, level=2, type=MASTER, isRecursive=false), elementNumber=145991), EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=26568, name=SimpleTag, level=3, type=MASTER, isRecursive=true), elementNumber=145995)]), dataSize=47)
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.StreamingMkvReader - ReaderCallback has elements to return 
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.StreamingMkvReader - ReaderCallback has elements to return. Return element from it.
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.visitors.CompositeMkvElementVisitor - Composite visitor calling class com.amazonaws.kinesisvideo.parser.mkv.visitors.CountVisitor on element MkvEndMasterElement(super=MkvElement(elementMetaData=EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=26568, name=SimpleTag, level=3, type=MASTER, isRecursive=true), elementNumber=145995), elementPath=[EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=408125543, name=Segment, level=0, type=MASTER, isRecursive=false), elementNumber=145898), EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=307544935, name=Tags, level=1, type=MASTER, isRecursive=false), elementNumber=145990), EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=29555, name=Tag, level=2, type=MASTER, isRecursive=false), elementNumber=145991)]))
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.visitors.CompositeMkvElementVisitor - Composite visitor calling class com.amazonaws.kinesisvideo.parser.utilities.OutputSegmentMerger$MergeVisitor on element MkvEndMasterElement(super=MkvElement(elementMetaData=EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=26568, name=SimpleTag, level=3, type=MASTER, isRecursive=true), elementNumber=145995), elementPath=[EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=408125543, name=Segment, level=0, type=MASTER, isRecursive=false), elementNumber=145898), EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=307544935, name=Tags, level=1, type=MASTER, isRecursive=false), elementNumber=145990), EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=29555, name=Tag, level=2, type=MASTER, isRecursive=false), elementNumber=145991)]))
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.StreamingMkvReader - ReaderCallback has elements to return 
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.StreamingMkvReader - ReaderCallback has elements to return. Return element from it.
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.visitors.CompositeMkvElementVisitor - Composite visitor calling class com.amazonaws.kinesisvideo.parser.mkv.visitors.CountVisitor on element MkvEndMasterElement(super=MkvElement(elementMetaData=EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=29555, name=Tag, level=2, type=MASTER, isRecursive=false), elementNumber=145991), elementPath=[EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=408125543, name=Segment, level=0, type=MASTER, isRecursive=false), elementNumber=145898), EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=307544935, name=Tags, level=1, type=MASTER, isRecursive=false), elementNumber=145990)]))
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.visitors.CompositeMkvElementVisitor - Composite visitor calling class com.amazonaws.kinesisvideo.parser.utilities.OutputSegmentMerger$MergeVisitor on element MkvEndMasterElement(super=MkvElement(elementMetaData=EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=29555, name=Tag, level=2, type=MASTER, isRecursive=false), elementNumber=145991), elementPath=[EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=408125543, name=Segment, level=0, type=MASTER, isRecursive=false), elementNumber=145898), EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=307544935, name=Tags, level=1, type=MASTER, isRecursive=false), elementNumber=145990)]))
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.StreamingMkvReader - ReaderCallback has elements to return 
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.StreamingMkvReader - ReaderCallback has elements to return. Return element from it.
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.visitors.CompositeMkvElementVisitor - Composite visitor calling class com.amazonaws.kinesisvideo.parser.mkv.visitors.CountVisitor on element MkvEndMasterElement(super=MkvElement(elementMetaData=EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=307544935, name=Tags, level=1, type=MASTER, isRecursive=false), elementNumber=145990), elementPath=[EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=408125543, name=Segment, level=0, type=MASTER, isRecursive=false), elementNumber=145898)]))
15:31:37.234 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.visitors.CompositeMkvElementVisitor - Composite visitor calling class com.amazonaws.kinesisvideo.parser.utilities.OutputSegmentMerger$MergeVisitor on element MkvEndMasterElement(super=MkvElement(elementMetaData=EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=307544935, name=Tags, level=1, type=MASTER, isRecursive=false), elementNumber=145990), elementPath=[EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=408125543, name=Segment, level=0, type=MASTER, isRecursive=false), elementNumber=145898)]))
15:31:37.235 [main] INFO com.amazonaws.kinesisvideo.parser.mkv.StreamingMkvReader - byteSource has reached eof
15:31:37.235 [main] INFO com.amazonaws.kinesisvideo.parser.mkv.StreamingMkvReader - byteSource has reached eof and calling close on parser
15:31:37.235 [main] INFO com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Closing EBMLParser
15:31:37.235 [main] INFO com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Closing with 1 master elements on stack, invoking end element callback on them
15:31:37.235 [main] DEBUG com.amazonaws.kinesisvideo.parser.ebml.EBMLParser - Invoking onStartElement for current element EBMLParserInternalElement(startingOffset=1945737424, elementCount=145898, currentElementReadState=CONTENT_READING, id=408125543, idNumBytes=4, dataSize=72057594037927935, dataSizeNumBytes=8, elementMetaData=Optional[EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=408125543, name=Segment, level=0, type=MASTER, isRecursive=false), elementNumber=145898)])
15:31:37.235 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.MkvStreamReaderCallback - End Master Element to return EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=408125543, name=Segment, level=0, type=MASTER, isRecursive=false), elementNumber=145898)
15:31:37.235 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.StreamingMkvReader - ReaderCallback has elements to return. Return element from it.
15:31:37.235 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.visitors.CompositeMkvElementVisitor - Composite visitor calling class com.amazonaws.kinesisvideo.parser.mkv.visitors.CountVisitor on element MkvEndMasterElement(super=MkvElement(elementMetaData=EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=408125543, name=Segment, level=0, type=MASTER, isRecursive=false), elementNumber=145898), elementPath=[]))
15:31:37.235 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.visitors.CountVisitor - Element MkvEndMasterElement(super=MkvElement(elementMetaData=EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=408125543, name=Segment, level=0, type=MASTER, isRecursive=false), elementNumber=145898), elementPath=[])) to Count found
15:31:37.235 [main] DEBUG com.amazonaws.kinesisvideo.parser.mkv.visitors.CompositeMkvElementVisitor - Composite visitor calling class com.amazonaws.kinesisvideo.parser.utilities.OutputSegmentMerger$MergeVisitor on element MkvEndMasterElement(super=MkvElement(elementMetaData=EBMLElementMetaData(typeInfo=EBMLTypeInfo(id=408125543, name=Segment, level=0, type=MASTER, isRecursive=false), elementNumber=145898), elementPath=[]))
15:31:37.235 [main] INFO com.amazonaws.kinesisvideo.parser.utilities.OutputSegmentMerger - Detected end of segment element, transitioning from EMITTING to NEW
Fragment numbers merged 1352 took  2009 ms.
15:31:37.235 [main] INFO com.amazonaws.kinesisvideo.parser.mkv.StreamingMkvReader - byteSource has reached eof
15:31:37.235 [main] INFO com.amazonaws.kinesisvideo.parser.mkv.StreamingMkvReader - No more elements to process byteSource.eof true parser.isClosed true

List data stored on stream

I'm testing kinesis video streams and am able to put a live stream from a camera, and retrieved it using the parser library and exported to a browser to be viewed live, and works very well, I'm also able to retrieve any date on video already stored.

what I haven't been able to figure out is how do you know what's stored. How do I request all stored data to know that there's video from DateTime X to DateTime Y so I can display to my users what video time they can request.

How do you achieve this?

Unable to build with mvn or use in Eclipse

Hi, any insights into these problems would be greatly appreciated.

  1. After using git clone to get the repository, I can't successfully build with mvn. The error messages I get are the following:

WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.$ReflectUtils$1 (file:/usr/share/maven/lib/guice.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.$ReflectUtils$1 WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release [INFO] Scanning for projects... [INFO] [INFO] -----< com.amazonaws:amazon-kinesis-video-streams-parser-library >------ [INFO] Building Amazon Kinesis Video Streams Parser Library 1.0.13 [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ amazon-kinesis-video-streams-parser-library --- [INFO] [INFO] --- lombok-maven-plugin:1.16.18.1:delombok (delombok) @ amazon-kinesis-video-streams-parser-library --- [WARNING] Unable to detect tools.jar; java.home is /usr/lib/jvm/java-11-openjdk-amd64 Copying resource file: com/amazonaws/kinesisvideo/parser/examples/.DS_Store [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.597 s [INFO] Finished at: 2019-06-11T15:20:12-07:00 [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.projectlombok:lombok-maven-plugin:1.16.18.1:delombok (delombok) on project amazon-kinesis-video-streams-parser-library: Unable to delombok: InvocationTargetException: ExceptionInInitializerError: com.sun.tools.javac.code.TypeTags -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

  1. I tried importing the maven project using Eclipse as well, but there would be an "Unable to delombok" error in the pom.xml file.
    I also tried to run KinesisVideoExampleTest, in src/test/java. Initially it cannot find KinesisVideo Example in src/main/java. This seems fixed after setting src/main/java to be source folder. However, doing so creates a lot of additional problems with build paths.

I'm currently using:

  • Eclipse IDE for Java Developers, Version 4.11.0
  • Ubuntu 18.04
  • Apache Maven 3.6.0
  • Java 11.0.3

Does anyone know how to solve the above problems?

Thank you in advance.

"Fragment numbers are invalid" exception

Hello;

I was trying to get media for a list of fragments (within a specified time range) using the listFragments(). Using the getFragments() and getFragmentNumber() functions, I am able to get a list of fragments successfully with their associated fragment numbers. Then I sort that fragment list numbers by their creation time, and pass it to getMediaForFragmentList() function to save it as a video file.

But it is giving me this exception

com.amazonaws.services.kinesisvideo.model.InvalidArgumentException: Fragment numbers are invalid :

I have two streams for two cameras, but the same approach works for one of the streams, but give error for the other stream. They are both in the same region, also uses the same credentials.

Could you please tell why this might be happening?

Streams Parser Library Example code for NodeJS or Browser

I'm not sure if this issues list is the best / right place for this question, but I'll ask it anyway. I appreciate very much the Streams Parser Java SDK. It really helps me understand things better.

Is there another SDK or example project for retrieving / parsing / displaying media from a Video Stream in a NodeJS / browser application? I'm essentially looking to create a version of the live streams viewer on the AWS Kinesis Video Streams console. I've been unable to find any concrete "hello world" examples or tutorials. I've read through the Developer Guide and API Reference documents, and I'm working through building my own browser-based tests now. Ideally, I'd like to download a sample or tutorial project, point it at a video stream, and see a live feed in real-time.

Does something like that tutorial exist? Any plans to create one? Thanks again!
-Matthew

kinesisVideoRendererExample fails when startSelectorType is NOW

Hi there,
I have been trying to use the above example as a pattern to try and capture a stream from kinesis videos, visit each mkv element and then decode each h264 frame.
This works great while the start selectorType for the getMedia worker is at EARLIEST for example but will fail with the following when I try and get the newest data on the stream with startSelectorType of NOW:

11:03:10.755 [pool-2-thread-1] ERROR com.amazonaws.kinesisvideo.parser.examples.GetMediaWorker - Exception while accepting visitor {}
java.lang.NullPointerException: null
at org.jcodec.codecs.h264.decode.BlockInterpolator.getBlockLuma(BlockInterpolator.java:41) ~[jcodec-0.2.2.jar:0.2.2]
at org.jcodec.codecs.h264.decode.MBlockSkipDecoder.predictPSkip(MBlockSkipDecoder.java:91) ~[jcodec-0.2.2.jar:0.2.2]
at org.jcodec.codecs.h264.decode.MBlockSkipDecoder.decodeSkip(MBlockSkipDecoder.java:45) ~[jcodec-0.2.2.jar:0.2.2]
at org.jcodec.codecs.h264.decode.SliceDecoder.decode(SliceDecoder.java:126) ~[jcodec-0.2.2.jar:0.2.2]
at org.jcodec.codecs.h264.decode.SliceDecoder.decodeMacroblocks(SliceDecoder.java:100) ~[jcodec-0.2.2.jar:0.2.2]
at org.jcodec.codecs.h264.decode.SliceDecoder.decodeFromReader(SliceDecoder.java:73) ~[jcodec-0.2.2.jar:0.2.2]
at org.jcodec.codecs.h264.H264Decoder$FrameDecoder.decodeFrame(H264Decoder.java:152) ~[jcodec-0.2.2.jar:0.2.2]
at org.jcodec.codecs.h264.H264Decoder.decodeFrameFromNals(H264Decoder.java:103) ~[jcodec-0.2.2.jar:0.2.2]
at com.amazonaws.kinesisvideo.parser.utilities.H264FrameRenderer.decodeH264Frame(H264FrameRenderer.java:73) ~[classes/:?]
at com.amazonaws.kinesisvideo.parser.utilities.H264FrameRenderer.process(H264FrameRenderer.java:53) ~[classes/:?]
at com.amazonaws.kinesisvideo.parser.utilities.FrameVisitor$FrameVisitorInternal.visit(FrameVisitor.java:69) ~[classes/:?]
at com.amazonaws.kinesisvideo.parser.mkv.MkvDataElement.accept(MkvDataElement.java:128) ~[classes/:?]
at com.amazonaws.kinesisvideo.parser.mkv.visitors.CompositeMkvElementVisitor.visitAll(CompositeMkvElementVisitor.java:63) ~[classes/:?]
at com.amazonaws.kinesisvideo.parser.mkv.visitors.CompositeMkvElementVisitor.visit(CompositeMkvElementVisitor.java:54) ~[classes/:?]
at com.amazonaws.kinesisvideo.parser.mkv.MkvDataElement.accept(MkvDataElement.java:128) ~[classes/:?]
at com.amazonaws.kinesisvideo.parser.mkv.StreamingMkvReader.apply(StreamingMkvReader.java:132) ~[classes/:?]
at com.amazonaws.kinesisvideo.parser.examples.GetMediaWorker.run(GetMediaWorker.java:69) [classes/:?]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_171]
at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266) [?:1.8.0_171]
at java.util.concurrent.FutureTask.run(FutureTask.java) [?:1.8.0_171]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_171]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_171]

I am using the producer library(native API) on an ubunto 16.04 virtual box and in my example I disable the put media worker within the example and instead run a separate process that does the producing.

Any ideas???

thanks

NotImplementedException: Default FrameVisitor.FrameProcessor

Hi,

I am trying to retrieve a stream and received the following exception:

2019-02-21 02:50:33 ERROR com.amazonaws.kinesisvideo.parser.examples.GetMediaWorker:71 - Failure in GetMediaWorker for streamName my_stream_name_here org.apache.commons.lang3.NotImplementedException: Default FrameVisitor.FrameProcessor
2019-02-21 02:50:33 INFO  com.amazonaws.kinesisvideo.parser.examples.GetMediaWorker:74 - Exiting GetMediaWorker for stream my_stream_name_here

I am using this code in a class (that extends KinesisVideoCommon) to retrieve the stream:

    private final ExecutorService executorService;
    private GetMediaProcessingArguments getMediaProcessingArguments;
    private final OutputStream outputStream;
    private final String fragmentNumber;
    private final StreamOps streamOps;
	
    public MyKinesisClass(Regions region,
                      String streamName,
                      String fragmentNumber,
                      AWSCredentialsProvider credentialsProvider,
                      OutputStream outputStream) throws IOException {

        super(region, credentialsProvider, streamName);
        this.streamOps = new StreamOps(region,  streamName, credentialsProvider);
        this.executorService = Executors.newFixedThreadPool(2);
        this.outputStream = outputStream;
        this.fragmentNumber = fragmentNumber;
    }

    public void execute () throws InterruptedException, IOException {
        getMediaProcessingArguments = GetMediaProcessingArguments.create(outputStream);
        try (GetMediaProcessingArguments getMediaProcessingArgumentsLocal = getMediaProcessingArguments) {
            //Start a GetMedia worker to read and process data from the Kinesis Video Stream.
            GetMediaWorker getMediaWorker = GetMediaWorker.create(getRegion(),
            getCredentialsProvider(),
            getStreamName(),
            new StartSelector().withStartSelectorType(StartSelectorType.FRAGMENT_NUMBER).withAfterFragmentNumber(fragmentNumber),
            streamOps.getAmazonKinesisVideo(),
            getMediaProcessingArgumentsLocal.getFrameVisitor());
            executorService.submit(getMediaWorker);

            executorService.shutdown();
            executorService.awaitTermination(120, TimeUnit.SECONDS);
            if (!executorService.isTerminated()) {
                executorService.shutdownNow();
            } else {
                logger.debug("Executor service is shutdown");
            }
        } finally {
            outputStream.close();
        }

    }
	
    private static class LogVisitor extends MkvElementVisitor {
        private final FragmentMetadataVisitor fragmentMetadataVisitor;

        private LogVisitor(FragmentMetadataVisitor fragmentMetadataVisitor) {
            this.fragmentMetadataVisitor = fragmentMetadataVisitor;
        }

        public long getFragmentCount() {
            return fragmentCount;
        }

        private long fragmentCount = 0;

        @Override
        public void visit(MkvStartMasterElement startMasterElement) throws MkvElementVisitException {
            if (MkvTypeInfos.EBML.equals(startMasterElement.getElementMetaData().getTypeInfo())) {
                fragmentCount++;
                logger.debug("Start of segment");
            }
        }

        @Override
        public void visit(MkvEndMasterElement endMasterElement) throws MkvElementVisitException {
            if (MkvTypeInfos.SEGMENT.equals(endMasterElement.getElementMetaData().getTypeInfo())) {
                logger.debug("End of segment");
                                      
            }
        }

        @Override
        public void visit(MkvDataElement dataElement) throws MkvElementVisitException {
        }
      }
    
    private static class GetMediaProcessingArguments implements Closeable {

        public FrameVisitor getFrameVisitor() {
            return frameVisitor;
        }

        private final FrameVisitor frameVisitor;

        public GetMediaProcessingArguments(FrameVisitor frameVisitor) {
            this.frameVisitor = frameVisitor;
        }

        public static GetMediaProcessingArguments create(OutputStream outPutStream) throws IOException {
            FragmentMetadataVisitor fragmentMetadataVisitor = FragmentMetadataVisitor.create();
            LogVisitor logVisitor = new LogVisitor(fragmentMetadataVisitor);
            FrameVisitor frameVisitor =
                    FrameVisitor.create(KinesisVideoProcessor.create(outPutStream));
            return new GetMediaProcessingArguments(frameVisitor);
        }

        @Override
        public void close() throws IOException {

        }

    }

Any help would be appreciated.

Thanks,
zoell

Streaming multiple web clients

Hello, I have a question regarding Kinesis video stream.

I would like to stream from my clients browser to Kinesis Video Stream, and later on use it.
I dont need the clients to interact with each other, but i am using kinesis as a recorder thus using the infrastructure it is built on.
Would this be a best practice to use Kinesis?
Thanks.

Saving video from getMedia() vs getMediaForFragmentList()

Hello;

So far I have been able to save video from the provided KinesisVideoExample which stores the current feed from the stream into a mkv file. My object now is to store the fragments from an archived media using the getMediaForFragmentList() API. My modification to the KinesisVideoExample gives me a video but the length of the video is not proper. Let me elaborate.

I am getting the list of fragments first within a time range, which works fine, I can list the fragment numbers, their duration adds up fine (using getFragmentLengthInMilliseconds()) to what I requested. Their size (using getFragmentSizeInBytes()) adds up to 7MB.

Now when I create the video from the stream using this fragment list (using the same way KinesisVideoExample creates), the resultant video size is the same as the size of the fragments (which is fine), BUT the video only plays for 1.5 sec and it stops in any media player! Which gives me the guess that the video might be broken. I tried other strategies from the InputStream for creating the video e.g.

//Method 1
FileOutputStream out = new FileOutputStream(new File("output.webm"));
IOUtils.copy(in, out);
//Method 2
    byte[] buffer = new byte[8 * 1024];
    int bytesRead;
    while ((bytesRead = in.read(buffer)) != -1) {
        out.write(buffer, 0, bytesRead);
    }
    IOUtils.closeQuietly(in);
    IOUtils.closeQuietly(out);

But all of them result in the same broken video file. What I might be doing wrong here? Is there something wrong with the InputStream that is generated from getMediaForFragmentList? But in that case how come the file size is fine in terms of the size of all the fragments together?

Any pointer will be appreciated.

Implementation on android

Hi.

I am trying to view the streamed video from kinesis video to my android application.

Would there be a way to view stream data in my android application?

So far, my assumption is to

  1. make .jar file and implement it as library
    or
  2. Download all java files in android working directory

I doubt if simply implementing java file would work but Android-SDK does not seem to offer consumer side.

Thanks in advance!

Need Feature to get Kinesis Video Stream for Rekognition for Age,Gender and Emotions

Hi all,

Currently i can Stream the RTSP camera using PutMedia.
Then we create Data Stream for that KVS to start Stream Processor for getting Rekognition of that stream.
But for Live Stream AWS provide FaceMatching API only.So we cannot get Age,Gender and Emotions.

if any feature available for above scenario please provide links or Docs.?

For Uploading video to Rekognition . AWS provide API getting Age,Gender and Emotions.
So that process we implement Getmedia for getting Live stream as Uploading Video for Rekognition.

i can get live stream in local storage of system. using {StreamingMkvReader} and {FragmentMetadataVisitor} ana {OutputSegmentMerger}

Reference Link provide by @zhiyua-git :
https://github.com/aws/amazon-kinesis-video-streams-parser-library/blob/master/src/main/java/com/amazonaws/kinesisvideo/parser/examples/KinesisVideoExample.java#L199

By using OutputSegmentMerger it make live stream as single video.But i need 30min once partition of video for uploading to S3 for start Rekognition.

is any feature available for get Kinesis Video Stream for Rekognition for Age,Gender and Emotions?

Face rekogniton in rtsp link

I have a very quick question regarding face recognition in the rtsp link. Do this code provide support for the rtsp link or I have to upload the mkv file only?

Web console shows video but JFrame is blank

Hello;

I am trying to use the parser library to show a video stream in JFrame. I am using the KinesisVideoRendererExample as following

KinesisVideoRendererExample example = KinesisVideoRendererExample.builder().region(Regions.US_EAST_1) .streamName("evastream") .credentialsProvider(new ProfileCredentialsProvider()) // Display the tags in the frame viewer window .renderFragmentMetadata(false) // Use existing stream in KVS (with Producer sending) .noSampleInputRequired(true) .build(); example.execute();

This code successfully shows the stream when I put data in the stream using one of the supplied .mkv files, but whenever I am trying to view the stream where data is put using using gstreamer sample app (that is capturing and putting media from a raspberry pi camera), the JFrame shows nothing. There is no error that pops up, also I am able to view the stream in the Kinesis console. However, the JFrame just shows a blank (black) window. Can you please help what may be going on?

[Edit] If I stream to the same kinesis stream from the mkv file (provided) and after that I stream to the same stream from raspberry pi (using gstreamer), and I select startselectortype to be earliest, only the .mkv portion of the stream shows in JFrame. Can you tell me what's special about this mkv file that it makes the parses render it, while it cannot render gstreamer stream?

cannot find symbol symbol: class FrameBuilder

I cloned the amazon-kinesis-video-streams-parser-library and imported the project to my IDEA IDE. When I ran the example, it stopped at the following error:
---------------->
Error:(79, 20) java: cannot find symbol
symbol: class FrameBuilder
location: class com.amazonaws.kinesisvideo.parser.mkv.Frame
<-----------------
Where can I find the class 'FrameBuilder'?

Python OpenCV consumer

Hello, I am creating video analytics algorithms using Python and OpenCV and would like to run these algorithms on a live KVS stream using the GetMedia API.

What is the recommended way to access the frame level data in Python? Do we have to essentially rewrite in Python the stream parsing capability written in Java here? Or is there a recommended way to leverage the existing library here and perhaps pipe the data over to Python somehow?

Thanks.

KinesisVideoRenderExampleTest fails with an ArrayIndexOutOfBoundsException

I am attempting to run the KinesisVideoRenderExampleTest locally on OSX. I have been able to successfully run the Java producer in order to write a stream and am now attempting to pull the same stream with no luck. Any idea what else I can try here?

Stack Trace:

java.lang.ArrayIndexOutOfBoundsException
	at java.lang.System.arraycopy(Native Method)
	at org.jcodec.codecs.h264.decode.SliceDecoder.putMacroblock(SliceDecoder.java:198)
	at org.jcodec.codecs.h264.decode.SliceDecoder.decodeMacroblocks(SliceDecoder.java:104)
	at org.jcodec.codecs.h264.decode.SliceDecoder.decodeFromReader(SliceDecoder.java:73)
	at org.jcodec.codecs.h264.H264Decoder$FrameDecoder.decodeFrame(H264Decoder.java:152)
	at org.jcodec.codecs.h264.H264Decoder.decodeFrameFromNals(H264Decoder.java:103)
	at com.amazonaws.kinesisvideo.parser.examples.KinesisVideoRendererExample$ParsingVisitor.visit(KinesisVideoRendererExample.java:230)
	at com.amazonaws.kinesisvideo.parser.mkv.MkvDataElement.accept(MkvDataElement.java:138)
	at com.amazonaws.kinesisvideo.parser.mkv.visitors.CompositeMkvElementVisitor.visitAll(CompositeMkvElementVisitor.java:68)
	at com.amazonaws.kinesisvideo.parser.mkv.visitors.CompositeMkvElementVisitor.visit(CompositeMkvElementVisitor.java:57)
	at com.amazonaws.kinesisvideo.parser.mkv.MkvDataElement.accept(MkvDataElement.java:138)
	at com.amazonaws.kinesisvideo.parser.examples.GetMediaWorker.run(GetMediaWorker.java:93)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

Consumer hanging - Detected time code going back from Optional[2283360] to 0

Hi,
We want to use AWS Kinesis Video Streams for our video pipeline working in realtime.
For test purposes we are using kvssink as producer to push mp4 file with 4k video.

Our setup
Producer
Built from two Gstreamer pipelines.

filesrc location=/root/bin/producer/video/movie.mp4 ! qtdemux ! video/x-h264,format=avc,alignment=au ! h264parse ! video/x-h264,stream-format=avc,alignment=au ! appsink name=H264_SINK caps=video/x-h264,stream-format=avc,alignment=au

and

appsrc name=video_src caps=video/x-h264,stream-format=avc,alignment=au ! queue ! video/x-h264,stream-format=avc,alignment=au ! kvssink stream-name="StreamName" credential-path=\"/root/.aws/kinesis_credentials\" aws-region=\"eu-west-1\" streaming-type=offline

Video frames are slightly modified in appsink callback, and pushed to appsrc which is than pushed to Kinesis through kvssink.

Kinesis stream
Stream have retention period set to 1h.

Consumer is based on example:
https://github.com/aws/amazon-kinesis-video-streams-parser-library/blob/master/src/main/java/com/amazonaws/kinesisvideo/parser/examples/KinesisVideoGStreamerPiperExample.java

But we've done few modifications, most outstanding are:

changed to 100000 seconds.

And SelectorType changed from EARLIEST to NOW.

Problem
We spot that after ~38 mins, consumer hangs with following log printed:
2020-02-11 10:52:40 INFO OutputSegmentMerger:Detected time code going back from Optional[2283360] to 0, state from BUFFERING_CLUSTER_START to DONE

Reason
Weโ€™ve narrowed reason of this to be producer resetting FragmentTimeCode to 0, occuring after refreshing StreamingToken. Below are logs from this process.

INFO - writeHeaderCallback(): RequestId: 81c1be81-8acf-46ef-a844-bc43a7bcba7e
2020-02-11 10:52:38 [140096828532480] DEBUG - getStreamingEndpointCurlHandler(): GetStreamingEndpoint API response: {"DataEndpoint":"https://s-5ac677c0.kinesisvideo.eu-west-1.amazonaws.com"}
2020-02-11 10:52:38 [140096828532480] INFO - getStreamingEndpointResultEvent(): Get streaming endpoint result event.
2020-02-11 10:52:38 [140096828532480] DEBUG - stepStateMachine(): State Machine - Current state: 0x0000000000000020, Next state: 0x0000000000000010
2020-02-11 10:52:38 [140096828532480] INFO - getStreamingTokenResultEvent(): Get streaming token result event

FragmentTimeCode before refresh was 2283360

2020-02-11 10:52:37 [140096836925184] DEBUG - postWriteCallback(): Curl post body write function for stream with handle: LatencyTestStream and upload handle: 0 returned: {"EventType":"BUFFERING","FragmentTimecode":2283360,"FragmentNumber":"91343852333181857040777858611842905773666046157"}

Next Fragment time code after refresh is 0.

DEBUG - postWriteCallback(): Curl post body write function for stream with handle: LatencyTestStream and upload handle: 1 returned: {"EventType":"BUFFERING","FragmentTimecode":0,"FragmentNumber":"91343852333181858244055576797232533531246195260"}

Consumer is hanging in that scenario for around 8 mins and than consume again

2020-02-11 11:00:10 INFO  ContinuousGetMediaWorker:Start processing GetMedia called for stream LatencyTestStream response 200 requestId e9a97d96-70af-24f7-bf15-f6ec18693abc
s2020-02-11 11:00:10 INFO  ContinuousGetMediaWorker:Start processing GetMedia called for stream LatencyTestStream response 200 requestId e9a97d96-70af-24f7-bf15-f6ec18693abc
2020-02-11 11:00:10 INFO  MkvChildElementCollector:MkvChildElementCollector for element EBMLTypeInfo(id=374648427, name=Tracks, level=1, type=MASTER, isRecursive=false)
s2020-02-11 11:00:10 INFO  MkvChildElementCollector:MkvChildElementCollector for element EBMLTypeInfo(id=374648427, name=Tracks, level=1, type=MASTER, isRecursive=false)
2020-02-11 11:00:10 INFO  MkvChildElementCollector:MkvChildElementCollector for element EBMLTypeInfo(id=440786851, name=EBML, level=0, type=MASTER, isRecursive=false)
s2020-02-11 11:00:10 INFO  MkvChildElementCollector:MkvChildElementCollector for element EBMLTypeInfo(id=440786851, name=EBML, level=0, type=MASTER, isRecursive=false)

I assume all of that is related to an example was not prepared for long consumption, and some cases are not handled.

Any help in:

  • suggesting what changes we would have to do on example consumer to handle such situation.
    Current idea would be to apply suggestion from this issue #16 and retry GetMedia call.

  • suggesting what to set on producer side to prevent FragmentTimeCode being reset or extend this period when it should be reset to be more than 38 mins.

  • any other feedback about our configuration, which may help improved our code is welcome.

Best regards,
Lukasz

Offtopic: How to treat downloaded fragment with GetMediaForFragmentList API

Hi guys, did not know where to ask this. I've been playing a bit with kinesis and rekognition, and i reached the point where i can get the Framgment data with an API call for a fragment and i would like to see the "content" of that data. First as it is was a picture of the fragment. Is that possible with the data from the GetMediaForFragmentList API? I only put one fragment number in the list. My sole purpose is to try to get the "image" like a still picture/photograph and compare it to what it has detected via the rekognition processor. Hope it is clear. Thanks!

List of fragments

I'm trying to retrieve the list of fragments from kinesis video stream using AWS SDK for NODE js.
This is what I am using:

var params = {
        StreamName: 'STRING_VALUE',
        /* required */
        FragmentSelector: {
                FragmentSelectorType: "SERVER_TIMESTAMP",
                TimestampRange: {
                        EndTimestamp: new Date(),
                        StartTimestamp: 0
                }
        }
};
kinesisvideoarchivedmedia.listFragments(params, function (err, data) {
        if (err) console.log(err, err.stack); // an error occurred
        else console.log(data); // successful response
});

I have tried with actual timestamps and switching between SERVER and PRODUCER timestamp in the "FragmentSelectorType" but the response is always a completely empty object.

If I try with the getMedia API specifying a timestamp of the stream it actually works, but how can I retrieve the list of archived media?
Thanks

Growing trend in producer to consumer latency - is it normal?

Our setup
Producer
Built from two Gstreamer pipelines.

filesrc location=/root/bin/producer/video/movie.mp4 ! qtdemux ! video/x-h264,format=avc,alignment=au ! h264parse ! video/x-h264,stream-format=avc,alignment=au ! appsink name=H264_SINK caps=video/x-h264,stream-format=avc,alignment=au

and

appsrc name=video_src caps=video/x-h264,stream-format=avc,alignment=au ! queue ! video/x-h264,stream-format=avc,alignment=au ! kvssink stream-name="StreamName" credential-path=\"/root/.aws/kinesis_credentials\" aws-region=\"eu-west-1\" absolute-fragment-times=true rotation-period=70

Video frames are slightly modified in appsink callback (attached producer system time), and pushed to appsrc which is than pushed to Kinesis through kvssink.

Kinesis stream
Stream have retention period set to 1h.

Consumer
Consumer is based on example:
https://github.com/aws/amazon-kinesis-video-streams-parser-library/blob/master/src/main/java/com/amazonaws/kinesisvideo/parser/examples/KinesisVideoGStreamerPiperExample.java

But we've done few modifications, most outstanding are:

changed to 100000 seconds.

And SelectorType changed from EARLIEST to NOW.

Consumer architecture is like on image below:
obraz

PROBLEM
We observed growing latency trend on our consumer. We will look more closely to efficiency of our producer and consumer pipelines but based on checks we've done till now seems that cpu and memory of consumer looks ok.

obraz

Every 45 mins we may see that there is drop in latency. Its caused by some automatic process on consumer which refresh a session? (probably handled by https://github.com/aws/amazon-kinesis-video-streams-parser-library/blob/master/src/main/java/com/amazonaws/kinesisvideo/parser/examples/ContinuousGetMediaWorker.java). Latency drops a bit but trend is still growing.
We expect this line to be more or less flat. Is that correct?

Expectation

  1. Clarification is this growing trend normal or its something wrong?
  2. Advices where we may look to identify root cause of that, if something is wrong with our setup.

Best regards,
Lukasz

Cannot build project on Windows using Eclipse

OS: Windows 10 64-bit
JDK: 1.8.0_152
IDE: Eclipse IDE for Java Developers, Version: Oxygen.3 Release (4.7.3)

I'm trying to build the Java Streams Parser Library following these steps. I started with a fresh install of Eclipse. I cloned the code from this Github repo locally, and imported it into Eclipse. I received the following error:

Execution delombok of goal org.projectlombok:lombok-maven-plugin:1.16.18.1:delombok failed: A required class was missing while executing org.projectlombok:lombok-maven-plugin:1.16.18.1:delombok: com/sun/tools/javac/util/Context
-----------------------------------------------------
realm =    plugin>org.projectlombok:lombok-maven-plugin:1.16.18.1
strategy = org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy
urls[0] = file:/C:/Users/mpflu/.m2/repository/org/projectlombok/lombok-maven-plugin/1.16.18.1/lombok-maven-plugin-1.16.18.1.jar
urls[1] = file:/C:/Users/mpflu/.m2/repository/org/apache/commons/commons-lang3/3.6/commons-lang3-3.6.jar
urls[2] = file:/C:/Users/mpflu/.m2/repository/org/projectlombok/lombok/1.16.18/lombok-1.16.18.jar
urls[3] = file:/C:/Users/mpflu/.m2/repository/org/codehaus/plexus/plexus-utils/1.5.8/plexus-utils-1.5.8.jar
Number of foreign imports: 5
import: Entry[import org.sonatype.plexus.build.incremental from realm ClassRealm[plexus.core, parent: null]]
import: Entry[import org.codehaus.plexus.util.Scanner from realm ClassRealm[plexus.core, parent: null]]
import: Entry[import org.codehaus.plexus.util.DirectoryScanner from realm ClassRealm[plexus.core, parent: null]]
import: Entry[import org.codehaus.plexus.util.AbstractScanner from realm ClassRealm[plexus.core, parent: null]]
import: Entry[import  from realm ClassRealm[maven.api, parent: null]]

-----------------------------------------------------
 (org.projectlombok:lombok-maven-plugin:1.16.18.1:delombok:delombok:generate-sources)

org.apache.maven.plugin.PluginExecutionException: Execution delombok of goal org.projectlombok:lombok-maven-plugin:1.16.18.1:delombok failed: A required class was missing while executing org.projectlombok:lombok-maven-plugin:1.16.18.1:delombok: com/sun/tools/javac/util/Context
-----------------------------------------------------
realm =    plugin>org.projectlombok:lombok-maven-plugin:1.16.18.1
strategy = org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy
urls[0] = file:/C:/Users/mpflu/.m2/repository/org/projectlombok/lombok-maven-plugin/1.16.18.1/lombok-maven-plugin-1.16.18.1.jar
urls[1] = file:/C:/Users/mpflu/.m2/repository/org/apache/commons/commons-lang3/3.6/commons-lang3-3.6.jar
urls[2] = file:/C:/Users/mpflu/.m2/repository/org/projectlombok/lombok/1.16.18/lombok-1.16.18.jar
urls[3] = file:/C:/Users/mpflu/.m2/repository/org/codehaus/plexus/plexus-utils/1.5.8/plexus-utils-1.5.8.jar
Number of foreign imports: 5
import: Entry[import org.sonatype.plexus.build.incremental from realm ClassRealm[plexus.core, parent: null]]
import: Entry[import org.codehaus.plexus.util.Scanner from realm ClassRealm[plexus.core, parent: null]]
import: Entry[import org.codehaus.plexus.util.DirectoryScanner from realm ClassRealm[plexus.core, parent: null]]
import: Entry[import org.codehaus.plexus.util.AbstractScanner from realm ClassRealm[plexus.core, parent: null]]
import: Entry[import  from realm ClassRealm[maven.api, parent: null]]

-----------------------------------------------------

	at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:168)
	at org.eclipse.m2e.core.internal.embedder.MavenImpl.execute(MavenImpl.java:331)
	at org.eclipse.m2e.core.internal.embedder.MavenImpl$11.call(MavenImpl.java:1362)
	at org.eclipse.m2e.core.internal.embedder.MavenImpl$11.call(MavenImpl.java:1)
	at org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.executeBare(MavenExecutionContext.java:177)
	at org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.execute(MavenExecutionContext.java:112)
	at org.eclipse.m2e.core.internal.embedder.MavenImpl.execute(MavenImpl.java:1360)
	at org.eclipse.m2e.core.project.configurator.MojoExecutionBuildParticipant.build(MojoExecutionBuildParticipant.java:52)
	at org.eclipse.m2e.core.internal.builder.MavenBuilderImpl.build(MavenBuilderImpl.java:137)
	at org.eclipse.m2e.core.project.configurator.AbstractLifecycleMapping.configure(AbstractLifecycleMapping.java:111)
	at org.eclipse.m2e.core.internal.project.ProjectConfigurationManager$3.call(ProjectConfigurationManager.java:508)
	at org.eclipse.m2e.core.internal.project.ProjectConfigurationManager$3.call(ProjectConfigurationManager.java:1)
	at org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.executeBare(MavenExecutionContext.java:177)
	at org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.execute(MavenExecutionContext.java:151)
	at org.eclipse.m2e.core.internal.project.ProjectConfigurationManager.updateProjectConfiguration(ProjectConfigurationManager.java:501)
	at org.eclipse.m2e.core.internal.project.ProjectConfigurationManager.configureNewMavenProjects(ProjectConfigurationManager.java:288)
	at org.eclipse.m2e.core.internal.project.ProjectConfigurationManager$1.call(ProjectConfigurationManager.java:175)
	at org.eclipse.m2e.core.internal.project.ProjectConfigurationManager$1.call(ProjectConfigurationManager.java:1)
	at org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.executeBare(MavenExecutionContext.java:177)
	at org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.execute(MavenExecutionContext.java:151)
	at org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.execute(MavenExecutionContext.java:99)
	at org.eclipse.m2e.core.internal.embedder.MavenImpl.execute(MavenImpl.java:1355)
	at org.eclipse.m2e.core.internal.project.ProjectConfigurationManager.importProjects(ProjectConfigurationManager.java:143)
	at org.eclipse.m2e.core.ui.internal.wizards.ImportMavenProjectsJob$1.doCreateMavenProjects(ImportMavenProjectsJob.java:68)
	at org.eclipse.m2e.core.ui.internal.wizards.AbstractCreateMavenProjectsOperation.run(AbstractCreateMavenProjectsOperation.java:73)
	at org.eclipse.m2e.core.ui.internal.wizards.ImportMavenProjectsJob.runInWorkspace(ImportMavenProjectsJob.java:77)
	at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:39)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:56)
Caused by: org.apache.maven.plugin.PluginContainerException: A required class was missing while executing org.projectlombok:lombok-maven-plugin:1.16.18.1:delombok: com/sun/tools/javac/util/Context
-----------------------------------------------------
realm =    plugin>org.projectlombok:lombok-maven-plugin:1.16.18.1
strategy = org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy
urls[0] = file:/C:/Users/mpflu/.m2/repository/org/projectlombok/lombok-maven-plugin/1.16.18.1/lombok-maven-plugin-1.16.18.1.jar
urls[1] = file:/C:/Users/mpflu/.m2/repository/org/apache/commons/commons-lang3/3.6/commons-lang3-3.6.jar
urls[2] = file:/C:/Users/mpflu/.m2/repository/org/projectlombok/lombok/1.16.18/lombok-1.16.18.jar
urls[3] = file:/C:/Users/mpflu/.m2/repository/org/codehaus/plexus/plexus-utils/1.5.8/plexus-utils-1.5.8.jar
Number of foreign imports: 5
import: Entry[import org.sonatype.plexus.build.incremental from realm ClassRealm[plexus.core, parent: null]]
import: Entry[import org.codehaus.plexus.util.Scanner from realm ClassRealm[plexus.core, parent: null]]
import: Entry[import org.codehaus.plexus.util.DirectoryScanner from realm ClassRealm[plexus.core, parent: null]]
import: Entry[import org.codehaus.plexus.util.AbstractScanner from realm ClassRealm[plexus.core, parent: null]]
import: Entry[import  from realm ClassRealm[maven.api, parent: null]]

-----------------------------------------------------

	at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:166)
	... 27 more
Caused by: java.lang.NoClassDefFoundError: com/sun/tools/javac/util/Context
	at lombok.delombok.Delombok.<init>(Delombok.java:69)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at java.lang.Class.newInstance(Unknown Source)
	at lombok.launch.Delombok.<init>(Delombok.java:32)
	at lombok.maven.AbstractDelombokMojo.execute(AbstractDelombokMojo.java:135)
	at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
	... 27 more
Caused by: java.lang.ClassNotFoundException: com.sun.tools.javac.util.Context
	at java.lang.ClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at lombok.launch.ShadowClassLoader.loadClass(ShadowClassLoader.java:422)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	... 36 more

If I try to build the application, I receive many more errors, mostly about a particular Class cannot be resolved to a type.

I saw this issue, and I tried downloading lombok.jar, installing it (by double-clicking and loading to Eclipse using the Wizard). I then re-cloned this repo and tried importing again. I still get the same result.

Following the advice on this SO article, I manually added the tools.jar package to the JDK version in Eclipse. That had no effect.

Following the suggestion on this SO article, I added the JDK path to my System PATH, but that didn't work either.

What else can I try?

kinesis List stream/multi-stream issue

Hi,

Im can able to consume frames by using parser libaray. i can be able to get images and locally i can able to save. Now i try to change multiple streams, though i try to get list streams and get the list of stream names iterate based on stream names consume records. Im refering this below documentation,
https://docs.aws.amazon.com/streams/latest/dev/kinesis-using-sdk-java-list-streams.html
AmazonKinesisClient, Liststreams and ListstreamResult module integration issue, can you pleasehelp me out how to do in multiple streams

Failure in GetMediaWorker for streamName error when running KinesisVideoRekognitionIntegrationExampleTest

I get this error after a few seconds of running KinesisVideoRekognitionIntegrationExampleTest. I use Eclipse and run JUnit Test. I think I've configured all that I need to in the code. I'm not sure what I'm doing wrong.

2019-06-26 07:46:59 ERROR Worker:Worker.run caught exception, sleeping for 1000 milli seconds!
sjava.lang.InterruptedException: sleep interrupted
	at java.lang.Thread.sleep(Native Method)
	at com.amazonaws.services.kinesis.clientlibrary.lib.worker.Worker.runProcessLoop(Worker.java:602)
	at com.amazonaws.services.kinesis.clientlibrary.lib.worker.Worker.run(Worker.java:572)
	at com.amazonaws.kinesisvideo.parser.kinesis.KinesisDataStreamsWorker.run(KinesisDataStreamsWorker.java:55)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
2019-06-26 07:46:59 ERROR Worker:Worker.run caught exception, sleeping for 1000 milli seconds!
java.lang.InterruptedException: sleep interrupted
	at java.lang.Thread.sleep(Native Method)
	at com.amazonaws.services.kinesis.clientlibrary.lib.worker.Worker.runProcessLoop(Worker.java:602)
	at com.amazonaws.services.kinesis.clientlibrary.lib.worker.Worker.run(Worker.java:572)
	at com.amazonaws.kinesisvideo.parser.kinesis.KinesisDataStreamsWorker.run(KinesisDataStreamsWorker.java:55)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
Rendering non-sampled frame with previous rekognized results...
07:46:59.778 [pool-2-thread-2] ERROR com.amazonaws.kinesisvideo.parser.examples.GetMediaWorker - Failure in GetMediaWorker for streamName <stream_name>  com.amazonaws.AbortedException: 

Wait for response from

Hello;

Probably because I am new to Java, I am having this trouble. I want to list the fragments within a timerange using kinesisvideoarchivedmedia. I am using the following code to get the list of fragments first so that I can call getmediafromfragments on them.

public void run() {
	System.out.println("*****inside getmedia");
        int i = 1;
        try{
	System.out.println("got here 1");
        TimestampRange timestampRange = new TimestampRange();
        timestampRange.setStartTimestamp(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").parse("25/01/2019 21:15:59"));
        timestampRange.setEndTimestamp(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").parse("25/01/2019 21:16:59")); 

        FragmentSelector fragmentSelector = new FragmentSelector();
        fragmentSelector.setFragmentSelectorType("SERVER_TIMESTAMP");
        fragmentSelector.setTimestampRange(timestampRange);
        System.out.println("got here 2");

        ListFragmentsRequest request = new ListFragmentsRequest();
        request.setStreamName("evastream");
        request.setFragmentSelector(fragmentSelector);
        request.setMaxResults((long) 100);
        request.setRequestCredentialsProvider(getCredentialsProvider());
	System.out.println("got here 3");

        ListFragmentsResult result = this.videoMedia.listFragments(request);
	System.out.println("got here 4");
        System.out.println("Result");
        System.out.println(result);        
        }catch ( ParseException e){
		System.out.println("Got exception!!!!!!!!!!");
		int x = 1;}
    }

But the problem is, the code returns before I cam print the result from listFragments(). Is it because it is a asynchronous call? Or there is something wrong with my code? The code does not exception or anything, just it prints until "got here 3" . Any suggestion will be appreciated!

question about KinesisVideoRekognitionIntegrationExampleTest

I am running this testcase, but the result video is the same as the input. It cannot draw box around the faces. I have create a collection and index Bezos's face. There is no other instructions about this test. I don't know where I did wrong.

Error: Could not find or load main class - KinesisVideo - Rekognition Examples

Hi everyone.

This regards "KinesisVideoRekognitionIntegrationExample" found in the following link.
https://github.com/aws/amazon-kinesis-video-streams-parser-library#kinesisvideo---rekognition-examples.

I built the project by running the command: mvn clean package. A target folder was created with four jar files. I got the following error trying to run the "KinesisVideoRekognitionIntegrationExampleTest" class:

C:\Users\IEUser\amazon-kinesis-video-streams-parser-library>java -cp target\amazon-kinesis-video-streams-parser-library-1.0.14.jar com.amazonaws.kinesisvideo.parser.examples.KinesisVideoRekognitionIntegrationExampleTest
Error: Could not find or load main class com.amazonaws.kinesisvideo.parser.examples.KinesisVideoRekognitionIntegrationExampleTest
C:\Users\IEUser\awsProjects\amazon-kinesis-video-streams-parser-library>

Quick backgrounder:
I've been trying to build up on "Kinesis Video Streams Producer SDK on Windows using MSVC (Microsoft Visual C++) found in:
https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/install-instructions-windows-msvc.md

NOTE: I had some issues regards the aforementioned which was solved (please see issue#283 found in the following link:)
awslabs/amazon-kinesis-video-streams-producer-sdk-cpp#283

Thanks

Extract specific frame from the fragment

I am using kinesis-video-streams-parser-library to extract particular frame from a fragment.
I have the json input
"frameMetaData":
Frame(trackNumber=1, timeCode=0, keyFrame=true, invisible=false, discardable=false, lacing=NO)",
"fragmentMetaData": "FragmentMetadata(fragmentNumberString=91343852333181492645699654719911616955122530663, serverSideTimestampMillis=1564523828166, producerSideTimestampMillis=722643, fragmentNumber=91343852333181492645699654719911616955122530663, success=true, errorId=0, errorCode=null, millisBehindNow=OptionalLong.empty, continuationToken=Optional.empty)

Does anybody know how I can locate the frame specified by the timeCode and extract the frame?

Thanks!

Is SDK available as JAR?

Hi,

The example contained in this repository, code are in com.amazonaws.kinesisvideo.parser.*

I found on Maven Repository this SDK:

<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-kinesisvideo -->
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-kinesisvideo</artifactId>
    <version>1.11.409</version>
</dependency>

But, in this SDK doesn't have a parser package.

To run the parser library outside of this example project, do I need to copy all code to there. Or do you have a JAR release version of project?

Thanks.

Running KinesisVideoRekognitionIntegrationExampleTest Error

I can only got one picture from this test instead of a video and this is the error message.
It seems there is only one thread worked. Anyone met the same issue?

ERROR com.amazonaws.kinesisvideo.parser.examples.GetMediaWorker - Failure in GetMediaWorker for streamName <stream_name> java.util.NoSuchElementException: No value present

Java/ Maven requirements

What are the requirements for Java version, maven and others? I'm not able to successfully build this project with Java 11.0.1 and maven 3.2 (downgraded because of version specified in pom.xml file).

Thanks!

Use with SageMaker instead of Rekognition

I actually don't know where to start, but I already have a Sagemaker endpoint for object detection with Kinesis Video Stream. And I would like to add bounding boxes to it.

I just started using this with Rekognition and I want to change it to Sagemaker. And I don't know where to actually start editing. Any help would be great.

Kinesis Video Streams data store

Hi ,

I have some questions ,

What is the kinesis video stream output ? I using parsing library to parses the merged output to print out the elements, only their offsets and size of the element in bytes but i can't find any actual video frames data .

The output format as follows:

Element Tags elementNumber 84 offset 916 element header size 8 element data size 235
Element Tag elementNumber 85 offset 924 element header size 6 element data size 229
Element SimpleTag elementNumber 86 offset 930 element header size 6 element data size 91
Element TagName elementNumber 87 offset 936 element header size 6 element data size 32
Tag Name :AWS_KINESISVIDEO_FRAGMENT_NUMBER
Element TagString elementNumber 88 offset 974 element header size 6 element data size 47
Element SimpleTag elementNumber 89 offset 1027 element header size 6 element data size 59
Element TagName elementNumber 90 offset 1033 element header size 6 element data size 33
Tag Name :AWS_KINESISVIDEO_SERVER_TIMESTAMP
Element TagString elementNumber 91 offset 1072 element header size 6 element data size 14
Element SimpleTag elementNumber 92 offset 1092 element header size 6 element data size 61
Element TagName elementNumber 93 offset 1098 element header size 6 element data size 35
Tag Name :AWS_KINESISVIDEO_PRODUCER_TIMESTAMP
Element TagString elementNumber 94 offset 1139 element header size 6 element data size 14
Element Cluster elementNumber 95 offset 1159 element header size 12 element data size 546583
Element CRC-32 elementNumber 96 offset 1171 element header size 2 element data size 4
Element Timecode elementNumber 97 offset 1177 element header size 2 element data size 1
Element SimpleBlock elementNumber 98 offset 1180 element header size 4 element data size 111839
Frame data (size): 111835 Frame(trackNumber=1, timeCode=0, keyFrame=true, invisible=false, discardable=false, lacing=NO)
Element SimpleBlock elementNumber 99 offset 113023 element header size 3 element data size 5911
Frame data (size): 5907 Frame(trackNumber=1, timeCode=33, keyFrame=false, invisible=false, discardable=false, lacing=NO)
Element SimpleBlock elementNumber 100 offset 118937 element header size 3 element data size 5215
Frame data (size): 5211 Frame(trackNumber=1, timeCode=67, keyFrame=false, invisible=false, discardable=false, lacing=NO)
Element SimpleBlock elementNumber 101 offset 124155 element header size 3 element data size 4953
Frame data (size): 4949 Frame(trackNumber=1, timeCode=100, keyFrame=false, invisible=false, discardable=false, lacing=NO)
Element SimpleBlock elementNumber 102 offset 129111 element header size 3 element data size 10084
Frame data (size): 10080 Frame(trackNumber=1, timeCode=133, keyFrame=false, invisible=false, discardable=false, lacing=NO)
Element SimpleBlock elementNumber 103 offset 139198 element header size 3 element data size 14899
Frame data (size): 14895 Frame(trackNumber=1, timeCode=167, keyFrame=false, invisible=false, discardable=false, lacing=NO)
Element SimpleBlock elementNumber 104 offset 154100 element header size 3 element data size 8184
Frame data (size): 8180 Frame(trackNumber=1, timeCode=200, keyFrame=false, invisible=false, discardable=false, lacing=NO)
Element SimpleBlock elementNumber 105 offset 162287 element header size 3 element data size 4531
Frame data (size): 4527 Frame(trackNumber=1, timeCode=233, keyFrame=false, invisible=false, discardable=false, lacing=NO)
Element SimpleBlock elementNumber 106 offset 166821 element header size 3 element data size 6178
Frame data (size): 6174 Frame(trackNumber=1, timeCode=267, keyFrame=false, invisible=false, discardable=false, lacing=NO)
Element SimpleBlock elementNumber 107 offset 173002 element header size 3 element data size 11434
Frame data (size): 11430 Frame(trackNumber=1, timeCode=300, keyFrame=false, invisible=false, discardable=false, lacing=NO)
Element SimpleBlock elementNumber 108 offset 184439 element header size 3 element data size 12073
Frame data (size): 12069 Frame(trackNumber=1, timeCode=333, keyFrame=false, invisible=false, discardable=false, lacing=NO)
Element SimpleBlock elementNumber 109 offset 196515 element header size 3 element data size 7512
Frame data (size): 7508 Frame(trackNumber=1, timeCode=367, keyFrame=false, invisible=false, discardable=false, lacing=NO)
Element SimpleBlock elementNumber 110 offset 204030 element header size 3 element data size 9619
Frame data (size): 9615 Frame(trackNumber=1, timeCode=400, keyFrame=false, invisible=false, discardable=false, lacing=NO)
Element SimpleBlock elementNumber 111 offset 213652 element header size 3 element data size 14909
Frame data (size): 14905 Frame(trackNumber=1, timeCode=433, keyFrame=false, invisible=false, discardable=false, lacing=NO)
Element SimpleBlock elementNumber 112 offset 228564 element header size 3 element data size 7516
Frame data (size): 7512 Frame(trackNumber=1, timeCode=467, keyFrame=false, invisible=false, discardable=false, lacing=NO)
................................................................................................................................................................
................................................................................................................................................................

Can i use parsing libraries to merge multiple streams (ex: Three sections of 10 seconds video) into a single stream(30 seconds video)?

Extracting metadata latency

Copy from awslabs/amazon-kinesis-video-streams-producer-sdk-cpp#55

Is there a more efficient way of extracting data from the stream. Attempting to pull JSON out of MKV fragments has yielded the following results:

Profiling for 10 fragments/10 frames (times in ms)

  • getting fragment list took 2469 (aus to us-east-1)
  • getting media (fragments) took 1927 (aus to us-east-1)
  • extracting metadata took: 746

simply running this loop

while (mkvStreamReader.mightHaveNext) {
          val mkvElement: Optional[MkvElement] = mkvStreamReader.nextIfAvailable
}

took the following:
594 iterations
507 ms

For extracting the data, we've used the visitor pattern, as per the SDK. The issue appears to be that even for a small number of fragments, there is a large number of elements visited (some 50x number of fragments or more).

  • Is visiting each MKV element to determine if it contains the required data necessary?
  • Is there a more efficient way of extracting this data?
  • Is this just a limitation of storing data in MKV containers?
  • Is the visitor pattern appropriate for this use case?

ContiniuousGetMedia is bit slower

Hi, I have written a subscriber using GetMedia Api and it is successfully pulling the fragments from Kinesis video stream, but it is not pulling the stream with the same rate as my gstreamer producer is pushing the stream, although i am using c5.xlarge ec2 instance which gives good bandwidth

StartSelector selectorToUse = fragmentNumberToStartAfter.map(fn -> new StartSelector()
						.withStartSelectorType(StartSelectorType.FRAGMENT_NUMBER).withAfterFragmentNumber(fn))
						.orElse(startSelector);
				result = this.videoMedia.getMedia(
						new GetMediaRequest().withStreamName(this.streamName).withStartSelector(selectorToUse));

save streams into as png format local disk

Hi,

I try to save each frame into image png format, while i can able get live kinesis video viewer, but i don't know how to save images locally. I did piece code in FrameRendererVisitor module, but frames not save locally. Please help me out from this issue.
After that
AWTUtil.toBufferedImage(rgb, renderImage);
try {
System.out.println("writing into local disk");
ImageIO.write(renderImage, "png", new File(String.format("frame-capture-%s.png", UUID.randomUUID())));
} catch (IOException e) {
log.warn("Couldn't convert to a PNG", e);
}

getMedia() works but getMediaForFragmentList() causes Exception though Fragmentlist is there

First of all, I really like the prompt response from the peers in this forum. Thank you.

I am stuck at the last step of code I am writing to store video for a timerange in a file. I am following the guideline of the provided KinesisVideoExample code. The provided code works and it stores the current stream into a video file using getMedia().

But when I modified the GetMediaWorker class to capture media for a list of fragments and used it to create the video in KinesisVideoExample, I am getting a java.util.NoSuchElementException: No value present exception. Here's the only code that I modified:

public void run() {
        System.out.println("*****inside getmedia");
        int i = 1;
        try{
                 System.out.println("got here 1");
                //create timestamp range to get the fragments
                TimestampRange timestampRange = new TimestampRange();
                timestampRange.setStartTimestamp(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").parse("26/01/2019 1:57:15"));
                timestampRange.setEndTimestamp(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").parse("26/01/2019 1:58:02")); 
                FragmentSelector fragmentSelector = new FragmentSelector();
                 fragmentSelector.setFragmentSelectorType("SERVER_TIMESTAMP");
                 fragmentSelector.setTimestampRange(timestampRange);
                System.out.println("got here 2");
       

                 ListFragmentsRequest request = new ListFragmentsRequest();
                 request.setStreamName("evastream");
                 request.setFragmentSelector(fragmentSelector);
                 request.setMaxResults((long) 100);
                 request.setRequestCredentialsProvider(getCredentialsProvider());
                 System.out.println("got here 3");
                 ListFragmentsResult result_fragments = this.videoMedia1.listFragments(request);
            
                  //extract the fragment numbers in a list
                  List<Fragment> fragments = result_fragments.getFragments();
                  List<String> fragment_numbers = new ArrayList<String>();;
                  for (i = 0; i < fragments.size(); i++) {
                         fragment_numbers.add(fragments.get(i).getFragmentNumber());
                  }
                  System.out.println("got here 4");
                  System.out.println("Result");
                  System.out.println(fragment_numbers);   
            
        
                  //get the media and save to file
                 try {
                          log.info("Start GetMedia worker on stream {}", streamName);

                         GetMediaForFragmentListResult result = videoMedia2.getMediaForFragmentList(new GetMediaForFragmentListRequest().withStreamName("evastream").withFragments(fragment_numbers));
                         System.out.println("got here 5" + result);


                         StreamingMkvReader mkvStreamReader = StreamingMkvReader.createDefault(new InputStreamParserByteSource(result.getPayload()));

                         System.out.println("got here 6");

                         log.info("StreamingMkvReader created for stream {} ", streamName);
                         try {
                                 mkvStreamReader.apply(this.elementVisitor);
		                System.out.println("got here 7");

                         } catch (MkvElementVisitException e) {
                                 log.error("Exception while accepting visitor {}", e);
                         }
              } catch (Throwable t) {
                       log.error("Failure in GetMediaWorker for streamName {} {}", streamName, t.toString());
                       throw t;
             } finally {
                       log.info("Exiting GetMediaWorker for stream {}", streamName);
             }
        } .  catch (Exception e){
                    System.out.println("Got exception!!!!!!!!!!" + e);
        }
    }

And here's my output:
got here 1 got here 2 got here 3 got here 4 Result [91343852333182130942439190729095929711417800847, 91343852333182130952342711043378974327665059005, 91343852333182130912728629786246795832790312052, 91343852333182130922632150100529840454139928736, 91343852333182130917680389943388318140851604430, 91343852333182130907776869629105273524258966667, 91343852333182130937487430571954407403121378283, 91343852333182130947390950886237452019294439540, 91343852333182130927583910257671362759149774872, 91343852333182130932535670414812885071857711056] got here 5{ContentType: video/webm,Payload: com.amazonaws.event.ResponseProgressInputStream@13c04038} got here 6 Got exception!!!!!!!!!!java.util.NoSuchElementException: No value present
Can anybody please help with that? As seen from the output, I am getting the fragment list also the payload looks fine! The exception occurs in this line: mkvStreamReader.apply(this.elementVisitor);

Parser Maven Release is not Dependency Minimal

+- com.amazonaws:amazon-kinesis-video-streams-parser-library:jar:1.0.8:compile
[INFO] | +- org.apache.commons:commons-lang3:jar:3.6:compile
[INFO] | +- org.slf4j:slf4j-api:jar:1.7.10:compile
[INFO] | +- com.amazonaws:aws-java-sdk:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-transcribe:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-autoscalingplans:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-workmail:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-servicediscovery:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-cloud9:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-serverlessapplicationrepository:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-alexaforbusiness:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-resourcegroups:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-comprehend:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-translate:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-sagemaker:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-iotjobsdataplane:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-sagemakerruntime:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-appsync:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-guardduty:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-mq:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-mediaconvert:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-mediastore:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-mediastoredata:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-medialive:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-mediapackage:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-costexplorer:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-pricing:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-mobile:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-cloudhsmv2:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-glue:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-migrationhub:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-dax:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-greengrass:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-athena:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-marketplaceentitlement:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-codestar:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-lexmodelbuilding:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-resourcegroupstaggingapi:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-pinpoint:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-xray:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-opsworkscm:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-support:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-simpledb:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-servicecatalog:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-servermigration:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-simpleworkflow:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-storagegateway:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-route53:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-importexport:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-sts:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-sqs:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-rds:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-redshift:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-elasticbeanstalk:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-glacier:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-iam:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-datapipeline:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-elasticloadbalancing:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-elasticloadbalancingv2:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-emr:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-elasticache:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-elastictranscoder:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-ec2:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-dynamodb:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-sns:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-budgets:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-cloudtrail:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-cloudwatch:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-logs:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-events:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-cognitoidentity:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-cognitosync:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-directconnect:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-cloudformation:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-cloudfront:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-clouddirectory:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-kinesis:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-opsworks:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-ses:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-autoscaling:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-cloudsearch:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-cloudwatchmetrics:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-codedeploy:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-codepipeline:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-config:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-lambda:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-ecs:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-ecr:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-cloudhsm:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-ssm:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-workspaces:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-machinelearning:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-directory:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-efs:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-codecommit:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-devicefarm:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-elasticsearch:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-waf:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-marketplacecommerceanalytics:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-inspector:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-iot:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-api-gateway:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-acm:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-gamelift:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-dms:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-marketplacemeteringservice:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-cognitoidp:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-discovery:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-applicationautoscaling:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-snowball:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-rekognition:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-polly:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-lightsail:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-stepfunctions:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-health:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-costandusagereport:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-codebuild:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-appstream:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-shield:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-batch:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-lex:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-mechanicalturkrequester:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-organizations:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-workdocs:jar:1.11.289:compile
[INFO] | | +- com.amazonaws:aws-java-sdk-models:jar:1.11.289:compile
[INFO] | | - com.amazonaws:aws-java-sdk-swf-libraries:jar:1.11.22:compile

Unless you're doing some crazy stuff, I'm guessing snowball isn't a dependency

This is an issue for Lambda projects, like Connect Media Streams integrations.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.