Find FFmpeg from your PATH
cfg, _ := ffmpeg.DefaultConfiguration()
Or point to a specific installation of FFmpeg
cfg, _ := ffmpeg.NewConfiguration("/path/to/ffmpeg", "/path/to/ffprobe")
job := cfg.NewJob()
job.AddInputFile("video.mp4")
job.AddOutputFile("out.avi")
statusChan, _ := job.Start(context.Background())
for status := range statusChan {
switch v := status.(type) {
case *ffmpeg.Progress:
log.Printf("%#v", v)
case *ffmpeg.Done:
log.Printf("done")
return
case *ffmpeg.Error:
log.Fatalf(v.Error())
}
}
Whenever an input is added to a job, ffprobe is used to validate it and the result is returned.
metadata, _ := job.AddInputFile("video.mp4")
fmt.Printf("the video is %v seconds long", metadata.Format.Duration)
You can also probe an input first, and then add it to a job.
input, metadata, _ := cfg.Probe("video.mp4")
fmt.Printf("the video is %v seconds long", metadata.Format.Duration)
job.AddInput(input)
res, _ := http.Get("https://download.blender.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_surround-fix.avi")
job.AddInputReader(res.Body)
file, _ := os.Create("out.mp4")
job.AddOutputWriter(file)
Each of the following methods accept ffmpeg.CliOption
s from ffmpeg.Option()
and ffmpeg.Flag()
Configuration.NewJob()
Job.AddInput()
Job.AddInputFile()
Job.AddInputReader()
Job.AddOutputFile()
Job.AddOutputWriter()
Need to overwrite a file?
cfg.NewJob(ffmpeg.Flag("-y"))
Need to export using a specific codec and apply a filter?
job.AddInputFile(
"out.mp4",
ffmpeg.Option("-codec:v", "libx264"),
ffmpeg.Option("-filter:v", "scale=640:360"),
)
If there a problem with ffmpeg, you can read it's raw output like this:
job.StartDebug(context.Background(), os.Stderr)
A somewhat convoluted way to get a data stream back from ffmpeg is to setup a http server and output to it.
go http.ListenAndServe(":8080", func(w http.ResponseWriter, r *http.Request) {
// read output data from r.Body
})
job.AddOutputFile("https://localhost:8080")