This software is a fork of the great initiative of the paratech/klvdata project. The modules of klvdata in QGIS were modified by the QGIS project, which improved the way of popularizing the structure of the metadatalist(). So i'd like to thank Project QGIS too.
There is 2 new examples (in 'examples' folder):
- This script receives as command line parameter the name of the klvdata binary file and writes a Pickle file(.pkl) preserving the python object for reuse.
- This script ignore Unknown Elements that prevent its functioning
Example: .. code-block:: console
$ ./metadataToPickleData.py <binary file extracted from .TS video>
- This script receives as command line parameter the name of the klvdata binary file and writes a JSON file.
- This script ignore Unknown Elements that prevent its functioning
Example: .. code-block:: console
$ ./metadataToJson.py <binary file extracted from .TS video>
** Notice: The first argument parameter maybe change if run script using python <name script> so perhaps you need change args[1] to args[2] in script.
Klvdata is a Python library for parsing and constructing Key Length Value (KLV) formatted binary streams. Common uses of the library would be parsing and displaying MISB ST 0601 Unmanned Air System (UAS) metadata from STANAG 4609 compliant MPEG-2 Transport Streams (TS) (MPEG-TS). Note that klvdata alone cannot de-mux KLV data from an MPEG-2 TS, but programs like FFmpeg and GStreamer can be used with klvdata in the workflow to perform the function.
Not many opensource options available.
- Parses KLV metadata streams.
- Supports MISB ST 0601 UAS Datalink Local Set.
- Supports MISB ST 0102 Security Metadata Local Set.
- Built for Python 3.5, 3.6.
- Requires no external Python dependencies.
Try these commands in your GNU/Linux terminal.
First:
$ pip install klvdata
$ wget https://raw.githubusercontent.com/paretech/klvdata/master/data/DynamicConstantMISMMSPacketData.bin
$ cat << EOF > klvdata_test.py
#!/usr/bin/env python
import sys, klvdata;
for packet in klvdata.StreamParser(sys.stdin.buffer.read()): packet.structure()
EOF
And then:
$ python ./klvdata_test.py < DynamicConstantMISMMSPacketData.bin
<class 'klvdata.misb0601.UASLocalMetadataSet'>
<class 'klvdata.misb0601.PrecisionTimeStamp'>
<class 'klvdata.misb0601.MissionID'>
<class 'klvdata.misb0601.PlatformHeadingAngle'>
<class 'klvdata.misb0601.PlatformPitchAngle'>
<class 'klvdata.misb0601.PlatformRollAngle'>
<class 'klvdata.misb0601.PlatformDesignation'>
<class 'klvdata.misb0601.ImageSourceSensor'>
<class 'klvdata.misb0601.ImageCoordinateSystem'>
<class 'klvdata.misb0601.SensorLatitude'>
<class 'klvdata.misb0601.SensorLongitude'>
<class 'klvdata.misb0601.SensorTrueAltitude'>
<class 'klvdata.misb0601.SensorHorizontalFieldOfView'>
<class 'klvdata.misb0601.SensorVerticalFieldOfView'>
<class 'klvdata.misb0601.SensorRelativeAzimuthAngle'>
<class 'klvdata.misb0601.SensorRelativeElevationAngle'>
<class 'klvdata.misb0601.SensorRelativeRollAngle'>
<class 'klvdata.misb0601.SlantRange'>
<class 'klvdata.misb0601.TargetWidth'>
<class 'klvdata.misb0601.FrameCenterLatitude'>
<class 'klvdata.misb0601.FrameCenterLongitude'>
<class 'klvdata.misb0601.FrameCenterElevation'>
<class 'klvdata.misb0102.SecurityLocalMetadataSet'>
<class 'klvdata.misb0102.SecurityClassification'>
<class 'klvdata.misb0102.UnknownElement'>
<class 'klvdata.misb0102.UnknownElement'>
<class 'klvdata.misb0102.UnknownElement'>
<class 'klvdata.misb0102.UnknownElement'>
<class 'klvdata.misb0102.UnknownElement'>
<class 'klvdata.misb0601.UASLSVersionNumber'>
<class 'klvdata.misb0601.UnknownElement'>
<class 'klvdata.misb0601.Checksum'>
If you have FFmpeg installed and want to try it on real video from a drone with embedded KLV metadata (~97 MB Download):
$ wget http://samples.ffmpeg.org/MPEG2/mpegts-klv/Day%20Flight.mpg
$ ffmpeg -i Day\ Flight.mpg -map data-re -codec copy -f data - | python ./klvdata_test.py
<class 'klvdata.misb0601.UASLocalMetadataSet'>
<class 'klvdata.misb0601.PrecisionTimeStamp'>
<class 'klvdata.misb0601.UASLSVersionNumber'>
<class 'klvdata.misb0601.PlatformHeadingAngle'>
<class 'klvdata.misb0601.PlatformPitchAngle'>
<class 'klvdata.misb0601.PlatformRollAngle'>
<class 'klvdata.misb0601.ImageSourceSensor'>
<class 'klvdata.misb0601.ImageCoordinateSystem'>
<class 'klvdata.misb0601.SensorLatitude'>
<class 'klvdata.misb0601.SensorLongitude'>
<class 'klvdata.misb0601.SensorTrueAltitude'>
<class 'klvdata.misb0601.SensorHorizontalFieldOfView'>
<class 'klvdata.misb0601.SensorVerticalFieldOfView'>
<class 'klvdata.misb0601.SensorRelativeAzimuthAngle'>
<class 'klvdata.misb0601.SensorRelativeElevationAngle'>
<class 'klvdata.misb0601.SensorRelativeRollAngle'>
<class 'klvdata.misb0601.SlantRange'>
<class 'klvdata.misb0601.TargetWidth'>
<class 'klvdata.misb0601.FrameCenterLatitude'>
<class 'klvdata.misb0601.FrameCenterLongitude'>
<class 'klvdata.misb0601.FrameCenterElevation'>
<class 'klvdata.misb0601.TargetLocationLatitude'>
<class 'klvdata.misb0601.TargetLocationLongitude'>
<class 'klvdata.misb0601.TargetLocationElevation'>
<class 'klvdata.misb0601.PlatformGroundSpeed'>
<class 'klvdata.misb0601.GroundRange'>
<class 'klvdata.misb0601.Checksum'>
[...]
Documentation is available at https://paretech.github.io/klvdata.
Contributions are welcome! See Contributing for details.