Documentation ¶
Index ¶
- Constants
- func CalculateSkew(startTimeClock1 CMTime, endTimeClock1 CMTime, startTimeClock2 CMTime, ...) float64
- func GetNaluDetails(nalu []byte) string
- func GetWavHeaderBytes(length int) ([]byte, error)
- func SerializeStringKeyDict(stringKeyDict StringKeyDict) []byte
- func Table() []string
- func WriteWavHeader(length int, wavFile *os.File) error
- type AVFileWriter
- type AudioStreamBasicDescription
- type CMClock
- type CMItemCount
- type CMSampleBuffer
- type CMSampleTimingInfo
- type CMTime
- type FormatDescriptor
- type IndexKeyDict
- type IndexKeyEntry
- type StringKeyDict
- type StringKeyEntry
Constants ¶
const ( FormatDescriptorMagic uint32 = 0x66647363 //fdsc - csdf MediaTypeVideo uint32 = 0x76696465 //vide - ediv MediaTypeSound uint32 = 0x736F756E //nuos - soun MediaTypeMagic uint32 = 0x6D646961 //mdia - aidm VideoDimensionMagic uint32 = 0x7664696D //vdim - midv CodecMagic uint32 = 0x636F6463 //codc - cdoc CodecAvc1 uint32 = 0x61766331 //avc1 - 1cva ExtensionMagic uint32 = 0x6578746E //extn - ntxe AudioStreamBasicDescriptionMagic uint32 = 0x61736264 //asdb - dbsa )
Those are the markers found in the hex dumps. For convenience I have added the ASCII representation as a comment in normal byte order and reverse byteorder (so you can find them in the hex dumps) Note: I have just guessed what the names could be from the marker ascii, I could be wrong ;-)
const ( KCMTimeFlagsValid uint32 = 0x0 KCMTimeFlagsHasBeenRounded uint32 = 0x1 KCMTimeFlagsPositiveInfinity uint32 = 0x2 KCMTimeFlagsNegativeInfinity uint32 = 0x4 KCMTimeFlagsIndefinite uint32 = 0x8 KCMTimeFlagsImpliedValueFlagsMask = KCMTimeFlagsPositiveInfinity | KCMTimeFlagsNegativeInfinity | KCMTimeFlagsIndefinite CMTimeLengthInBytes int = 24 )
Constants for the CMTime struct
const ( KeyValuePairMagic uint32 = 0x6B657976 //keyv - vyek StringKey uint32 = 0x7374726B //strk - krts IntKey uint32 = 0x6964786B //idxk - kxdi BooleanValueMagic uint32 = 0x62756C76 //bulv - vlub DictionaryMagic uint32 = 0x64696374 //dict - tcid DataValueMagic uint32 = 0x64617476 //datv - vtad StringValueMagic uint32 = 0x73747276 //strv - vrts )
Dictionary related magic marker constants
const AudioFormatIDLpcm uint32 = 0x6C70636D
AudioFormatIDLpcm is the CoreMedia MediaID for LPCM
const NanoSecondScale = 1000000000
NanoSecondScale is the default system clock scale where 1/NanoSecondScale == 1 Nanosecond.
Variables ¶
This section is empty.
Functions ¶
func CalculateSkew ¶
func CalculateSkew(startTimeClock1 CMTime, endTimeClock1 CMTime, startTimeClock2 CMTime, endTimeClock2 CMTime) float64
CalculateSkew calculates the deviation between the frequencies of two given clocks by using time diffs and returns a skew value float64 scaled to match the second clock.
func GetNaluDetails ¶
GetNaluDetails creates a string containing length and type of a h264-nalu.
func GetWavHeaderBytes ¶
GetWavHeaderBytes creates a byte slice containing a valid wav header using the supplied length.
func SerializeStringKeyDict ¶
func SerializeStringKeyDict(stringKeyDict StringKeyDict) []byte
SerializeStringKeyDict serializes a StringKeyDict into a []byte
Types ¶
type AVFileWriter ¶
type AVFileWriter struct {
// contains filtered or unexported fields
}
AVFileWriter writes nalus into a file using 0x00000001 as a separator (h264 ANNEX B) and raw pcm audio into a wav file Note that you will have to call WriteWavHeader() on the audiofile when you are done to write a wav header and get a valid file.
func NewAVFileWriter ¶
func NewAVFileWriter(h264FileWriter io.Writer, wavFileWriter io.Writer) AVFileWriter
NewAVFileWriter binary writes nalus in annex b format to the given writer and audio buffers into a wav file. Note that you will have to call WriteWavHeader() on the audiofile when you are done to write a wav header and get a valid file.
func NewAVFileWriterAudioOnly ¶
func NewAVFileWriterAudioOnly(wavFileWriter io.Writer) AVFileWriter
func (AVFileWriter) Consume ¶
func (avfw AVFileWriter) Consume(buf CMSampleBuffer) error
Consume writes PPS and SPS as well as sample bufs into a annex b .h264 file and audio samples into a wav file Note that you will have to call WriteWavHeader() on the audiofile when you are done to write a wav header and get a valid file.
type AudioStreamBasicDescription ¶
type AudioStreamBasicDescription struct { SampleRate float64 FormatID uint32 FormatFlags uint32 BytesPerPacket uint32 FramesPerPacket uint32 BytesPerFrame uint32 ChannelsPerFrame uint32 BitsPerChannel uint32 Reserved uint32 }
AudioStreamBasicDescription represents the struct found here: https://github.com/nu774/MSResampler/blob/master/CoreAudio/CoreAudioTypes.h
func DefaultAudioStreamBasicDescription ¶
func DefaultAudioStreamBasicDescription() AudioStreamBasicDescription
DefaultAudioStreamBasicDescription creates a LPCM AudioStreamBasicDescription with default values I grabbed from the hex dump
func NewAudioStreamBasicDescriptionFromBytes ¶
func NewAudioStreamBasicDescriptionFromBytes(data []byte) (AudioStreamBasicDescription, error)
NewAudioStreamBasicDescriptionFromBytes reads AudioStreamBasicDescription from bytes
func (AudioStreamBasicDescription) SerializeAudioStreamBasicDescription ¶
func (adsb AudioStreamBasicDescription) SerializeAudioStreamBasicDescription(adsbBytes []byte)
SerializeAudioStreamBasicDescription puts an AudioStreamBasicDescription into the given byte array
func (AudioStreamBasicDescription) String ¶
func (adsb AudioStreamBasicDescription) String() string
type CMClock ¶
CMClock represents a monotonic Clock that will start counting when created
func NewCMClockWithHostTime ¶
NewCMClockWithHostTime creates a new Clock with the given ID with a nanosecond scale. Calls to GetTime will measure the time difference since the clock was created.
func NewCMClockWithHostTimeAndScale ¶
NewCMClockWithHostTimeAndScale creates a new CMClock with given ID and a custom timeScale
type CMItemCount ¶
type CMItemCount = int
CMItemCount is a simple typedef to int to be a bit closer to MacOS/iOS
type CMSampleBuffer ¶
type CMSampleBuffer struct { OutputPresentationTimestamp CMTime FormatDescription FormatDescriptor HasFormatDescription bool NumSamples CMItemCount //nsmp SampleTimingInfoArray []CMSampleTimingInfo //stia SampleData []byte SampleSizes []int Attachments IndexKeyDict //satt Sary IndexKeyDict //sary MediaType uint32 }
CMSampleBuffer represents the CoreMedia class used to exchange AV SampleData and contains meta information like timestamps or optional FormatDescriptors
func NewCMSampleBufferFromBytes ¶
func NewCMSampleBufferFromBytes(data []byte, mediaType uint32) (CMSampleBuffer, error)
NewCMSampleBufferFromBytes parses a CMSampleBuffer from a []byte assuming it begins with a 4 byte length and the 4byte magic int "sbuf"
func NewCMSampleBufferFromBytesAudio ¶
func NewCMSampleBufferFromBytesAudio(data []byte) (CMSampleBuffer, error)
NewCMSampleBufferFromBytesAudio parses a CMSampleBuffer containing audio data.
func NewCMSampleBufferFromBytesVideo ¶
func NewCMSampleBufferFromBytesVideo(data []byte) (CMSampleBuffer, error)
NewCMSampleBufferFromBytesVideo parses a CMSampleBuffer containing audio video.
func (CMSampleBuffer) HasSampleData ¶
func (buffer CMSampleBuffer) HasSampleData() bool
func (CMSampleBuffer) String ¶
func (buffer CMSampleBuffer) String() string
type CMSampleTimingInfo ¶
type CMSampleTimingInfo struct { Duration CMTime /*! @field duration The duration of the sample. If a single struct applies to each of the samples, they all will have this duration. */ PresentationTimeStamp CMTime /*! @field presentationTimeStamp The time at which the sample will be presented. If a single struct applies to each of the samples, this is the presentationTime of the first sample. The presentationTime of subsequent samples will be derived by repeatedly adding the sample duration. */ DecodeTimeStamp CMTime /*! @field decodeTimeStamp The time at which the sample will be decoded. If the samples are in presentation order, this must be set to kCMTimeInvalid. */ }
CMSampleTimingInfo is a simple struct containing 3 CMtimes: Duration, PresentationTimeStamp and DecodeTimeStamp
func (CMSampleTimingInfo) String ¶
func (info CMSampleTimingInfo) String() string
type CMTime ¶
type CMTime struct { CMTimeValue uint64 /*! @field value The value of the CMTime. value/timescale = seconds. */ CMTimeScale uint32 /*! @field timescale The timescale of the CMTime. value/timescale = seconds. */ CMTimeFlags uint32 /*! @field flags The flags, eg. kCMTimeFlags_Valid, kCMTimeFlags_PositiveInfinity, etc. */ CMTimeEpoch uint64 /*! @field epoch Differentiates between equal timestamps that are actually different because of looping, multi-item sequencing, etc. Will be used during comparison: greater epochs happen after lesser ones. Additions/subtraction is only possible within a single epoch, however, since epoch length may be unknown/variable. */ }
CMTime is taken from https://github.com/phracker/MacOSX-SDKs/blob/master/MacOSX10.8.sdk/System/Library/Frameworks/CoreMedia.framework/Versions/A/Headers/CMTime.h
func NewCMTimeFromBytes ¶
NewCMTimeFromBytes reads a CMTime struct directly from the given byte slice
func (CMTime) GetTimeForScale ¶
GetTimeForScale calculates a float64 TimeValue by rescaling this CMTime to the CMTimeScale of the given CMTime
type FormatDescriptor ¶
type FormatDescriptor struct { MediaType uint32 VideoDimensionWidth uint32 VideoDimensionHeight uint32 Codec uint32 Extensions IndexKeyDict //PPS contains bytes of the Picture Parameter Set h264 NALu PPS []byte //SPS contains bytes of the Picture Parameter Set h264 NALu SPS []byte AudioStreamBasicDescription AudioStreamBasicDescription }
FormatDescriptor is actually a CMFormatDescription https://developer.apple.com/documentation/coremedia/cmformatdescription https://github.com/phracker/MacOSX-SDKs/blob/master/MacOSX10.9.sdk/System/Library/Frameworks/CoreMedia.framework/Versions/A/Headers/CMFormatDescription.h
func NewFormatDescriptorFromBytes ¶
func NewFormatDescriptorFromBytes(data []byte) (FormatDescriptor, error)
NewFormatDescriptorFromBytes parses a CMFormatDescription from bytes
func (FormatDescriptor) String ¶
func (fdsc FormatDescriptor) String() string
type IndexKeyDict ¶
type IndexKeyDict struct {
Entries []IndexKeyEntry
}
IndexKeyDict a dictionary that uses uint16 as keys with an array of IndexKeyEntry
func NewIndexDictFromBytes ¶
func NewIndexDictFromBytes(data []byte) (IndexKeyDict, error)
NewIndexDictFromBytes creates a new dictionary assuming the byte array starts with the 4 byte length of the dictionary followed by "dict" as the magic marker
func NewIndexDictFromBytesWithCustomMarker ¶
func NewIndexDictFromBytesWithCustomMarker(data []byte, magic uint32) (IndexKeyDict, error)
NewIndexDictFromBytesWithCustomMarker creates a new dictionary assuming the byte array starts with the 4 byte length of the dictionary followed by magic as the magic marker
func (IndexKeyDict) String ¶
func (dt IndexKeyDict) String() string
type IndexKeyEntry ¶
type IndexKeyEntry struct { Key uint16 Value interface{} }
IndexKeyEntry is a pair of a uint16 key and an arbitrary value.
type StringKeyDict ¶
type StringKeyDict struct {
Entries []StringKeyEntry
}
StringKeyDict a dictionary that uses strings as keys with an array of StringKeyEntry
func NewStringDictFromBytes ¶
func NewStringDictFromBytes(data []byte) (StringKeyDict, error)
NewStringDictFromBytes creates a new dictionary assuming the byte array starts with the 4 byte length of the dictionary followed by "dict" as the magic marker
func (StringKeyDict) String ¶
func (dt StringKeyDict) String() string
type StringKeyEntry ¶
type StringKeyEntry struct { Key string Value interface{} }
StringKeyEntry a pair of a string key and an arbitrary value
func ParseKeyValueEntry ¶
func ParseKeyValueEntry(data []byte) (StringKeyEntry, error)
ParseKeyValueEntry parses a byte array into a StringKeyEntry assuming the array starts with a 4 byte length followed by the "keyv" magic