ffmepg滤镜

2023-11-11 19:50
文章标签 ffmepg 滤镜

本文主要是介绍ffmepg滤镜,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ffmpeg -hwaccel qsv -video_size 1920x1080 -pixel_format mjpeg -framerate 60 -c:v mjpeg_qsv -i /dev/video4 -vf “hwdownload,format=nv12” -pix_fmt yuv420p -f sdl -

代码实现:
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里拿数据了。

av_hwframe_ctx_create_derived()可以用于为创建hwframe上下文

Allocate an AVHWFramesContext tied to a given device context.
AVBufferRef *av_hwframe_ctx_alloc(AVBufferRef *device_ctx);
AVBufferRef *hwframe_ctx = av_hwframe_ctx_alloc(codec_ctx->hw_device_ctx);

if (av_hwframe_ctx_init(hwframe_ctx) < 0) {
printf(“无法初始化硬件帧上下文\n”);
return -1;
}
// 创建硬件帧上下文
AVBufferRef *hwframe_ctx = av_hwframe_ctx_alloc(codec_ctx->hw_device_ctx);
if (!hwframe_ctx) {
printf(“无法创建硬件帧上下文\n”);
return -1;
}

// 设置硬件帧上下文参数
AVHWFramesContext *frames_ctx = (AVHWFramesContext *)hwframe_ctx->data;
frames_ctx->format = AV_PIX_FMT_VAAPI;
frames_ctx->sw_format = AV_PIX_FMT_NV12;
frames_ctx->width = codec_ctx->width;
frames_ctx->height = codec_ctx->height;

// 初始化硬件帧上下文
if (av_hwframe_ctx_init(hwframe_ctx) < 0) {printf("无法初始化硬件帧上下文\n");return -1;
}

./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,不同的滤镜图之间是可以同时进行的。
在这里插入图片描述

ffmpeg -h filter=overlay查看支持的像素格式,默认是yuv420:
yuv420 0 …FV…
yuv420p10 1 …FV…
yuv422 2 …FV…
yuv422p10 3 …FV…
yuv444 4 …FV…
rgb 5 …FV…
gbrp 6 …FV…
auto

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

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

这篇关于ffmepg滤镜的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/392451

相关文章

快速搞定“照片调色”!50000+Lr预设滤镜模板,一键让你照片不再丑!

照片调色不仅仅是调整颜色,更是一种艺术表达。通过巧妙地运用 LR 预设,可以突出照片的主题,增强情感共鸣。比如,在风景照片中,使用特定的预设可以让天空更蓝、草地更绿,让大自然的美丽更加生动地展现出来。 在人像摄影中,合适的 LR 预设可以让肤色更加自然、眼神更加明亮,让人物更加迷人。而且,LR 预设还可以根据不同的风格和场景进行定制,满足各种个性化的需求。如果你对照片调色还不是

【OpenLayers 进阶】添加滤镜改变底图样式

目录 一、前言二、准备工作三、实现方式四、总结 一、前言    项目实施过程中,需要根据不同的业务场景需求变换地图样式。如果客户提供的底图服务或自建底图服务是类似Mapbox这种矢量切片,那只要按照需求配置不同的样式文件即可。如果没有矢量切片,只有一张张瓦片图如何实现呢?下面提供两种实现方式,以供参考 二、准备工作 首先要将完成地图的初始化 添加地图DIV <

iOS CoreImage专题(三)—— 自定义滤镜

前言子类化CIFilter自定义滤镜配方 子类化CIFilter创建CIColorInvert滤镜色度键滤镜配方 创建立体映射 获得最佳性能 最佳性能实践你的App需要颜色管理吗 总结 前言 本章节是这个专题最后一篇文章,学完这里,你应该能非常熟练的掌握CoreImage的使用技巧了。 在上一章节中我们介绍了如何实现一些高级技巧,包括滤镜链的实现、转场效果、人脸检测等。

使用ffmepg实现多路视频流合并

做视频会议系统的时候,有时需要实现多路视频画面合并后推流功能,要直接底层实现这样的功能还是不太容易的,如果借助ffmpeg就方便多了,使用ffmpeg的滤镜功能就能实现多路合并的效果。 首先说明需要用到的ffmpeg对象,以及一些必要的字段。 ffmpeg版本: version 4.3 所用到的头文件: #include <libavutil/avassert.h>#include <

将ffmepg引入到Android工程中

准备工具 Android开发工具AS(需要下载NDK)ffmpeg交叉编译后的动态库或静态库以及头文件 如果你不知道如何编译ffmpeg请看这篇文章 NDKr20使用clang编译ffmpeg4.2.2 接入步骤 新建Native C++工程并引入头文件和动态库: 编写CMakeLists.txt文件: cmake_minimum_required(VERSION 3.4.1)# 引

ffmpeg6.1集成Plus-OpenGL-Patch滤镜

可参考上一篇文章。ffmpeg6.1集成ffmpeg-gl-transition滤镜-CSDN博客 安装思路大致相同, 因为 Plus-OpenGL-Patch也是基于 ffmpeg 4.x 进行开发的,所以在高版本上安装会有很多报错。 这是我安装后的示例,需要安装教程或者改代码可私信我。 安装过程会有很多报错。如果是./configure 过程中哄的报错,可查看ffbuild/config.

CSS3模糊滤镜

大家可能对 Instagram 这款 iPhone APP 上的滤镜效果很感兴趣,其实 CSS3 开始也有滤镜(不是 IE 的那种滤镜),这些滤镜效果最初是用于 SVG 的,W3C 将其引入到 CSS3 中,然后制定了 CSS Filter Effects 1.0 的规范,Webkit 率先支持了它。 -webkit-filter 的用法 -webkit-filter 用法是标准的 CS

ffmpeg6.1集成ffmpeg-gl-transition滤镜

可代安装,有需要可以私信 ffmpeg-gl-transition 是基于 ffmpeg 4.x 进行开发的一个滤镜插件,在高版本上安装会有很多问题,以下是安装步骤,过程中可能会遇到很多报错,每个人的环境不一样,遇到的报错也不一样,但是都有解决办法。以下步骤中如果是在容器中docker 中,如果使用的镜像比较干净,可能需要需要先安装 wget,git, unip, sudo 等命令。安装方式直接

ffmpeg学习十二:滤镜(实现视频缩放,裁剪,水印等)

这篇文章对使用滤镜进行视频缩放,裁剪水印等做简单介绍。 一.滤镜 滤镜可以实现多路视频的叠加,水印,缩放,裁剪等功能,ffmpeg提供了丰富的滤镜,可以使用ffmpeg -filters来查看: Filters: T.. = Timeline support .S. = Slice threading ..C = Command support A = Audio input/out

四十七、openlayers官网示例Image Filters——给地图添加锐化、浮雕、边缘等滤镜效果

官网demo示例: Image Filters 这篇讲的是如何给地图添加滤镜。 一看代码,,好家伙,信息量满满,全都看不懂。。。 咱只能一段一段扒。。。 首先添加一个底图到地图上,这个好理解。 const imagery = new TileLayer({source: new OGCMapTile({url: "https://maps.gnosis.earth/og