This commit is contained in:
Aleksandr Zelenin
2018-07-19 12:59:04 +03:00
commit d9593c8eb3
3 changed files with 208 additions and 0 deletions

47
README.md Normal file
View File

@@ -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)

103
mediainfo.go Normal file
View File

@@ -0,0 +1,103 @@
package mediainfo
// #include <mediainfo.h>
// #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
}

58
mediainfo.h Normal file
View File

@@ -0,0 +1,58 @@
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
#include <MediaInfoDLL/MediaInfoDLL.h>
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));
}