9 changed files with 264 additions and 23 deletions
@ -1,5 +1,5 @@ |
|||
package ffmpeg |
|||
|
|||
func Convert() { |
|||
func Convert(src, dst string) { |
|||
|
|||
} |
|||
|
@ -1 +1,124 @@ |
|||
package ffmpeg |
|||
|
|||
import ( |
|||
"encoding/json" |
|||
"os/exec" |
|||
"path/filepath" |
|||
) |
|||
|
|||
type Metadata struct { |
|||
Streams []struct { |
|||
Index int `json:"index"` |
|||
CodecName string `json:"codec_name"` |
|||
CodecLongName string `json:"codec_long_name"` |
|||
Profile string `json:"profile"` |
|||
CodecType string `json:"codec_type"` |
|||
CodecTagString string `json:"codec_tag_string"` |
|||
CodecTag string `json:"codec_tag"` |
|||
Width int `json:"width,omitempty"` |
|||
Height int `json:"height,omitempty"` |
|||
CodedWidth int `json:"coded_width,omitempty"` |
|||
CodedHeight int `json:"coded_height,omitempty"` |
|||
ClosedCaptions int `json:"closed_captions,omitempty"` |
|||
FilmGrain int `json:"film_grain,omitempty"` |
|||
HasBFrames int `json:"has_b_frames,omitempty"` |
|||
SampleAspectRatio string `json:"sample_aspect_ratio,omitempty"` |
|||
DisplayAspectRatio string `json:"display_aspect_ratio,omitempty"` |
|||
PixFmt string `json:"pix_fmt,omitempty"` |
|||
Level int `json:"level,omitempty"` |
|||
ColorRange string `json:"color_range,omitempty"` |
|||
ColorSpace string `json:"color_space,omitempty"` |
|||
ColorTransfer string `json:"color_transfer,omitempty"` |
|||
ColorPrimaries string `json:"color_primaries,omitempty"` |
|||
ChromaLocation string `json:"chroma_location,omitempty"` |
|||
FieldOrder string `json:"field_order,omitempty"` |
|||
Refs int `json:"refs,omitempty"` |
|||
IsAvc string `json:"is_avc,omitempty"` |
|||
NalLengthSize string `json:"nal_length_size,omitempty"` |
|||
Id string `json:"id"` |
|||
RFrameRate string `json:"r_frame_rate"` |
|||
AvgFrameRate string `json:"avg_frame_rate"` |
|||
TimeBase string `json:"time_base"` |
|||
StartPts int `json:"start_pts"` |
|||
StartTime string `json:"start_time"` |
|||
DurationTs int `json:"duration_ts"` |
|||
Duration string `json:"duration"` |
|||
BitRate string `json:"bit_rate"` |
|||
BitsPerRawSample string `json:"bits_per_raw_sample,omitempty"` |
|||
ExtradataSize int `json:"extradata_size"` |
|||
Disposition struct { |
|||
Default int `json:"default"` |
|||
Dub int `json:"dub"` |
|||
Original int `json:"original"` |
|||
Comment int `json:"comment"` |
|||
Lyrics int `json:"lyrics"` |
|||
Karaoke int `json:"karaoke"` |
|||
Forced int `json:"forced"` |
|||
HearingImpaired int `json:"hearing_impaired"` |
|||
VisualImpaired int `json:"visual_impaired"` |
|||
CleanEffects int `json:"clean_effects"` |
|||
AttachedPic int `json:"attached_pic"` |
|||
TimedThumbnails int `json:"timed_thumbnails"` |
|||
NonDiegetic int `json:"non_diegetic"` |
|||
Captions int `json:"captions"` |
|||
Descriptions int `json:"descriptions"` |
|||
Metadata int `json:"metadata"` |
|||
Dependent int `json:"dependent"` |
|||
StillImage int `json:"still_image"` |
|||
} `json:"disposition"` |
|||
Tags map[string]string `json:"tags"` |
|||
SampleFmt string `json:"sample_fmt,omitempty"` |
|||
SampleRate string `json:"sample_rate,omitempty"` |
|||
Channels int `json:"channels,omitempty"` |
|||
ChannelLayout string `json:"channel_layout,omitempty"` |
|||
BitsPerSample int `json:"bits_per_sample,omitempty"` |
|||
InitialPadding int `json:"initial_padding,omitempty"` |
|||
} `json:"streams"` |
|||
Format struct { |
|||
Filename string `json:"filename"` |
|||
NbStreams int `json:"nb_streams"` |
|||
NbPrograms int `json:"nb_programs"` |
|||
NbStreamGroups int `json:"nb_stream_groups"` |
|||
FormatName string `json:"format_name"` |
|||
FormatLongName string `json:"format_long_name"` |
|||
StartTime string `json:"start_time"` |
|||
Duration string `json:"duration"` |
|||
Size string `json:"size"` |
|||
BitRate string `json:"bit_rate"` |
|||
ProbeScore int `json:"probe_score"` |
|||
Tags map[string]string `json:"tags"` |
|||
} `json:"format"` |
|||
} |
|||
|
|||
func GetMetadata(src string) (*Metadata, error) { |
|||
err := checkFFMPEG() |
|||
if err != nil { |
|||
return nil, err |
|||
} |
|||
appPath := filepath.Join( |
|||
ffmpegPath, |
|||
`ffprobe`, |
|||
) |
|||
cmd := exec.Command( |
|||
appPath, |
|||
"-hide_banner", |
|||
"-show_format", |
|||
"-print_format", |
|||
"json", |
|||
"-show_streams", |
|||
src, |
|||
) |
|||
out, err := cmd.Output() |
|||
if err != nil { |
|||
return nil, err |
|||
} |
|||
var metadata Metadata |
|||
err = json.Unmarshal( |
|||
out, |
|||
&metadata, |
|||
) |
|||
if err != nil { |
|||
return nil, err |
|||
} |
|||
return &metadata, nil |
|||
} |
|||
|
@ -0,0 +1,80 @@ |
|||
package ffmpeg |
|||
|
|||
import "strconv" |
|||
|
|||
type Option interface { |
|||
Option() string |
|||
} |
|||
|
|||
type VideoEncoder string |
|||
|
|||
func (v VideoEncoder) Option() string { |
|||
return string(v) |
|||
} |
|||
|
|||
type H264CRF int |
|||
|
|||
func (c H264CRF) Option() string { |
|||
intC := int(c) |
|||
if intC < 0 || intC > 51 { |
|||
panic("H264CRF must be between 0 and 51") |
|||
} |
|||
return strconv.Itoa(intC) |
|||
} |
|||
|
|||
type H264Preset string |
|||
|
|||
func (p H264Preset) Option() string { |
|||
return string(p) |
|||
} |
|||
|
|||
const ( |
|||
H264PresetUltrafast H264Preset = `ultrafast` |
|||
H264PresetSuperfast H264Preset = `superfast` |
|||
H264PresetVeryfast H264Preset = `veryfast` |
|||
H264PresetFaster H264Preset = `faster` |
|||
H264PresetFast H264Preset = `fast` |
|||
H264PresetMedium H264Preset = `medium` |
|||
H264PresetSlow H264Preset = `slow` |
|||
H264PresetSlower H264Preset = `slower` |
|||
H264PresetVeryslow H264Preset = `veryslow` |
|||
H264PresetPlacebo H264Preset = `placebo` |
|||
) |
|||
|
|||
type H264Tune string |
|||
|
|||
func (t H264Tune) Option() string { |
|||
return string(t) |
|||
} |
|||
|
|||
const ( |
|||
H264TuneFilm H264Tune = `film` |
|||
H264TuneAnimation H264Tune = `animation` |
|||
H264TuneGrain H264Tune = `grain` |
|||
H264TuneStillimage H264Tune = `stillimage` |
|||
H264TunePsnr H264Tune = `psnr` |
|||
H264TuneSsim H264Tune = `ssim` |
|||
H264TuneFastdecode H264Tune = `fastdecode` |
|||
H264TuneZerolatency H264Tune = `zerolatency` |
|||
) |
|||
|
|||
type H264Profile string |
|||
|
|||
func (p H264Profile) Option() string { |
|||
return string(p) |
|||
} |
|||
|
|||
const ( |
|||
H264ProfileBaseline H264Profile = `baseline` |
|||
H264ProfileMain H264Profile = `main` |
|||
H264ProfileHigh H264Profile = `high` |
|||
H264ProfileHigh10 H264Profile = `high10` |
|||
H264ProfileHigh422 H264Profile = `high422` |
|||
H264ProfileHigh444 H264Profile = `high444` |
|||
) |
|||
|
|||
type CustomOption string |
|||
|
|||
func (o CustomOption) Option() string { |
|||
return string(o) |
|||
} |
@ -1,6 +1,8 @@ |
|||
package vips |
|||
|
|||
import "strconv" |
|||
import ( |
|||
"strconv" |
|||
) |
|||
|
|||
const ( |
|||
KernelNearest Kernel = `nearest` |
Loading…
Reference in new issue