mkvparse

package module
v0.0.0-...-dcfd9fd Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 2, 2020 License: MIT Imports: 9 Imported by: 0

README

go-mkvparse: Matroska parser in Go

Fast Matroska (.mkv, .mka) parser, written in Go.

Features:

  • Supports all Matroska tags
  • Supports short-circuiting the parser, making it possible to read specific data (e.g. title, author) without reading the entire file (see the mkvtags example)
  • Also works with WebM (.webm) files
  • Event-based push API
  • No dependencies

API

See the API Reference.

Examples

Besides the examples in the API Reference, there are some larger examples in the examples/ dir:

  • examples/mkvinfo: Example using basic parser API to print all elements
  • examples/mkvtags: Example using the optimized 'sections' API to print all tags without parsing the entire file.
  • examples/mkvcover: Example using the optimized 'sections' API to extract cover images without parsing the entire file

Documentation

Overview

Package mkvparse provides push-style parser functions for parsing Matroska (`.mkv`, `.mka`) files.

Example
package main

import (
	"fmt"
	"log"
	"time"
)

type MyParser struct {
}

func (p *MyParser) HandleMasterBegin(id ElementID, info ElementInfo) (bool, error) {
	return true, nil
}

func (p *MyParser) HandleMasterEnd(id ElementID, info ElementInfo) error {
	return nil
}

func (p *MyParser) HandleString(id ElementID, value string, info ElementInfo) error {
	if id == TitleElement {
		fmt.Printf("%s: %v\n", NameForElementID(id), value)
	}
	return nil
}

func (p *MyParser) HandleInteger(id ElementID, value int64, info ElementInfo) error {
	return nil
}

func (p *MyParser) HandleFloat(id ElementID, value float64, info ElementInfo) error {
	return nil
}

func (p *MyParser) HandleDate(id ElementID, value time.Time, info ElementInfo) error {
	return nil
}

func (p *MyParser) HandleBinary(id ElementID, value []byte, info ElementInfo) error {
	return nil
}

func main() {
	handler := MyParser{}
	if err := ParsePath("example.mkv", &handler); err != nil {
		log.Fatalf("%v", err)
	}
}
Output:

Title: Awesome Movie

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func NameForElementID

func NameForElementID(id ElementID) string

Gives the human-readable name for the given element ID.

Example
fmt.Println(NameForElementID(InfoElement))
Output:

Info

func Parse

func Parse(reader io.Reader, handler Handler) error

Parse the contents of `reader`

func ParsePath

func ParsePath(path string, handler Handler) error

Parse the file pointed to by `path`

func ParseSections

func ParseSections(r io.ReadSeeker, handler Handler, sections ...ElementID) error

Parses only the given sections of `file`.

When present, uses the seek index to avoid having to parse the entire file

Example
package main

import (
	"fmt"
	"log"
	"os"
	"time"
)

type myTitleParser struct {
}

func (p *myTitleParser) HandleMasterBegin(id ElementID, info ElementInfo) (bool, error) {
	return true, nil
}

func (p *myTitleParser) HandleMasterEnd(id ElementID, info ElementInfo) error {
	return nil
}

func (p *myTitleParser) HandleString(id ElementID, value string, info ElementInfo) error {
	if id == TitleElement {
		fmt.Printf("%s: %v\n", NameForElementID(id), value)
	}
	return nil
}

func (p *myTitleParser) HandleInteger(id ElementID, value int64, info ElementInfo) error {
	return nil
}

func (p *myTitleParser) HandleFloat(id ElementID, value float64, info ElementInfo) error {
	return nil
}

func (p *myTitleParser) HandleDate(id ElementID, value time.Time, info ElementInfo) error {
	return nil
}

func (p *myTitleParser) HandleBinary(id ElementID, value []byte, info ElementInfo) error {
	return nil
}

func main() {
	handler := myTitleParser{}
	file, err := os.Open("example.mkv")
	if err != nil {
		log.Fatalf("%v", err)
	}
	defer file.Close()
	if err = ParseSections(file, &handler, InfoElement); err != nil {
		log.Fatalf("%v", err)
	}
}
Output:

Title: Awesome Movie

Types

type ElementID

type ElementID int64

ElementID represents the EBML ID of an element. The supported EBML IDs are documented in the Matroska specification: https://www.matroska.org/technical/specs/index.html

const (
	EBMLElement                        ElementID = 0x1A45DFA3
	EBMLVersionElement                 ElementID = 0x4286
	EBMLReadVersionElement             ElementID = 0x42F7
	EBMLMaxIDLengthElement             ElementID = 0x42F2
	EBMLMaxSizeLengthElement           ElementID = 0x42F3
	DocTypeElement                     ElementID = 0x4282
	DocTypeVersionElement              ElementID = 0x4287
	DocTypeReadVersionElement          ElementID = 0x4285
	VoidElement                        ElementID = 0xEC
	CRC32Element                       ElementID = 0xBF
	SignatureSlotElement               ElementID = 0x1B538667
	SignatureAlgoElement               ElementID = 0x7E8A
	SignatureHashElement               ElementID = 0x7E9A
	SignaturePublicKeyElement          ElementID = 0x7EA5
	SignatureElement                   ElementID = 0x7EB5
	SignatureElementsElement           ElementID = 0x7E5B
	SignatureElementListElement        ElementID = 0x7E7B
	SignedElementElement               ElementID = 0x6532
	SegmentElement                     ElementID = 0x18538067
	SeekHeadElement                    ElementID = 0x114D9B74
	SeekElement                        ElementID = 0x4DBB
	SeekIDElement                      ElementID = 0x53AB
	SeekPositionElement                ElementID = 0x53AC
	InfoElement                        ElementID = 0x1549A966
	SegmentUIDElement                  ElementID = 0x73A4
	SegmentFilenameElement             ElementID = 0x7384
	PrevUIDElement                     ElementID = 0x3CB923
	PrevFilenameElement                ElementID = 0x3C83AB
	NextUIDElement                     ElementID = 0x3EB923
	NextFilenameElement                ElementID = 0x3E83BB
	SegmentFamilyElement               ElementID = 0x4444
	ChapterTranslateElement            ElementID = 0x6924
	ChapterTranslateEditionUIDElement  ElementID = 0x69FC
	ChapterTranslateCodecElement       ElementID = 0x69BF
	ChapterTranslateIDElement          ElementID = 0x69A5
	TimecodeScaleElement               ElementID = 0x2AD7B1
	DurationElement                    ElementID = 0x4489
	DateUTCElement                     ElementID = 0x4461
	TitleElement                       ElementID = 0x7BA9
	MuxingAppElement                   ElementID = 0x4D80
	WritingAppElement                  ElementID = 0x5741
	ClusterElement                     ElementID = 0x1F43B675
	TimecodeElement                    ElementID = 0xE7
	SilentTracksElement                ElementID = 0x5854
	SilentTrackNumberElement           ElementID = 0x58D7
	PositionElement                    ElementID = 0xA7
	PrevSizeElement                    ElementID = 0xAB
	SimpleBlockElement                 ElementID = 0xA3
	BlockGroupElement                  ElementID = 0xA0
	BlockElement                       ElementID = 0xA1
	BlockVirtualElement                ElementID = 0xA2
	BlockAdditionsElement              ElementID = 0x75A1
	BlockMoreElement                   ElementID = 0xA6
	BlockAddIDElement                  ElementID = 0xEE
	BlockAdditionalElement             ElementID = 0xA5
	BlockDurationElement               ElementID = 0x9B
	ReferencePriorityElement           ElementID = 0xFA
	ReferenceBlockElement              ElementID = 0xFB
	ReferenceVirtualElement            ElementID = 0xFD
	CodecStateElement                  ElementID = 0xA4
	DiscardPaddingElement              ElementID = 0x75A2
	SlicesElement                      ElementID = 0x8E
	TimeSliceElement                   ElementID = 0xE8
	LaceNumberElement                  ElementID = 0xCC
	FrameNumberElement                 ElementID = 0xCD
	BlockAdditionIDElement             ElementID = 0xCB
	DelayElement                       ElementID = 0xCE
	SliceDurationElement               ElementID = 0xCF
	ReferenceFrameElement              ElementID = 0xC8
	ReferenceOffsetElement             ElementID = 0xC9
	ReferenceTimeCodeElement           ElementID = 0xCA
	EncryptedBlockElement              ElementID = 0xAF
	TracksElement                      ElementID = 0x1654AE6B
	TrackEntryElement                  ElementID = 0xAE
	TrackNumberElement                 ElementID = 0xD7
	TrackUIDElement                    ElementID = 0x73C5
	TrackTypeElement                   ElementID = 0x83
	FlagEnabledElement                 ElementID = 0xB9
	FlagDefaultElement                 ElementID = 0x88
	FlagForcedElement                  ElementID = 0x55AA
	FlagLacingElement                  ElementID = 0x9C
	MinCacheElement                    ElementID = 0x6DE7
	MaxCacheElement                    ElementID = 0x6DF8
	DefaultDurationElement             ElementID = 0x23E383
	DefaultDecodedFieldDurationElement ElementID = 0x234E7A
	TrackTimecodeScaleElement          ElementID = 0x23314F
	TrackOffsetElement                 ElementID = 0x537F
	MaxBlockAdditionIDElement          ElementID = 0x55EE
	NameElement                        ElementID = 0x536E
	LanguageElement                    ElementID = 0x22B59C
	LanguageIETFElement                ElementID = 0x22B59D
	CodecIDElement                     ElementID = 0x86
	CodecPrivateElement                ElementID = 0x63A2
	CodecNameElement                   ElementID = 0x258688
	AttachmentLinkElement              ElementID = 0x7446
	CodecSettingsElement               ElementID = 0x3A9697
	CodecInfoURLElement                ElementID = 0x3B4040
	CodecDownloadURLElement            ElementID = 0x26B240
	CodecDecodeAllElement              ElementID = 0xAA
	TrackOverlayElement                ElementID = 0x6FAB
	CodecDelayElement                  ElementID = 0x56AA
	SeekPreRollElement                 ElementID = 0x56BB
	TrackTranslateElement              ElementID = 0x6624
	TrackTranslateEditionUIDElement    ElementID = 0x66FC
	TrackTranslateCodecElement         ElementID = 0x66BF
	TrackTranslateTrackIDElement       ElementID = 0x66A5
	VideoElement                       ElementID = 0xE0
	FlagInterlacedElement              ElementID = 0x9A
	FieldOrderElement                  ElementID = 0x9D
	StereoModeElement                  ElementID = 0x53B8
	AlphaModeElement                   ElementID = 0x53C0
	OldStereoModeElement               ElementID = 0x53B9
	PixelWidthElement                  ElementID = 0xB0
	PixelHeightElement                 ElementID = 0xBA
	PixelCropBottomElement             ElementID = 0x54AA
	PixelCropTopElement                ElementID = 0x54BB
	PixelCropLeftElement               ElementID = 0x54CC
	PixelCropRightElement              ElementID = 0x54DD
	DisplayWidthElement                ElementID = 0x54B0
	DisplayHeightElement               ElementID = 0x54BA
	DisplayUnitElement                 ElementID = 0x54B2
	AspectRatioTypeElement             ElementID = 0x54B3
	ColourSpaceElement                 ElementID = 0x2EB524
	GammaValueElement                  ElementID = 0x2FB523
	FrameRateElement                   ElementID = 0x2383E3
	ColourElement                      ElementID = 0x55B0
	MatrixCoefficientsElement          ElementID = 0x55B1
	BitsPerChannelElement              ElementID = 0x55B2
	ChromaSubsamplingHorzElement       ElementID = 0x55B3
	ChromaSubsamplingVertElement       ElementID = 0x55B4
	CbSubsamplingHorzElement           ElementID = 0x55B5
	CbSubsamplingVertElement           ElementID = 0x55B6
	ChromaSitingHorzElement            ElementID = 0x55B7
	ChromaSitingVertElement            ElementID = 0x55B8
	RangeElement                       ElementID = 0x55B9
	TransferCharacteristicsElement     ElementID = 0x55BA
	PrimariesElement                   ElementID = 0x55BB
	MaxCLLElement                      ElementID = 0x55BC
	MaxFALLElement                     ElementID = 0x55BD
	MasteringMetadataElement           ElementID = 0x55D0
	PrimaryRChromaticityXElement       ElementID = 0x55D1
	PrimaryRChromaticityYElement       ElementID = 0x55D2
	PrimaryGChromaticityXElement       ElementID = 0x55D3
	PrimaryGChromaticityYElement       ElementID = 0x55D4
	PrimaryBChromaticityXElement       ElementID = 0x55D5
	PrimaryBChromaticityYElement       ElementID = 0x55D6
	WhitePointChromaticityXElement     ElementID = 0x55D7
	WhitePointChromaticityYElement     ElementID = 0x55D8
	LuminanceMaxElement                ElementID = 0x55D9
	LuminanceMinElement                ElementID = 0x55DA
	ProjectionElement                  ElementID = 0x7670
	ProjectionTypeElement              ElementID = 0x7671
	ProjectionPrivateElement           ElementID = 0x7672
	ProjectionPoseYawElement           ElementID = 0x7673
	ProjectionPosePitchElement         ElementID = 0x7674
	ProjectionPoseRollElement          ElementID = 0x7675
	AudioElement                       ElementID = 0xE1
	SamplingFrequencyElement           ElementID = 0xB5
	OutputSamplingFrequencyElement     ElementID = 0x78B5
	ChannelsElement                    ElementID = 0x9F
	ChannelPositionsElement            ElementID = 0x7D7B
	BitDepthElement                    ElementID = 0x6264
	TrackOperationElement              ElementID = 0xE2
	TrackCombinePlanesElement          ElementID = 0xE3
	TrackPlaneElement                  ElementID = 0xE4
	TrackPlaneUIDElement               ElementID = 0xE5
	TrackPlaneTypeElement              ElementID = 0xE6
	TrackJoinBlocksElement             ElementID = 0xE9
	TrackJoinUIDElement                ElementID = 0xED
	TrickTrackUIDElement               ElementID = 0xC0
	TrickTrackSegmentUIDElement        ElementID = 0xC1
	TrickTrackFlagElement              ElementID = 0xC6
	TrickMasterTrackUIDElement         ElementID = 0xC7
	TrickMasterTrackSegmentUIDElement  ElementID = 0xC4
	ContentEncodingsElement            ElementID = 0x6D80
	ContentEncodingElement             ElementID = 0x6240
	ContentEncodingOrderElement        ElementID = 0x5031
	ContentEncodingScopeElement        ElementID = 0x5032
	ContentEncodingTypeElement         ElementID = 0x5033
	ContentCompressionElement          ElementID = 0x5034
	ContentCompAlgoElement             ElementID = 0x4254
	ContentCompSettingsElement         ElementID = 0x4255
	ContentEncryptionElement           ElementID = 0x5035
	ContentEncAlgoElement              ElementID = 0x47E1
	ContentEncKeyIDElement             ElementID = 0x47E2
	ContentEncAESSettingsElement       ElementID = 0x47E7
	AESSettingsCipherModeElement       ElementID = 0x47E8
	ContentSignatureElement            ElementID = 0x47E3
	ContentSigKeyIDElement             ElementID = 0x47E4
	ContentSigAlgoElement              ElementID = 0x47E5
	ContentSigHashAlgoElement          ElementID = 0x47E6
	CuesElement                        ElementID = 0x1C53BB6B
	CuePointElement                    ElementID = 0xBB
	CueTimeElement                     ElementID = 0xB3
	CueTrackPositionsElement           ElementID = 0xB7
	CueTrackElement                    ElementID = 0xF7
	CueClusterPositionElement          ElementID = 0xF1
	CueRelativePositionElement         ElementID = 0xF0
	CueDurationElement                 ElementID = 0xB2
	CueBlockNumberElement              ElementID = 0x5378
	CueCodecStateElement               ElementID = 0xEA
	CueReferenceElement                ElementID = 0xDB
	CueRefTimeElement                  ElementID = 0x96
	CueRefClusterElement               ElementID = 0x97
	CueRefNumberElement                ElementID = 0x535F
	CueRefCodecStateElement            ElementID = 0xEB
	AttachmentsElement                 ElementID = 0x1941A469
	AttachedFileElement                ElementID = 0x61A7
	FileDescriptionElement             ElementID = 0x467E
	FileNameElement                    ElementID = 0x466E
	FileMimeTypeElement                ElementID = 0x4660
	FileDataElement                    ElementID = 0x465C
	FileUIDElement                     ElementID = 0x46AE
	FileReferralElement                ElementID = 0x4675
	FileUsedStartTimeElement           ElementID = 0x4661
	FileUsedEndTimeElement             ElementID = 0x4662
	ChaptersElement                    ElementID = 0x1043A770
	EditionEntryElement                ElementID = 0x45B9
	EditionUIDElement                  ElementID = 0x45BC
	EditionFlagHiddenElement           ElementID = 0x45BD
	EditionFlagDefaultElement          ElementID = 0x45DB
	EditionFlagOrderedElement          ElementID = 0x45DD
	ChapterAtomElement                 ElementID = 0xB6
	ChapterUIDElement                  ElementID = 0x73C4
	ChapterStringUIDElement            ElementID = 0x5654
	ChapterTimeStartElement            ElementID = 0x91
	ChapterTimeEndElement              ElementID = 0x92
	ChapterFlagHiddenElement           ElementID = 0x98
	ChapterFlagEnabledElement          ElementID = 0x4598
	ChapterSegmentUIDElement           ElementID = 0x6E67
	ChapterSegmentEditionUIDElement    ElementID = 0x6EBC
	ChapterPhysicalEquivElement        ElementID = 0x63C3
	ChapterTrackElement                ElementID = 0x8F
	ChapterTrackNumberElement          ElementID = 0x89
	ChapterDisplayElement              ElementID = 0x80
	ChapStringElement                  ElementID = 0x85
	ChapLanguageElement                ElementID = 0x437C
	ChapLanguageIETFElement            ElementID = 0x437D
	ChapCountryElement                 ElementID = 0x437E
	ChapProcessElement                 ElementID = 0x6944
	ChapProcessCodecIDElement          ElementID = 0x6955
	ChapProcessPrivateElement          ElementID = 0x450D
	ChapProcessCommandElement          ElementID = 0x6911
	ChapProcessTimeElement             ElementID = 0x6922
	ChapProcessDataElement             ElementID = 0x6933
	TagsElement                        ElementID = 0x1254C367
	TagElement                         ElementID = 0x7373
	TargetsElement                     ElementID = 0x63C0
	TargetTypeValueElement             ElementID = 0x68CA
	TargetTypeElement                  ElementID = 0x63CA
	TagTrackUIDElement                 ElementID = 0x63C5
	TagEditionUIDElement               ElementID = 0x63C9
	TagChapterUIDElement               ElementID = 0x63C4
	TagAttachmentUIDElement            ElementID = 0x63C6
	SimpleTagElement                   ElementID = 0x67C8
	TagNameElement                     ElementID = 0x45A3
	TagLanguageElement                 ElementID = 0x447A
	TagLanguageIETFElement             ElementID = 0x447B
	TagDefaultElement                  ElementID = 0x4484
	TagStringElement                   ElementID = 0x4487
	TagBinaryElement                   ElementID = 0x4485
)

Supported ElementIDs

type ElementInfo

type ElementInfo struct {
	Offset int64
	Size   int64
	Level  int
}

ElementInfo contains information about an element encountered in the stream, and is passed to the handler by the parser on parse events.

type Handler

type Handler interface {
	// Return `true` to descend into the element, `false` to skip this element's children.
	HandleMasterBegin(ElementID, ElementInfo) (bool, error)
	HandleMasterEnd(ElementID, ElementInfo) error
	HandleString(ElementID, string, ElementInfo) error
	HandleInteger(ElementID, int64, ElementInfo) error
	HandleFloat(ElementID, float64, ElementInfo) error
	HandleDate(ElementID, time.Time, ElementInfo) error
	HandleBinary(ElementID, []byte, ElementInfo) error
}

Handler declares an interface for handling parse events

Directories

Path Synopsis
examples

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL