package goffmpeg
|
|
/*
|
#cgo LDFLAGS: -ldl
|
#include <stdlib.h>
|
#include "libcffmpeg.h"
|
*/
|
import "C"
|
import (
|
"errors"
|
"fmt"
|
"unsafe"
|
)
|
|
var libcffmpeg C.libcffmpeg
|
|
// InitFFmpeg init ffmepg
|
func InitFFmpeg(soFileGo string) error {
|
soFile := C.CString(soFileGo)
|
defer C.free(unsafe.Pointer(soFile))
|
lib := C.init_libcffmpeg(soFile)
|
if lib == nil {
|
fmt.Println("open error: ", soFileGo)
|
return errors.New("init ffmpeg error")
|
}
|
libcffmpeg = lib
|
return nil
|
}
|
|
// FreeFFmpeg free ffmpeg
|
func FreeFFmpeg() {
|
if libcffmpeg != nil {
|
C.release_libcffmpeg(libcffmpeg)
|
}
|
}
|
|
// GoFFMPEG handle for c
|
type GoFFMPEG struct {
|
ffmpeg C.cffmpeg
|
}
|
|
// New 2nd new
|
func New(GB, CPU bool) *GoFFMPEG {
|
|
f := C.wrap_fn_create(unsafe.Pointer(libcffmpeg))
|
|
if f == nil {
|
return nil
|
}
|
if GB {
|
C.wrap_fn_run_gb28181(unsafe.Pointer(libcffmpeg), f)
|
}
|
if CPU {
|
C.wrap_fn_use_cpu(unsafe.Pointer(libcffmpeg), f)
|
}
|
|
return &GoFFMPEG{
|
ffmpeg: f,
|
}
|
}
|
|
// NewWithLog log
|
func NewWithLog(GB, CPU bool, ffmpegLog string) *GoFFMPEG {
|
lf := C.CString(ffmpegLog)
|
defer C.free(unsafe.Pointer(lf))
|
|
f := C.wrap_fn_create2(unsafe.Pointer(libcffmpeg), lf)
|
if f == nil {
|
return nil
|
}
|
if GB {
|
C.wrap_fn_run_gb28181(unsafe.Pointer(libcffmpeg), f)
|
}
|
if CPU {
|
C.wrap_fn_use_cpu(unsafe.Pointer(libcffmpeg), f)
|
}
|
|
return &GoFFMPEG{
|
ffmpeg: f,
|
}
|
}
|
|
// Free free handle
|
func (h *GoFFMPEG) Free() {
|
if h.ffmpeg != nil {
|
C.wrap_fn_destroy(unsafe.Pointer(libcffmpeg), h.ffmpeg)
|
}
|
}
|
|
// Run ffmpeg
|
func (h *GoFFMPEG) Run(input string) {
|
in := C.CString(input)
|
defer C.free(unsafe.Pointer(in))
|
|
C.wrap_fn_run(unsafe.Pointer(libcffmpeg), h.ffmpeg, in)
|
}
|