commit d9593c8eb30d5ed75d86e872c9eb17947ae31da9 Author: Aleksandr Zelenin Date: Thu Jul 19 12:59:04 2018 +0300 init diff --git a/README.md b/README.md new file mode 100644 index 0000000..50bdf37 --- /dev/null +++ b/README.md @@ -0,0 +1,47 @@ +# go-mediainfo + +Go bindings for [MediaInfo](https://github.com/MediaArea/MediaInfoLib) + +## Dependencies + +### ubuntu 18.04 + +```bash +sudo apt-get install libmediainfo0v5 libmediainfo-dev +``` + +## Usage + +### Open file + +```go +file, err := mediainfo.Open("/file/path/filename.mp4") +if err != nil { + log.Fatal(err) +} +defer file.Close() +``` + +### Bitrate + +```go +videoBitrate := file.Parameter(mediainfo.StreamVideo, 0, "BitRate") +audioBitrateTrack1 := file.Parameter(mediainfo.StreamAudio, 0, "BitRate") +audioBitrateTrack2 := file.Parameter(mediainfo.StreamAudio, 1, "BitRate") +``` + +### Stream count + +```go +audioTracks := file.Parameter(mediainfo.StreamAudio, 0, "StreamCount") +``` + +### Available parameters + +```go +parameters := file.Option("info_parameters", "") +``` + +## Author + +[Aleksandr Zelenin](https://github.com/zelenin/), e-mail: [aleksandr@zelenin.me](mailto:aleksandr@zelenin.me) diff --git a/mediainfo.go b/mediainfo.go new file mode 100644 index 0000000..fb7fb24 --- /dev/null +++ b/mediainfo.go @@ -0,0 +1,103 @@ +package mediainfo + +// #include +// #cgo CFLAGS: -DUNICODE +// #cgo LDFLAGS: -ldl -lmediainfo +import "C" +import ( + "unsafe" + "errors" + "runtime" +) + +type StreamKind int + +const ( + StreamGeneral StreamKind = iota + StreamVideo + StreamAudio + StreamText + StreamOther + StreamImage + StreamMenu + streamMax +) + +type InfoKind int + +const ( + // Unique name of parameter + InfoName InfoKind = iota + // Value of parameter + InfoText + // Unique name of measure unit of parameter + InfoMeasure + // See infooptions_t + InfoOptions + // Translated name of parameter + InfoNameText + // Translated name of measure unit + InfoMeasureText + // More information about the parameter + InfoInfo + // Information : how data is found + InfoHowTo + infoMax +) + +func init() { + C.MediaInfoDLL_Load() +} + +type File struct { + handle unsafe.Pointer +} + +func (file *File) Close() { + C.CloseFile(file.handle) +} + +func (file *File) Inform() string { + return C.GoString(C.Inform(file.handle, 0)) +} + +func (file *File) Get(streamKind StreamKind, streamNumber int, parameter string, infoKind InfoKind) string { + cParameter := C.CString(parameter) + defer C.free(unsafe.Pointer(cParameter)) + + return C.GoString(C.Get(file.handle, C.MediaInfo_stream_C(streamKind), C.size_t(streamNumber), cParameter, C.MediaInfo_info_C(infoKind), C.MediaInfo_info_C(0))) +} + +func (file *File) Parameter(streamKind StreamKind, streamNumber int, parameter string) string { + return file.Get(streamKind, streamNumber, parameter, InfoText) +} + +func (file *File) Option(parameter string, value string) string { + cParameter := C.CString(parameter) + defer C.free(unsafe.Pointer(cParameter)) + + cValue := C.CString(value) + defer C.free(unsafe.Pointer(cValue)) + + return C.GoString(C.Option(file.handle, cParameter, cValue)) +} + +func Open(filePath string) (*File, error) { + cFilePath := C.CString(filePath) + defer C.free(unsafe.Pointer(cFilePath)) + + handle := C.OpenFile(C.CString(filePath)) + if handle == nil { + return nil, errors.New("Cannot open file.") + } + + file := &File{ + handle: handle, + } + + runtime.SetFinalizer(file, func(file *File) { + file.Close() + }) + + return file, nil +} diff --git a/mediainfo.h b/mediainfo.h new file mode 100644 index 0000000..3c1b24a --- /dev/null +++ b/mediainfo.h @@ -0,0 +1,58 @@ +#include +#include +#include +#include + +const wchar_t *toWchar(const char *c) +{ + const size_t cSize = strlen(c)+1; + wchar_t* wc = malloc(cSize * sizeof(wchar_t)); + mbstowcs(wc, c, cSize); + + return wc; +} + +const char *toChar(const wchar_t *c) +{ + const size_t cSize = wcslen(c)+1; + char* wc = malloc(cSize * sizeof(char)); + wcstombs(wc, c, cSize); + + return wc; +} + +void *OpenFile(char *filePath) +{ + void* handle = MediaInfo_New(); + if (!handle) { + return NULL; + } + + size_t res = MediaInfo_Open(handle, toWchar(filePath)); + if (!res) { + return NULL; + } + + return handle; +} + +void CloseFile(void *handle) +{ + MediaInfo_Close(handle); + MediaInfo_Delete(handle); +} + +const char* Get(void *handle, MediaInfo_stream_C streamKind, size_t StreamNumber, char* Parameter, MediaInfo_info_C KindOfInfo, MediaInfo_info_C KindOfSearch) +{ + return toChar(MediaInfo_Get(handle, streamKind, StreamNumber, toWchar(Parameter), KindOfInfo, KindOfSearch)); +} + +const char* Option(void *handle, char* Parameter, char* Value) +{ + return toChar(MediaInfo_Option(handle, toWchar(Parameter), toWchar(Value))); +} + +const char* Inform(void *handle, size_t Reserved) +{ + return toChar(MediaInfo_Inform(handle, Reserved)); +}