首页 > 其他分享 >FFmpeg的overlay滤镜介绍

FFmpeg的overlay滤镜介绍

时间:2023-02-21 13:32:35浏览次数:48  
标签:FFmpeg overlay buffer 滤镜 实例 logo AVFrame

前面介绍 FFmpeg 滤镜的文章,其实埋了一个坑,滤镜实例有输入跟输出。但是往 buffer 滤镜实例输入的 AVFrame 不是无限的,总会有读完文件的一刻。从 buffersink 滤镜实例 输出的 AVFrame 也不是无限的,总会有刷完的一刻。

没有 AVFrame 可以输入了,怎么处理?没有 AVFrame 可以刷出来了,又怎么处理?

这就是本文的重点,本文会通过 overlay 滤镜来写一个小 demo


本文用 overlay 滤镜实现一个往视频里面加 logo 水印图片的例子,代码下载地址:​​GitHub​


初始化跟创建 滤镜实例跟容器的代码如下:

FFmpeg的overlay滤镜介绍_overlay

这次我初始化的时候,在字符串里面写了 两个 buffer,然后我只需要根据 名字 找到 ​​AVFilterContext​​ 即可,非常方便。


然后由于 logo 视频流实际上是一个图片,所以这个 logo 流只有一帧图片,一旦没有更多的 AVFrame 输入,就需要用 ​​av_buffersrc_close​​ 函数关闭 buffer 滤镜实例,如下:

FFmpeg的overlay滤镜介绍_FFmpeg_02

​av_buffersrc_close​​ 函数里面有一个 pts 参数,这是下一帧的pts,可以通过当前帧的 pts 跟他的 duration 计算出来。

我实验了一下,直接往 buffer 滤镜里面发一个 NULL 的 ​​AVFrame​​ 也是可以的,但是正规的做法是调 ​​av_buffersrc_close​​ 函数,ffmpeg.c 里面也是这么做的。


在所有的 buffer 输入滤镜实例都关闭之后,​​av_buffersink_get_frame_flags​​ 函数就会返回 ​​AVERROR_EOF​​ 告诉你没有更多的 AVFrame 输出了,滤镜处理就完了。代码如下:

FFmpeg的overlay滤镜介绍_滤镜_03


从输入输出 EOF 的处理来看,滤镜实例 跟 之前的 编码器,解码器 实例拥有相同的逻辑,他们都有输入输出,都需要对末尾(EOF)数据做处理。


代码运行结果如下:

FFmpeg的overlay滤镜介绍_滤镜_04

在 qt 的生成目录,可以看到以下文件。

FFmpeg的overlay滤镜介绍_overlay_05

用 7yuv 软件查看可以发现,logo 已经顺利印上去了。

FFmpeg的overlay滤镜介绍_overlay_06


本项目的效果可以用以下命令实现:

ffmpeg -i juren-30s.mp4 -i logo.jpg -filter_complex "[0:v][1:v]overlay=x=10:y=10" output.mp4 -y

扩展知识:可以通过 下面的命令查询 具体滤镜的参数。

ffmpeg -h filter=overlay

FFmpeg的overlay滤镜介绍_FFmpeg_07


如果想要透明的 logo,可以使用本文提供的 png 图片。不过本文的 ffmpeg 库没有把 png 的解码器编译进去,所以解码不了 png, 需要读者自己编译一次 FFmpeg 的库。


标签:FFmpeg,overlay,buffer,滤镜,实例,logo,AVFrame
From: https://blog.51cto.com/u_15655186/6076521

相关文章

  • FFmpeg转换直播流格式
    mp4转rtspffmpeg-re-i1671680590843.mp4-vcodeccopy-acodeccopy-frtsprtsp://localhost:8554/live.sdp mp4转hlsffmpeg-re-iD:\下载[www.domp4.cc]兔子......
  • ffmpeg提取最后一个关键帧
    例子:某文件夹中全部是mp4视频,对每个视频提取最后一个关键帧,并保存为同名jpg,一行代码实现方法1:foriin/path/to/folder/*.mp4;doffmpeg-i"$i"-vf"select='eq(pict......
  • FFmpeg的split滤镜介绍
    本文介绍split滤镜的用法以及 ​​avfilter_link​​ 函数的具体用法。本文的代码下载地址:​​GitHub​​,编译环境是Qt5.15.2跟MSVC2019_64bit。上下文这个词读......
  • FFmpeg滤镜API
    FFmpeg采用了FilterGraph的模型来管理整个数据流的处理,参与数据处理的各个功能模块叫做Filter(滤镜)。普通的用户在使用音视频剪辑软件的时候,会把滤镜这个词理解为app......
  • FFmpeg的scale滤镜介绍
    FFmpeg的滤镜API其实有3种调用方法,我个人觉得他是3种用法,如下:1,用 ​​avfilter_graph_create_filter​​ 一个一个地创建滤镜(​​AVFilterContext​​),然后用 ​​......
  • FFmpeg:搭建rstp/rtmp/HLS服务器(测试推流)
    在日常开发中,有些时候需要做一些推拉流测试,但又找不到可以测试的拉流地址,这个时候,可以使用rtsp-simple-server来搭建rtsp/rtmp/HLS服务器。1.服务器搭建rstp-simple-ser......
  • captura怎样解决FFmpeg解析错误问题
     captura怎样解决FFmpeg解析错误问题?captura软件里大家在进行屏幕录制的工作得时候都会用到captura软件,软件得功能可以满足大家的需求,可以轻松的录制屏幕,进行屏幕截屏等......
  • H.264:FFMpeg 实现简单的播放器
    FFMPEG工程浩大,可以参考的书籍又不是很多,因此很多刚学习FFMPEG的人常常感觉到无从下手。我刚接触FFMPEG的时候也感觉不知从何学起。因此我把自己做项目过程中实现的一个非......
  • Android使用FFmpeg的API库
    Java可以通过JNI调用原生库中的函数,原生库完全是由原生的CPU指令堆叠起来的,所以运行速度很快。大部分的原生库都是用C/C++编译出来的。因此,Android里面也能通过JNI......
  • FFmpeg打开输入文件
    本文介绍如何使用FFmpeg的API函数 ​​avformat_open_input​​​,​​avformat_find_stream_info​​ 来打开跟获取一个输入文件的信息(AVFormatContext)。本文的代码......