Skip to content

Instantly share code, notes, and snippets.

@songfei1983
Created November 5, 2020 09:32
Show Gist options
  • Save songfei1983/b6de751dee8b73226ffd886150e53fb9 to your computer and use it in GitHub Desktop.
Save songfei1983/b6de751dee8b73226ffd886150e53fb9 to your computer and use it in GitHub Desktop.
ffmpeg convert mp4 through go exec
package main
import (
"bytes"
"fmt"
"io"
"io/ioutil"
"log"
"os"
"os/exec"
)
func main() {
fi, _ := ioutil.ReadFile("test-4k.mp4")
runFFMPEGFromStdin(populateStdin(fi))
}
func populateStdin(file []byte) func(io.WriteCloser) {
return func(stdin io.WriteCloser) {
defer stdin.Close()
io.Copy(stdin, bytes.NewReader(file))
}
}
func logErr(err error) {
if err != nil {
log.Fatal(err)
}
}
func runFFMPEGFromStdin(populate_stdin_func func(io.WriteCloser)) {
cmd := exec.Command("ffmpeg", NewFFMpeg().args...)
fmt.Println(cmd)
// std err
stderr, err := cmd.StderrPipe()
logErr(err)
stdin, err := cmd.StdinPipe()
logErr(err)
stdout, err := cmd.StdoutPipe()
logErr(err)
err = cmd.Start()
logErr(err)
go populate_stdin_func(stdin)
fo, err := os.Create("output.mp4")
logErr(err)
defer fo.Close()
_, err = io.Copy(fo, stdout)
logErr(err)
errFo, err := os.Create("output.log")
logErr(err)
defer errFo.Close()
_, err = io.Copy(errFo, stderr)
logErr(err)
err = cmd.Wait()
logErr(err)
}
type FFMpeg struct {
cmd string
args []string
}
func NewFFMpeg() *FFMpeg {
return &FFMpeg{
cmd: "ffmpeg",
args: []string{
"-y",
"-hide_banner",
"-i",
"pipe:0",
"-c:v",
"libx264",
"-c:a",
"aac",
"-vf",
"scale=640x360",
"-t",
"30",
"-an",
"-movflags",
"frag_keyframe+empty_moov",
"-f",
"mp4",
"-",
// "out.mp4",
},
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment