ffmepg滤镜

代码实现:
1.get_format() 这个是QSV硬件解码时的回调函数,在这里初始化hw_frames_ctx, get_format会在解码时被调用。因此对滤镜的初始化init_filter()应在得到第一帧数据后调用。
2.hw_frames_ctx,需要按照要求把他们传给对应的filter

3.然后把GPU里的frame传给av_buffersrc_add_frame_flags,然后buffersrc滤镜就去hw_frames_ctx里拿数据了。

./configure --list-filters
或者
ffmpeg -filters | grep qsv
查看所有支持的滤镜
查看单个滤镜支持的各种参数
ffmpeg -h filter=vpp_qsv
vpp_qsv还支持像素格式改变如下:

ffmpeg -init_hw_device qsv -c:v hevc_qsv -i "Tamako love story (2014).mkv" -c:v h264_qsv -b:v 5000000 -profile:v high -level 41 -an -sn -vsync -1 -start_at_zero -copyts -avoid_negative_ts 0 -filter_complex "[0:s]scale=1920x1080,hwupload=extra_hw_frames=64[sub];[0:v]hwupload=extra_hw_frames=64,vpp_qsv=w=1920:h=1080:format=nv12[base];[base][sub]overlay_qsv" -y output.mp4

tonemap_vaapi滤镜还支持色域bt709的转换

ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi \
-vaapi_device /dev/dri/renderD128 -i HDR.mp4 -c:v h264_vaapi \
-b:v 8000000 -level 41 -profile:v high -an -sn \
-vf 'scale_vaapi=w=1920:h=1080,tonemap_vaapi=t=bt709:format=nv12' \
-y /tmp/SDR.mp4

视频按顺时针方向旋转90度
ffplay -vf transpose=1 -i juren-30s.mp4
ffplay -f lavfi -i testsrc -vf transpose=1
在这里插入图片描述
-f lavfi -i testsrc这个滤镜是ffmpeg给用户的一个测试使用的视频

视频水平翻转(左右翻转)
-vf hflip
实现慢速播放,声音速度是原始速度的50%
ffplay p629100.mp3 -af atempo=0.5

qsv的滤镜
ffmpeg -init_hw_device qsv=hw -filter_hw_device hw -f rawvideo -pix_fmt yuv420p -s:v 1920x1080 -i input.yuv -vf hwupload=extra_hw_frames=64,format=qsv -c:v h264_qsv -b:v 5M output.mp4
ffmpeg -hwaccel qsv -c:v hevc_qsv -load_plugin hevc_hw -i input.mp4 -vf hwdownload,format=p010 -pix_fmt p010le output.yuv
注意上条命令并不是滤镜加速,hwdownload的意思是从GPU的内存中把数据取到cpu来处理。
ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4
-filter_complex “split=2[s1][s2]; [s1]scale_qsv=1280:720[o1];[s2]scale_qsv=960:540[o2]”
-map [o1] -c:v h264_qsv -b:v 3200k 3200a.mp4
-map [o2] -c:v h264_qsv -b:v 1750k 1750a.264

ffmpeg -hwaccel qsv -c:v hevc_qsv -i input.mp4 -vf ‘vpp_qsv=framerate=60,scale_qsv=w=1920:h=1080’ -c:v h264_qsv output.mp4
这里是qsv的vpp插件,它支持多种硬件滤镜,可以用一下命令查看:
ffmpeg -h filter=vpp_qsv
ffmpeg -hwaccel qsv -c:v hevc_qsv -i input.mp4 -vf ‘vpp_qsv=framerate=60,scale_qsv=w=1920:h=1080:format=rgb32,hwdownload,format=rgb32’ -f sdl -
可以看到在滤镜前没有hwdownload,说明是在解码后直接在GPU里做滤镜,做完滤镜之后才hwdownload到CPU(上面用sdl直接播出来,这里是nv12可以用这种方式来播放。)
ffmpeg -hwaccel qsv -c:v h264_qsv -i juren_nv12.mp4 -i zi_nv12.png -filter_complex “vpp_qsv=transpose=vflip” -c:v h264_qsv out.mp4

垂直翻转
ffmpeg -hwaccel qsv -c:v h264_qsv -i juren_nv12.mp4 -i zi_nv12.png -filter_complex “vpp_qsv=transpose=cclock” -c:v h264_qsv out.mp4
90度翻转,参数通过ffmpeg -h filter=vpp_qsv查看
ffmpeg -hwaccel qsv -c:v h264_qsv -i juren_nv12.mp4 -c:v -i h264_qsv juren_nv12_2.mp4 -filter_complex “[0:v][1:v]overlay_qsv[out]” -c:v h264_qsv output.mp4
ffmpeg -i juren_nv12_2_v.mp4 -i juren_640_nv12.mp4 -filter_complex overlay -c:v h264_qsv good_mark.mp4
ffmpeg -init_hw_device qsv -hwaccel qsv -hwaccel_output_format qsv -c:v h264_qsv -i juren-30s.mp4 -r 30 -i zi_nv12.png -filter_complex ‘[1:v]hwupload=extra_hw_frames=10[ov];[0:v][ov]overlay_qsv’ -c:v h264_qsv -y output.mp4 //OK
ffmpeg -init_hw_device qsv -hwaccel qsv -hwaccel_output_format qsv -c:v h264_qsv -i juren-30s.mp4 -r 30 -c:v h264_qsv -i juren_640_nv12_v.mp4 -filter_complex ‘[1:v]hwupload=extra_hw_frames=10[ov];[0:v][ov]overlay_qsv’ -c:v h264_qsv -y output.mp4 //OK
ffmpeg -hwaccel qsv -c:v h264_qsv -i juren-30s.mp4 -r 30 -c:v h264_qsv -i juren_640_nv12_v.mp4 -filter_complex ‘[1:v]hwupload=extra_hw_frames=10[ov];[0:v][ov]overlay_qsv’ -c:v h264_qsv -y output.mp4 //OK
以上命令参考
其中hwupload是把系统内存中的数据拷贝到GPU,不然会报如下错误:
[Parsed_overlay_qsv_0 @ 0x5598b9c04700] Mixing hardware and software pixel formats is not supported.
extra_hw_frames=10是设置内存池,不设置的话会报以下错误:
Intel QSV: “QSV requires a fixed frame pool size” message is given

ffmpeg -hwaccel qsv -c:v h264_qsv -i juren-30s.mp4 -filter_complex ‘movie=zi_nv12.png,hwupload=extra_hw_frames=10[ov];[0:v][ov]overlay_qsv’ -c:v h264_qsv -y outt.mp4 //OK
ffmpeg -hwaccel qsv -c:v h264_qsv -i juren-30s.mp4 -filter_complex ‘movie=juren_640_nv12_v.mp4,hwupload=extra_hw_frames=10[ov];[0:v][ov]overlay_qsv’ -c:v h264_qsv -y outt.mp4
注意用上面这种方式,movie带入的源将使用cpu解码。

overlay_qsv=x=30:y=30
https://trac.ffmpeg.org/wiki/Hardware/QuickSync
https://trac.ffmpeg.org/wiki/Hardware/VAAPI
https://ffmpeg-vip.xianwaizhiyin.net/api-ffmpeg/overlay.html
FFMPEG下利用Intel VPP_QSV插件实现基于GPU的图像缩放和色彩空间转换 (二) - C++代码实现

视频水印
1、右下角
ffmpeg -i in.mp4 -i logo.jpg -filter_complex ‘overlay=main_w-overlay_w-10:main_h-overlay_h-10’ out.mp4
1、 左下角
ffmpeg -i in.mp4 -i logo.jpg -filter_complex ‘overlay=x=10:y=main_h-overlay_h-10’ out.mp4

overlay=x=10:y=10 左上
overlay=x=main_w-overlay_w-10:y=10 右上
-filter_complex: 相比-vf, filter_complex适合开发复杂的滤镜功能,如同时对视频进行裁剪并旋转。参数之间使用逗号(,)隔开即可
main_w:视频宽度
overlay_w: 要添加的图片水印宽度
main_h : 视频高度
overlay_h:要添加的图片水印宽度

ffmpeg -i in.mp4 -vf "movie=logo.jpg[watermark];[in][watermark]
overlay=main_w-overlay_w-10:main_h-overlay_h-10[out] " output.mp4
logo.jpg: 要添加的水印图片地址
overlay:水印参数
main_w-overlay_w-10 : 水印在x轴的位置,也可以写成x=main_w-overlay_w-10
main_h-overlay_h-10:水印在y轴的位置

AVFilter主要是利用硬件的GPU实现Video Processor功能,其中包括vpp_qsv、overlay_qsv、hwupload_qsv,deinterlace_qsv,其中我们重点开发了overlay_qsv,vpp_qsv与hwupload_qsv。 如果在一个视频处理的pipeline中有多个VPP的实例运行,会对性能造成很大的影响。我们的方案是实现一个大的VPP Filter中集成所有功能并通过设置参数实现调用,避免了多个VPP的实例存在。但是为什么将vpp_qsv与overlay_qsv分开?这是因为无法在一个VPP实例中同时完成compositor和一些视频处理功能(像de-interlace等)。英特尔核芯显卡内显存中的存储格式为NV12, 和非硬件加速的模块联合工作时,需要对Frame Buffer进行从系统内存到显卡显存的复制过程,hwupload_qsv提供了在系统内存和显卡内存之间进行快速帧转换的功能。
————————————————
引用链接:https://blog.csdn.net/vn9PLgZvnPs1522s82g/article/details/82892209

滤镜的语法:
三个单元,滤镜filter,滤镜链filterchain,滤镜图;-vf -af后可以接滤镜图,-filter_complex后也可以
滤镜之间用",“隔开,构成滤镜链,滤镜链条之间用”;“隔开,如果有隔开符号则滤镜图应该用”“引起来符合linux终端规范,构成路径图
一个滤镜如下:
[input_link_lable1][input_link_lable2]… filter_name=parameters [output_link_lable1][output_link_lable12]…
滤镜名前和参数后是链接标签列表,一个标签是一个输入或输出端口。标签是可选的,不填就是默认值。如果一个滤镜没有输出端,那么它默认连接到此滤镜链中,后面的第一个没有输入端的滤镜。
在一个滤镜中,“:“用于分割key=vlue对,比如:
:”分隔的key=value列表
ffplay -i good.mp4 -vf scale=iw/2:ih/2
在一个key=vlue对中,”:“用于分割vule值,比如:
ffplay -i good_scale.mp4 -vf fade=in:0:30
淡入视频的前30帧,这个滤镜有三个参数,他们之间用”:"隔开

//默认log在视频的左上角,在(0,0)位置
ffmpeg -i good_scale.mp4 -i mark.png -filter_complex overlay good_mark.mp4
//在右下角,以右下角为(0,0),log在(-50,10)位置

在这里插入图片描述

ffmpeg -i good_scale.mp4 -i mark.png -filter_complex overlay=main_w-overlay_w-50:main_h-overlay_h-10 good_mark.mp4
其中main_w为视频的宽,overlay_w为log的宽

在这里插入图片描述
滤镜输入输出默认的方式:【引用文章】

ffmpeg -i A.avi -i C.mkv -i B.mp4 -filter_complex "overlay" out1.mp4 out2.srt

“-filter_complex” 选项指定了一个复杂 filtergraph,此 filtergraph 由单个视频滤镜 overlay 构成。overlay 滤镜需要两个视频输入,但此处并未为 overlay 滤镜指定输入,因此输入中的头两个有效视频流(A.avi 中的 stream 0 和 C.mkv 中的 stream0)会被作为 overlay 滤镜的输入。overlay 滤镜输出无标号,因此 overlay 滤镜的输出会被写入第一个输出文件 out1.mp4 中。输出时也可以用map指定,但注意一个流只能被指定到一个输出,不然出错,则命令不会输出任何文件。
如:

ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0,split=2[outv1][outv2];overlay;aresample" \
        -map '[outv1]' -an        out1.mp4 \
                                  out2.mkv \
        -map '[outv2]' -map 1:a:0 out3.mkv

hue滤镜用于调整视频的色调(hue)

ffplay -i good.mp4 -vf scale=640:360
ffplay -i good.mp4 -vf scale=iw/2:ih/2
一个滤镜图也可以只有一个滤镜链,一个滤镜链可以只包含一个滤镜,这种特例情况下,一个滤镜图只包含一个滤镜。
因此ffmpeg命令对滤镜的讨论为了方便不区分滤镜,滤镜链,滤镜图,而是只针对滤镜图(filtergraph)进行讨论。

针对简单的,也就是只有一个输入和输出的滤镜图,用-vf -af,官网如图,它的处理过程是线性的,执行完一个滤镜,再执行下一个滤镜。

在这里插入图片描述针对复杂的,多个输入和输出滤镜图,用-filter_complex等价于lavfi,不同的滤镜图之间是可以同时进行的。
在这里插入图片描述

https://ffmpeg.org/ffmpeg-filters.html
http://ffmpeg.org/ffmpeg.html#Filtering
https://zhuanlan.zhihu.com/p/595299940

ffmpeg是音视频必备,但即使从业数年,它似乎依然有无穷的秘密,感兴趣添加笔者微信:YQW1163720468,加入ffmpeg微信群讨论。但记得备注:ffmpeg爱好者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/79159.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

向量数据库 Milvus Cloud Partition Key:租户数量多,单个租户数据少的三种解决方案

三种解决方案 这个问题提出的时候,Milvus 的最新版本是 2.2.8,我们做个角色互换,在当时站在这个用户的角度,留在我们面前的选择有这么几个: 为每个租户创建一个 collection 为每个租户创建一个 partition 创建一个租户名称的标量字段 接下来,我们依次分析下这三种方案的可…

OPPO A57刷机资源(附简略教程)

https://www.123pan.com/s/hcAqVv-fpHWd.html提取码:buAp 图中画框的为必须下载的(xiaomiflash和twrp必须解压后使用) ​ 打开xiaomiflash点击driver点击install(就是框住的按钮)等待安装完成 ​用数据线将oppo a57与电脑连接&a…

【数学建模】逻辑回归算法(Logistic Resgression)

逻辑回归算法 简介逻辑回归与条件概率绘制sigmoid函数 简介 逻辑回归算法是一种简单但功能强大的二元线性分类算法。需要注意的是,尽管"逻辑回归"名字带有“回归”二字,但逻辑回归是一个分类算法,而不是回归算法。 我认为&#xff…

用easyui DataGrid编辑树形资料

easyui显示编辑树形资料有TreeGrid元件,但是这个元件的vue版本和react版本没有分页功能。virtual scroll功能也表现不佳。 我用DataGrid来处理。要解决的问题点: (1)如何显示成树形。即,子节点如何有缩进。 先计算好…

一、进入sql环境,以及sql的查询、新建、删除、使用

1、进入sql环境 》》》mysql -u root -p 》》》输入密码 2、sql语言的分类 3、注意事项: 4、基础操作: (1)查询所有数据库: show databases; 运行结果: (2)创建一个新的数据库&…

网络通信原理传输层TCP三次建立连接(第四十八课)

ACK :确认号 。 是期望收到对方的下一个报文段的数据的第1个字节的序号,即上次已成功接收到的数据字节序号加1。只有ACK标识为1,此字段有效。确认号X+1SEQ:序号字段。 TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的…

MongoDB 简介

什么是MongoDB ? MongoDB 是由C语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个…

从SaaS到RPA,没有真正“完美”的解决方案!

众所周知,SaaS行业越来越卷,利润也越来越“薄”,这是传统软件厂商的悲哀,也是未来数字化行业不得不面对的冷峻现状之一。 随着基于aPaaS、低代码的解决方案之流行,SaaS行业变得越来越没有技术门槛,IT人员的…

win10安装mysql和c++读取调用举例

一、下载mysql8.rar解压到C盘(也可以解压到其他位置) 在系统环境变量添加JAVA_HOMEC:\myslq8,并在path中添加%JAVA_HOME%\bin; 二、以管理员身份进入命令窗口 三、修改配置文件指定安装路径和数据库的存放路径 四、键入如下命令初始化并启动mysql服务,然后修改登录…

使用qsqlmysql操作mysql提示Driver not loaded

环境: win10 IDE: qt creator 编译器: mingw32 这里简单的记录下。我遇到的情况是在IDE使用debug和release程序都是运行正常,但是当我编译成发布版本之后。老是提示Driver not load。 这就很奇诡了。 回顾了下编译的时候是需要在使用qt先编译下libqsqlmysql.dll的…

Android中如何不编译源生模块

如果想让自己的app 替换系统的app 比如使用闪电浏览器替换系统的Browser 首先把闪电浏览器放到 vendor/rockchip/common/apps Android.mk LOCAL_PATH : $(call my-dir) include $(CLEAR_VARS)LOCAL_MODULE : Lightning LOCAL_SRC_FILES : $(LOCAL_MODULE).apk LOCAL_MODULE_C…

Eclipse使用插件时提示Plugin Error loading shared libraries

项目场景: 使用Eclipse的过程中,依赖openCONFIGURATOR插件进行新建项目时,弹出如下的错误: Plugin Error loading shared libraries 以及具体的信息为: Can’t find dependent libraries 这里我使用的插件为openCONFIGURATOR插件 问题描述 如上场景,提示缺少动态链接库…

实战篇之基于二进制思想的用户标签系统(Mysql+SpringBoot)

一: 计算机中的二进制 计算机以二进制表示数据,以表示电路中的正反。在二进制下,一个位只有 0 和 1 。逢二进一 位。类似十进制下,一个位只有 0~9 。逢十进一位。 二: 进制常用运算 (位运算)…

Django框架 靓号管理(增删改查)

Django框架 靓号管理(增删改查) 新建一个项目 backend 使用pycharm创建app startapp app项目目录 C:\code\backend ├── app | ├── admin.py | ├── apps.py | ├── migrations | ├── models.py | ├── tests.py | ├── views.…

【设计模式】抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在抽象工厂模式中,接口是负责创建一个相关对象…

Jenkins改造—nginx配置鉴权

先kill掉8082的端口进程 netstat -natp | grep 8082 kill 10256 1、下载nginx nginx安装 EPEL 仓库中有 Nginx 的安装包。如果你还没有安装过 EPEL,可以通过运行下面的命令来完成安装 sudo yum install epel-release 输入以下命令来安装 Nginx sudo yum inst…

神经网络基础-神经网络补充概念-14-逻辑回归中损失函数的解释

概念 逻辑回归损失函数是用来衡量逻辑回归模型预测与实际观测之间差异的函数。它的目标是找到一组模型参数,使得预测结果尽可能接近实际观测。 理解 在逻辑回归中,常用的损失函数是对数似然损失(Log-Likelihood Loss)&#xff…

1.物联网LWIP网络,TCP/IP协议簇

一。TCP/IP协议簇 1.应用层:FTP,HTTP,Telent,DNS,RIP 2.传输层:TCP,UDP 3.网络层:IPV4,IPV6,OSPF,EIGRP 4.数据链路层:Ethernet&#…

Syncfusion Essential Studio JavaScrip Crack

Syncfusion Essential Studio JavaScrip Crack 数据透视表 添加了在将数据透视表导出到PDF文档时自定义列宽的支持。 签名 添加了对在特定位置绘制文本的支持。 Syncfusion Essential Studio for JavaScript在一个包中包含80多个高性能、轻量级、模块化和响应式UI组件。包括Jav…

dockerfile的概念

目录 一、Dockerfile 概念 1.1 docker镜像的分层 二、Docker镜像的创建 2.1 基于已有的镜像创建 2.2 基于本地模板创建 2.3 基于dockerfile创建 2.3.1 dockerfile 结构(四部分) 三、Dockerfile操作指令 3.1 ENTRYPOINT指令 3.2 CMD 与entrypoint 3.3 小结 四、ADD和…
最新文章