本篇尝试通过API实现Filter Graph功能. 源码请参看 https://andy-zhangtao.github.io/ffmpeg-examples/ FFmpeg提供了很多实用且强大的滤镜,比如:overlay, scale, trim, setpts等等. 通过-filter-complex的表达式功能,可以将多个滤镜组装成一个调用图,实现更为复杂的视频剪辑.如何通过代码实现这个功能呢? 首先按照前面几篇的套路,在开发FFmpeg应用时,大致有三板斧: 初始化输入设备(初始化解码…
调用FFMPEG Device API完成Mac录屏功能. 调用FFMPEG提供的API来完成录屏功能,大致的思路是: 打开输入设备. 打开输出设备. 从输入设备读取视频流,然后经过解码->编码,写入到输出设备. +--------------------------------------------------------------+ | +---------+ decode +------------+ | | | Input | ----------read -------->| O…
虽然通过声明[x][y]avfilter=a=x:b=y;avfilter=xxx的方式可以创建一个可用的Filter调用链,并且在绝大多数场合下这种方式都是靠谱和实用的. 但如果想精细化的管理AVFilter调用链,例如根据某些条件来动态生成AVFilter Graph.这种声明方式就不太灵活(也可以通过if判断来动态组装字符串,如果你非常喜欢这种字符串声明方式,到此为止不在建议你往下阅读了). 首先快速温习一下,如何创建一个AVFilter Graph. +-------+ +-------…
前面几篇文章聊了聊FFmpeg的基础知识,我也是接触FFmpeg不久,除了时间处理之外,很多高深(滤镜)操作都没接触到.在学习时间处理的时候,都是通过在ffmpeg目前提供的avfilter基础上面修修补补(补充各种debug log)来验证想法. 而这次我将尝试新创建一个avfilter,来实现一个新滤镜. 完整的代码可参考 https://andy-zhangtao.github.io/ffmpeg-examples/ 因为我是新手,所以本着先易后难的原则(其实是不会其它高深API的操作),…
Screen Record H.264 目前在网络传输视频/音频流都一般会采用H.264进行编码,所以尝试调用FFMPEG API完成Mac录屏功能,同时编码为H.264格式. 在上一篇文章中,通过调用FFmpeg API完成了Mac平台下的录屏功能.在本篇中,对上次的录屏进行优化,将采集到的视频流编码为H.264格式,同时设定FPS和分辨率. 因为是对上次录屏功能的优化,因此处理思路仍然分为三部分: 打开输入设备(默认的屏幕设备) 初始化输出设备(mp4文件) 内容转码 和上次使用的API对比…
通过修改setpts代码实现调整视频部分的播放速率. 完整代码可参考: https://andy-zhangtao.github.io/ffmpeg-examples/ 在前面提到了PTS/DTS/Timestamp的关系,播放器在渲染视频时就是根据PTS来确定渲染和展示时间点的. 根据这个原理,我们就可以通过调整帧的PTS时间来实现视频加速/降速播放. 加速/降速的原理 我们都知道,当帧速率(frame rate)大于24时,也就是1秒播放24帧时,我们的视觉就会看到流程的视频. 在帧总量不变…
本次尝试在视频A中的任意位置插入视频B. 在上一篇中,我们通过调整PTS可以实现视频的加减速.这只是对同一个视频的调转,本次我们尝试对多个视频进行合并处理. Concat如何运行 ffmpeg提供了一个concat滤镜来合并多个视频,例如:要合并视频Video A和Video B,通过调用 ffmpeg -i va.mp4 -i vb.mp4 -filter_complex "[0][1]concat[out]" -map '[out]' -y output.mp4 concat支持多…
在写了几个avfilter之后,原本以为对ffmpeg应该算是入门了. 结果今天想对一个视频文件进行转码操作,才发现基本的视频读取,输出都搞不定. 痛定思痛,仔细研究了一下ffmpeg提供的example,总结归纳读取处理视频文件的简要思路. 在读取,处理视频文件时,以下四个结构体是非常重要的,所以放在片首提一下. AVFormatContext 媒体源的抽象描述,可以理解成视频/音频文件信息描述 AVInputFormat / AVOutputFormat 容器的抽象描述 AVCodecCon…
通过简单的计算来,线上I帧在视频中出现的时间点. 完整代码请参考 https://andy-zhangtao.github.io/ffmpeg-examples/ 名词解释 首先需要明确以下名词概念: I/P/B 帧(具体差异请参看 https://www.jianshu.com/p/18af03556431 ) I帧: 内部编码帧(关键帧) P帧: 前向预测帧(根据I帧计算差值) B帧: 双向预测帧(根据I帧和P帧计算差值) PTS: 帧显示的时间刻度(在哪个时间点显示此帧) DTS: 帧解码…
Kubernetes API的使用方式 Kubernetes API属于声明式API编程, 它和常用的命令式编程有一些区别. 通俗的说,命令式编程是第一人称,我要做什么,我要怎么做. 操作系统最喜欢这种编程范式了, 操作系统几乎不用"思考", 只要一对一的将代码翻译成指令就可以了. 而声明式编程则类似于"第二人称", 也就是你要做什么. 有点"产品经理"和"开发"之间的关系, "产品经理"只负责提需求,而&…