视频叠加——画中画效果 overlay video filter

视频叠加比较常见的应用场景是台标的叠加,在画面左上角、右上角、左下角或右下角叠加台标。
ffmpeg提供的overlay filter支持视频叠加。基本语法如下:

overlay[=x:y[[:rgb={0,1}]]]

其中x、y是嵌入图像的位置,默认为0;rgb表示输入源的格式,0表示不修改,1表示设置输入源格式为RGB。可使用下面四个参数:

  • main_w或W、main_h或H,主输入(被嵌入的视频)的宽度和高度
  • overlay_w或w、 overlay_h或h,叠加输入(嵌入视频)的宽高

下面的命令行可以实现视频叠加:

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

台标叠加测试

在左上角叠加可以用下面命令行:

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

叠加效果如下图:

右下角叠加可以使用下面命令行:

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

叠加效果如下:

画面上的字体显示 drawtext video filter

drawtext filter的语法如下:

drawtext=fontfile=font_f:text=text1[:p3=v3[:p4=v4[...]]]

p3, p4 ... means parameter #3, parameter #4, etc.

由于具体参数比较多,有兴趣的可以阅读FFmpeg Basics的Ch10或者参考ffmpeg的在线文档drawtext filter
下面是具体的例子:

ffplay -f lavfi -i color=c=white -vf drawtext=fontfile=arial.ttf:text=Welcome

这会在白色窗口的左上角显示Welcome字样。效果如下:

显示位置可以通过x、y设置,命令如下:

ffplay -f lavfi -i color=c=white -vf
drawtext="fontfile=arial.ttf:text='Good day':x=(w-tw)/2:y=(h-th)/2"

字体大小和颜色可以通过fontcolor、fontsize设置,命令如下:

ffplay -f lavfi -i color=c=white -vf drawtext=
"fontfile=arial.ttf:text='Happy Holidays':x=(w-tw)/2:y=(h-th)/2:
fontcolor=green:fontsize=30"

滚动字幕的实现

drawtext filter支持t,表示当前运行的描述。配合起来可以实现滚动字幕的效果。
可参考下面命令行:

ffmpeg -f lavfi -i color=c=#abcdef -vf drawtext=
"fontfile=arial.ttf:text='Dynamic RTL text':x=w-t*50:
fontcolor=darkorange:fontsize=30" output

水平滚动,每秒滚动50 pixel。

不同格式之间的转换——转码/转封装

媒体文件格式是指用于存储特定音频或视频的标准。容器格式是指可以存储多个音频或视频流的标准。ffmpeg支持的文件格式可以通过-formats查看。

通常容器支持多种音视频格式的封装,比如AVI、TS、MKV、MP4都是容器,可以支持H.264、MPEG-2、AAC等音视频格式。在实际应用中如果仅仅想更换封装格式,可以考虑使用-c copy-c:a copy-c:v copy

下图说明了实际转码过程中涉及到的封装格式(容器格式)、编解码格式(比特流格式)

转码过程中每个容器或codec都有私有的参数,可以使用-h encoder=encoder_name查看。具体参考FFmpeg Basic学习笔记1

ffmpeg支持的时间格式

多媒体处理涉及修改输入源的总长度、延时指定时间或者截取特定时间等操作。ffmpeg中支持的时间格式有两种:

  • [-]HH:MM:SS[.m...]
  • [-]S+[.m...]

按照时间设置输出流长度

使用-t命令参数即可。下面语句从输入源中截取三分钟输出:

ffmpeg -i music.mp3 -t 180 music_3_minutes.mp3

使用帧数限定输出长度

  • 音频使用 -aframes number-frames:a number
  • 视频使用 -vframes number-frames:v number

下面命令行指定输出15000帧视频,大约10分钟视频长度(按25fps计算)

ffmpeg -i video.avi -vframes 15000 video_10_minutes.avi

指定延时时间

可使用-ss命令项(seek from start)。调用命令如下:

ffmpeg -i input.avi -ss 10 output.mp4

表示从第10秒开始输出数据。

-ss-t配合使用可以截取任意时长的画面,比如下面命令截取输入的第五分钟(240秒~300秒)的视频。

ffmpeg -i video.mpg -ss 240 -t 60 clip_5th_minute.mpg

限制处理时间

使用-timelimit命令可以限制ffmpeg处理的总时间。命令如下:

ffmpeg -i input.mpg -timelimit 600 output.mkv

不管ffmpeg有没有处理完,600s之后程序退出。

播放速度改变的filter(注意修改的是时间戳)

视频可以使用setpts filter;音频可以使用atempo filter。

Metadata和Subtitle 元数据和字幕流

Metadata通常用于记录一些标签信息,比如发布者、作者、发布日期、专题名等。字幕流在配音电影中比较常见,通常以独立的字幕文件存在,需要的时候可以加载进来播放。

MetaData

MetaData在MP3文件中比较常见,在mp3播放时可以看到比较多的类似信息,使用下面命令可以查看metadata:

ffplay -i "Kalimba.mp3"

创建metadata

可以使用-metadata key=value的形式创建metadata,比如下面命令行:

ffmpeg -i input -metadata artist=FFmpeg -metadata title="Test 1" output

删除metadata

使用-map_metadata -1可以删除metadata

subtitle

subtitle有两种,一种是外置的,可以独立编辑发行;一种是内嵌的,嵌入到视频文件中。

subtitles video filter内嵌字幕流

语法如下:

subtitles=filename[:original_size]

下面命令行可以实现字幕嵌入:

ffmpeg -i video.avi -vf subtitles=titles.srt video.mp4

附加说明

本部分内容主要涉及《Ffmpeg Basic》的第8章到第14章(包含第14章),主要是关于视频叠加、字符叠加、subtitle、时间操作、多媒体文件的容器格式和文件格式。

一部分内容没有做详细介绍,有些参数建议参考FFmpeg的官网

FFmpeg Basic学习笔记(3)的更多相关文章

  1. FFmpeg Basic学习笔记(4)

    图像处理 常见的图片格式包括YUV.BMP.JPG.GIF.PNG. 图像的创建 可以使用下面命令从输入源中截取图像 ffmpeg -i input -ss t image.type 从videocl ...

  2. FFmpeg Basics学习笔记(2)

    帧率 fps的概念 帧率,单位FPS(frame per second), 用于衡量视频每秒的处理帧数,对于编码器而言说明编码器在1s的编码的速度,通常可以使用一帧的编码时间倒数简单计算:对于解码器而 ...

  3. FFmpeg Basics学习笔记(1)ffmpeg基础

    1 FFmpeg的由来 FFmpeg缩写中,FF指的是Fast Forward,mpeg是 Moving Pictures Experts Group的缩写.官网:ffmpeg.org 编译好的可执行 ...

  4. FFmpeg编程学习笔记二:音频重採样

    ffmpeg实现音频重採样的核心函数swr_convert功能很强大,但是ffmpeg文档对它的凝视太过简单.在应用中往往会出这样那样的问题,事实上在读取数据->重採样->编码数据的循环中 ...

  5. Linux Basic学习笔记01

    介绍课程: 中级: 初级:系统基础 中级:系统管理.服务安全及服务管理.Shell脚本: 高级: MySQL数据库: cache & storage 集群: Cluster lb: 4laye ...

  6. Decimal Basic 学习笔记(1)

    定义变量 LET a 输入变量值 INPUT a INPUT a,b 运算结果绝对值小于1前面的0省略,科学计数 PRINT语句 数值直接写,字符串用“” 通过 分号: 和 逗号,来分隔显示两个项目 ...

  7. FFmpeg常用命令学习笔记(一)基本信息查询命令

    笔者才开始学习音视频开发,FFmpeg学习笔记系列主要是从慕课网李超老师的FFmpeg音视频核心技术精讲与实战课程学习的心得体会. FFmpeg音视频核心技术精讲与实战:https://coding. ...

  8. ffmpeg学习笔记

           对于每一个刚開始学习的人,刚開始接触ffmpeg时,想必会有三个问题最为关心,即ffmpeg是什么?能干什么?怎么開始学习?本人前段时间開始接触ffmpeg,在刚開始学习过程中.这三个问 ...

  9. mysql basic operation,mysql总结,对mysql经常使用语句的详细总结,MySQL学习笔记

    mysql> select * from wifi_data where dev_id like "0023-AABBCCCCBBAA" ; 1.显示数据库列表.show d ...

随机推荐

  1. Eclipse导入项目时出错提示 project is missing required library

    Eclipse导入(import)项目时出错提示 project is missing required library... 以至于不能build... 然后项目会有红色感叹号: [解决办法] 右击 ...

  2. 最新的 CocoaPods 的使用教程(一)

    发布开源库到CocoaPods的时候.对CocoaPods重新学习了一下. 1.CocoaPods的日常使用 2.创建CocoaPods的私有库 3.创建CocoaPods的开源库 一. CocoaP ...

  3. 【LeetCode】3. Longest Substring Without Repeating Characters (2 solutions)

    Longest Substring Without Repeating Characters Given a string, find the length of the longest substr ...

  4. 路由器下CLI界面

    CLI(command-line interface,命令行界面)是指可在用户提示符下键入可执行指令的界面. CLI是Command Line Interface的缩写,即命令行界面.CLI界面是所有 ...

  5. Cobbler自动部署主机系统

    Cobbler自动部署主机系统 简介: Cobbler由python语言开发,是对PXE和 Kickstart以及DHCP的封装.融合很多特性,提供了CLI和Web的管理形式.更加方便的实行网络安装. ...

  6. 业务、架构、技术,我们应该关注什么 Java和.Net的优势劣势简单看法 市场经济决定,商业之道即是软件之道,市场的需求决定着软件技术的发展 利益决定着选择应用新技术

    业务.架构.技术,我们应该关注什么 一个企业存在的必然和前提就是获取企业生成的利润,怎么样合法合理取得利润呢,企业怎么样生存下去呢,很简单,为客户提供等值的产品与服务,客户支付你相应的报酬. 我们是从 ...

  7. 忘记mysqlroot密码/我的电脑 管理服务里面没有mysql启动项/mysql启动不了net start mysql

    http://www.cnblogs.com/andy_tigger/archive/2012/04/12/2443652.html 通过绕过不需密码 http://www.jb51.net/arti ...

  8. 【Smali】Smali文件的动态调试

    1.简介 smalidea是一个IntelliJ IDEA/Android Studio smali语言插件,可实现动态调试smali代码.下载地址为:https://github.com/Jesus ...

  9. C++中的Thunk技术 / 非静态类成员函数作为回调函数 的实现方法

    原文:https://blog.twofei.com/616/ 用我的理解通俗地解释一下什么是C++中的Thunk技术吧! Thunk技术就是申请一段可执行的内存, 并通过手动构造CPU指令的形式来生 ...

  10. Smarty标签运算,控制结构[if,for,foreach,section,while]

    Smarty标签运算: 在页面上做简单的运算[temp5.html] 条件判断if 循环结构 for foreach用得比较多,foreach例子从数据库取出的数据 section功能和foreach ...