专栏首页01ZOOffmpeg 命令的 golang binding 工具
原创

ffmpeg 命令的 golang binding 工具

项目地址:

https://github.com/u2takey/ffmpeg-go

使用例子

import (
	ffmpeg "github.com/u2takey/ffmpeg-go"
)

split := ffmpeg.Input(TestInputFile1).VFlip().Split()
	split0, split1 := split.Get("0"), split.Get("1")
	overlayFile := Input(TestOverlayFile).Crop(10, 10, 158, 112)
err := ffmpeg.Concat([]*Stream{
    split0.Trim(KwArgs{"start_frame": 10, "end_frame": 20}),
    split1.Trim(KwArgs{"start_frame": 30, "end_frame": 40})}).
        Overlay(overlayFile.HFlip(), "").
        DrawBox(50, 50, 120, 120, "red", 5).
        Output(TestOutputFile1).
        OverWriteOutput().Run()

抽帧

func ExampleReadFrameAsJpeg(inFileName string, frameNum int) io.Reader {
	buf := bytes.NewBuffer(nil)
	err := ffmpeg.Input(inFileName).
		Filter("select", ffmpeg.Args{fmt.Sprintf("gte(n,%d)", frameNum)}).
		Output("pipe:", ffmpeg.KwArgs{"vframes": 1, "format": "image2", "vcodec": "mjpeg"}).
		WithOutput(buf, os.Stdout).
		Run()
	if err != nil {
		panic(err)
	}
	return buf
}

reader := ExampleReadFrameAsJpeg("./sample_data/in1.mp4", 5)
img, err := imaging.Decode(reader)
if err != nil {
    t.Fatal(err)
}
err = imaging.Save(img, "./sample_data/out1.jpeg")
if err != nil {
    t.Fatal(err)
}

结果 :

显示处理进度

see complete example at: showProgress

func ExampleShowProgress(inFileName, outFileName string) {
	a, err := ffmpeg.Probe(inFileName)
	if err != nil {
		panic(err)
	}
	totalDuration := gjson.Get(a, "format.duration").Float()

	err = ffmpeg.Input(inFileName).
		Output(outFileName, ffmpeg.KwArgs{"c:v": "libx264", "preset": "veryslow"}).
		GlobalArgs("-progress", "unix://"+TempSock(totalDuration)).
		OverWriteOutput().
		Run()
	if err != nil {
		panic(err)
	}
}
ExampleShowProgress("./sample_data/in1.mp4", "./sample_data/out2.mp4")

结果

progress:  .0
progress:  0.72
progress:  1.00
progress:  done

和 Open-cv (gocv) 一起使用做视频人脸识别

see complete example at: opencv

结果:

支持生成 flowchart

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • k8s on eks

    虚拟 kubernetes 是一种多租户 kubernetes 的运行方式,有兴趣的可以阅读这篇文章

    王磊-AI基础
  • 一些kubernetes的开发/实现/使用技巧-2

    JobController的实现逻辑比较简单,用它来示例 Controller的实现方式

    王磊-AI基础
  • 扩展 Kubernetes 之 CRI

    使用 cri-containerd 的调用流程更为简洁, 省去了上面的调用流程的 1,2 两步

    王磊-AI基础
  • sublime text _注册码

    打开 Sublime Text 3 的 “Help”–“Enter Licence”,然后根据版本选择输入下面的注册码。

    shirayner
  • DataGridView控件用法一:数据绑定

    用DataGridView控件,可以显示和编辑来自多种不同类型的数据源的表格数据。

    zls365
  • 初识PAM4

    今天主要介绍下PAM4,笔者对此也是刚刚接触,如果有理解错误的地方,还请大家指出。

    光学小豆芽
  • jQuery AJAX load()方法中代码执行顺序的问题

    问题来源于菜鸟教程介绍 jQuery load() 方法时用的一个实例: JS:

    Chor
  • 深入Mybatis源码——配置解析

    上一篇分析了Mybatis的基础组件,Mybatis的运行调用就是建立在这些基础组件之上的,那它的执行原理又是怎样的呢?在往下之前不妨先思考下如果是你会怎么实现...

    夜勿语
  • Java工程师学习指南第7部分:重新学习MySQL与Redis

    本文整理了微信公众号【Java技术江湖】发表和转载过的Mysql和Redis相关优质文章,想看到更多Java技术文章,就赶紧关注本公众号吧吧。

    Java技术江湖
  • 第82天:jQuery中prop()和attr()的区别

     这个例子里<a>元素的DOM属性有“href、target和class",这些属性就是<a>元素本身就带有的属性,也是W3C标准里就包含有这几个属性,或者说在...

    半指温柔乐

扫码关注云+社区

领取腾讯云代金券