《FFmpeg Basics》中文版-09-overlay-画中画

2024-05-04 03:32

本文主要是介绍《FFmpeg Basics》中文版-09-overlay-画中画,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://www.jianshu.com/p/32e1ca5432e1

 

《FFmpeg Basics》中文版-09-overlay-画中画

0.1182018.04.11 11:55:39字数 1516阅读 1629

写在前面

如果您对音视频技术感兴趣,可以订阅我的专题:音视频专辑
也可以关注我的简书账户: 张芳涛,我后期会发布更多的音视频以及图像处理方面的文章。

正文

overlay视频技术经常被使用,常见的例子是放置在电视屏幕上的电视频道标志,通常位于右上角,以标识特定的频道。 另一个例子是画中画功能,可以在主屏幕的其中一个角落显示小窗口。 小窗口包含选定的电视频道或其他内容,同时在主屏幕上观看节目 - 这在等待特定内容,跳过广告等时很有用。

本章仅包含简单的overlay实例,更复杂的例子是在颜色修正,高级技术等章节中。

关于overlay的介绍

视频overlay是一种技术,它可以在(通常是较大的)背景视频或图像上显示前景视频或图像。我们可以使用在表格中描述的覆盖视频过滤器:

 

描述在指定位置上覆盖第一个输入
语法overlay[=x:y[[:rgb={0, 1}]]
参数x和y是可选的,其默认值为0 rgb参数是可选的,其值为0或1
***********参数的描述
x从左上角的水平坐标,默认值为0
y从左上角的垂直坐标,默认值为0
rgbrgb = 0…输入的颜色空间不改变,默认值
rgb = 1…输入的颜色空间设置为RGB
***********变量,可以用在x和y的表达式中
main_w or W主要输入宽度
main_h or H主要输入高度
overlay_w or woverlay输入宽度
overlay_h or hoverlay输入高度

overlay命令结构

视频覆盖命令的结构如下,input1是视频背景,input2是前景:

ffmpeg -i input1 -i input2 -filter_complex overlay=x:y output

我的测试命令如下:

ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -i /Users/zhangfangtao/Desktop/PDXlogoanimationHDh264.mp4  -filter_complex overlay=100:100 /Users/zhangfangtao/Desktop/newTest.mp4 

效果图:

 

前置的那个有点大。。。。

请注意,不是使用-vf选项,而是使用-filter_complex选项,因为现在有两个输入源(通常是视频文件或图像)。但是使用带有链接标签的filtergraph,我们可以使用一个电影视频源,它将包含第二个输入,并且只使用-vf选项:

ffmpeg -i input1 -vf movie=input2[logo];[in][logo]overlay=x:y output

另一种方法是将一个输入拆分为几个输出,并使用pad过滤器创建更大的背景。这个背景在filterchain中作为覆盖过滤器的第一个输入,这个方法已经在第一个章节中的过滤器,过滤链和过滤器图部分中被描述了,。

 

一个角落的logo

为了让内容保持可见,logo经常被放置在屏幕的四个角落里。接下来的4个例子使用这一对。mp4视频作为第一个包含一对结婚对象的输入,第二个输入是包含文本M+P(例如,Mary和Peter)的红色心脏。视频分辨率为1280x720像素,logo大小为150x140像素,但我们不需要这个尺寸来计算logo的位置。logo的左上角(x和y坐标)的正确位置是由背景和前景的宽度和高度值决定的:
W H -宽度和背景高度(视频)
w h -宽度和前景高度(logo)

Logo在左上角

ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay pair1.mp4

 

我自己的测试命令:

ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4  -i /Users/zhangfangtao/Desktop/001.jpg  -filter_complex overlay=0:0 /Users/zhangfangtao/Desktop/newTest.mp4 

显示的效果图:

Logo在右上角

ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w pair2.mp4

 

我的测试命令:

 ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4  -i /Users/zhangfangtao/Desktop/001.jpg  -filter_complex overlay=W-w:0 /Users/zhangfangtao/Desktop/newTest.mp4 

实现的效果如下图:

Logo在右下角

ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w:H-h pair3.mp4

我的测试代码:

ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4  -i /Users/zhangfangtao/Desktop/001.jpg  -filter_complex overlay=W-w:H-h /Users/zhangfangtao/Desktop/newTest.mp4 

效果图:

Logo在左下角

ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=0:H-h pair4.mp4

我的测试命令:

ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4  -i /Users/zhangfangtao/Desktop/001.jpg  -filter_complex overlay=0:H-h /Users/zhangfangtao/Desktop/newTest.mp4 

效果图:

Logo显示在指定的时刻

在某些情况下,例如当视频包含一个特别的介绍时,可以在一个时间间隔后加上一个-itsoffset选项来添加标识(或其他源到覆盖)。例如,在开始的5秒后,在蓝色背景上添加一个红色标志,我们可以使用以下命令:

ffmpeg -i video_with_timer.mp4 -itsoffset 5 -i logo.png ^ -filter_complex overlay timer_with_logo.mp4

  • 注意:这里我怀疑作者的命令是有问题的,因为那个'^'符号好像是不支持的

我的测试命令:

ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4  -itsoffset 5 -i /Users/zhangfangtao/Desktop/001.jpg  -filter_complex overlay=100:100 /Users/zhangfangtao/Desktop/newTest.mp4 

前五秒钟的画面:

前五秒钟的画面

五秒钟之后的画面:

五秒钟之后的画面

在第二个输入之前直接输入-itsoffset选项很重要,否则叠加效果将从输出的开始处开始。 -itsoffset选项的更多示例请参见时间操作一章。 其他延迟徽标的方法是使用高级技术一章中介绍的电影过滤器。

视频计时器

这个例子使用了1973年的公共领域NASA视频,其中阿波罗17号从月球表面开始到它的轨道。 视频持续时间为29.93秒,分辨率为512x384像素。 我们使用2位数计时器,就像使用裁剪视频章节中的数字一样。

下面的指令可以生成timer.ogg视频文件:

ffmpeg -f lavfi -i testsrc -vf crop=61:52:224:94 -t 30 timer.ogg

现在我们有一个61x52像素大小的小视频,显示定时器从0到30秒。这段视频将会在阿波罗17号月球启动视频中被覆盖在右上角的命令:

ffmpeg -i start.mp4 -i timer.ogg -filter_complex overlay=451 startl.mp4

定时器的x坐标为512 - 61 = 451,y坐标为0。

 

我的测试命令如下:

ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -i /Users/zhangfangtao/Desktop/timer.ogg -filter_complex overlay=451 /Users/zhangfangtao/Desktop/newTest.mp4 

效果图:

下一个命令将计时器调到1 / 2,并将其置于底部中心:

ffmpeg -i start.mp4 -vf movie=timer.ogg,scale=15:14[tm];^ [in][tm]overlay=248:371 overlay.mp4

 

现在计时器几乎看不见了。 我们使用一个命名的标签[tm]作为缩放过滤器输出板,以便将改变大小的定时器作为覆盖过滤器的第二个输入,第一个输入是由默认[in]命名标签表示的文件start.mp4。

  • 这个命令在我这儿测试不通过。。。。错误代码:At least one output file must be specified(至少制定一个输出文件)

其他overlay的例子

其他的用到了overlay技术的例子:

  • FFmpeg基本介绍章节下面的过滤器,过滤链和过滤图部分内容。
  • 图像处理下面的,切片,旋转和覆盖图像部分内容。
  • 麦克风和网络摄像头章节里面的使用两个摄像头部分内容。
  • 颜色修正章节:
  • 在两个window窗口中进行比较。
    
  • 在3个window窗口中比较。
    
  • 2和3window窗的亮度校正。  
    
  • 4个window窗口的截面比较。
    
  • 高级技术章节里面的部分额外的媒体输入到filtergraph。

这篇关于《FFmpeg Basics》中文版-09-overlay-画中画的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

Java第二阶段---09类和对象---第三节 构造方法

第三节 构造方法 1.概念 构造方法是一种特殊的方法,主要用于创建对象以及完成对象的属性初始化操作。构造方法不能被对象调用。 2.语法 //[]中内容可有可无 访问修饰符 类名([参数列表]){ } 3.示例 public class Car {     //车特征(属性)     public String name;//车名   可以直接拿来用 说明它有初始值     pu

JavaEE7 Servlet 3.1(JSR 340)规范中文版

http://www.iteye.com/news/27727-jinnianshilongnian     Jave EE 7中的部分规范已正式获得批准通过,其中包括JSR340 Java Servlet 3.1规范,去年翻译了该规范,在此分享出来,希望对某些朋友有所帮助,不足之处请指正。   点击直接下载    在线版目录   Servlet3.1规范翻译

Science|癌症中三级淋巴结构的免疫调节作用与治疗潜力|顶刊精析·24-09-08

小罗碎碎念 Science文献精析 今天精析的这一篇综述,于2022-01-07发表于Science,主要讨论了癌症中的三级淋巴结构(Tertiary Lymphoid Structures, TLS)及其在肿瘤免疫反应中的作用。 作者类型作者姓名单位名称(中文)通讯作者介绍第一作者Ton N. Schumacher荷兰癌症研究所通讯作者之一通讯作者Daniela S. Thomm

ffmpeg面向对象-待定

1.常用对象 rtsp拉流第一步都是avformat_open_input,其入参可以看下怎么用: AVFormatContext *fmt_ctx = NULL;result = avformat_open_input(&fmt_ctx, input_filename, NULL, NULL); 其中fmt_ctx 如何分配内存的?如下 int avformat_open_input(

09 生命周期

生命周期 beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestorydestoryed 辣子鸡:香辣入口,犹如吃了炫迈一样 - - - 根本停不下来 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport"

FFmpeg系列-视频解码后保存帧图片为ppm

在正常开发中遇到花屏时怎么处理呢?可以把解码后的数据直接保存成帧图片保存起来,然后直接看图片有没有花屏来排除是否是显示的问题,如果花屏,则代表显示无问题,如果图片中没有花屏,则可以往显示的方向去排查了。 void saveFrame(AVFrame* pFrame, int width, int height, int iFrame){FILE *pFile;char szFilename[

Learn ComputeShader 09 Night version lenses

这次将要制作一个类似夜视仪的效果 第一步就是要降低图像的分辨率, 这只需要将id.xy除上一个数字然后再乘上这个数字 可以根据下图理解,很明显通过这个操作在多个像素显示了相同的颜色,并且很多像素颜色被丢失了,自然就会有降低分辨率的效果 效果: 但是这样图像太锐利了,我们加入噪声去解决这个问题 [numthreads(8, 8, 1)]void CSMain(uint3 id

【IPV6从入门到起飞】4-RTMP推流,ffmpeg拉流,纯HTML网页HLS实时直播

【IPV6从入门到起飞】4-RTMP推流,ffmpeg拉流,纯HTML网页HLS实时直播 1 背景2 搭建rtmp服务器2.1 nginx方案搭建2.1.1 windows 配置2.1.2 linux 配置 2.2 Docker方案搭建2.2.1 docker 下载2.2.2 宝塔软件商店下载 3 rtmp推流3.1 EV录屏推流3.2 OBS Studio推流 4 ffmpeg拉流转格式

【笔记】数据结构刷题09

快速排序 215. 数组中的第K个最大元素 class Solution {public:int findKthLargest(vector<int>& nums, int k) {return divide(nums,0,nums.size()-1,nums.size()-k);}int divide(vector<int>& nums,int left,int right,int k)