(3)FFmpeg命令体验

1 FFmpeg命令查看帮助文档

1.1 ffmpeg/ffplay/ffprobe简介

  • FFmpeg是一套开源的计算机程序,主要用于记录、转换数字音频、视频,并能将其转化为流。它提供了录制、转换以及流化音视频的完整解决方案,包含了非常先进的音频/视频编解码库libavcodec
  • ffplayFFmpeg提供的一个简单的音视频媒体播放器,由ffmpeg库和SDL库开发。它可以用于音视频播放、可视化分析,提供音视频显示和播放相关的图像信息、音频的波形等信息。
  • ffprobe是另一个由FFmpeg提供的工具,它可以从媒体流收集媒体信息,并打印出开发人员可以读的格式。我们可以将ffprobe理解为流媒体的分析工具,使用它可以查看流媒体中包含的容器,以及容器中包含的流媒体的格式和类型。这对于我们理解并处理多媒体数据非常有帮助。

1.2 命令查看帮助文档

  • ffmpeg
# 基本信息
ffmpeg -h
# 高级信息
ffmpeg -h long
# 所有信息
ffmpeg -h full

usage:
	ffmpeg [options] [[input options] -i input]... {[output options] output}...
  • ffplay
ffplay -h

usage:
	ffplay [options] input
  • ffprobe
ffprobe -h

usage:
	ffprobe [options] [input]

1.3 处理流程

首先了解一些常用参数

  • 主要参数
-i 设定输入流 
-f 设定输出格式 
-ss 开始时间 
  • 视频参数
-b 设定视频流量(码率),默认为200Kbit/s 
-r 设定帧速率,默认为25 
-s 设定画面的宽与高 
-aspect 设定画面的比例 
-vn 不处理视频 
-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器 
  • 音频参数
-ar 设定采样率 
-ac 设定声音的Channel数 
-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器 
-an 不处理音频

解析来看两个例子

# cpoy表示不重新编码,直接复制原来的流
ffmpeg -i input_1920*1080.mp4 -acodec copy -vcodec libx264 -s 1280×720 output_1280*720.flv

ffmpeg -i input_1920*1080.mp4 -acodec copy -vcodec libx265 -s 1280×720 output_1280*720.mkv

1.4 ffmpeg分类查询

命令参数内容
-version显示版本
-buildconf显示编译配置
-formats显示可用的格式
-muxers显示可用的封装
-demuxers显示可用的解封装
-codecs显示可用的编解码器
-decoders显示可用的解码器
-encoders显示可用的编码器
-bsfs显示可用比特流fliter
-protocols显示可用的协议
-filters显示可用的过滤器
-pix-fmts显示可用的像素格式
-layouts显示标准声道名称
-sample_fmts显示可用的音频采样格式
-color显示可用的颜色名称

想查看具体某个具体的参数

# 语法
ffmpeg -h type=name

# 比如
ffmpeg -h muxer=flv
ffmpeg -h filter=atempo
ffmpeg -h encoder=libx264

2 ffplay命令

均来自ffplay.html

2.1 播放中选项

选项说明选项说明
q、ESC退出播放t循环切换字幕流
f全屏切换c循环切换节目
p、space暂停w循环切换过滤器或显示模式
m静音切换s逐帧播放
9、09增加音量、0减小音量left/right向后、向前拖动10s
down/up向后、向前拖动1min
a循环切换音频流鼠标右键单击拖动与显示宽度百分比的文件进行播放
v循环切换视频流鼠标左键单击全屏切换

2.2 主要选项

-x width    # 强制显示宽度
-y height   # 强制显示高度
-fs         # 以全屏模式启动
-an         # 禁用音频
-vn         # 禁用视频
-sn         # 禁用字幕
-ss pos     # 根据设置的秒进行定位拖动
-t duration # 播放时长
-bytes      # 按字节进行定位拖动
-seek_interval interval # 设置左右键定位拖动间隔
-nodisp     # 关闭图形化显示,视频将被关闭
-noborder   # 无边框
-alwaysontop # 窗口总是在上面。适用于:X11, SDL >= 2.0.5, Windows SDL >= 2.0.6。
-volume     # 设置音量【0~100】
-f fmt      # 强制使用设置的格式解析
-window_title title # 设置窗口标题,默认是输入文件名
-loop number  # 设置循环播放次数,0是无限
-showmode mode # 设置显示模式,可用的模式值:0视频、1音频波形、2音频频谱。缺省0,不存在则是2
-vf filtergraph # 视频滤镜
-af filtergraph # 音频滤镜
-framerate     #设置帧率
# ============通用选项===========
-pix_fmts # 设置像素格式或者查看支持的像素格式

2.3 高级选项

-stats
#打印多个播放统计数据,特别是显示流持续时间,编解码器参数,流中的当前位置和音频/视频同步差值。
#默认情况下显示,除非日志级别低于info。要禁用它,需要指定-nostats。

-fast
#非标准化规范的多媒体优化.

-genpts
#生成 pts.

-sync type
#设置主时钟为 audio (type=audio), video (type=video) or external (type=ext). 默认是音频

-ast audio_stream_specifier
# 指定音频流索引,比如-ast 3,播放流索引为3的音频流

-vst video_stream_specifier
# 指定视频流索引,用法同上

-sst subtitle_stream_specifier
# 指定字幕流索引,用法同上

-autoexit
# 视频播放完毕,自动退出

-exitonkeydown
# Exit if any key is pressed.

-exitonmousedown
# Exit if any mouse button is pressed.

-codec:media_specifier codec_name
# 强制使用设置的多媒体解码器,media_specifier 可用值为a (audio), v (video), and s
# 比如-codec:v h264_qsv强制视频采用h264_qsv解码

-acodec codec_name
Force a specific audio decoder.

-vcodec codec_name
Force a specific video decoder.

-scodec codec_name
Force a specific subtitle decoder.

-autorotate
# 根据文件元数据自动旋转视频. Enabled by default, use -noautorotate to disable it.

-framedrop
# 如果视频不同步则丢弃视频帧. 当主时钟非视频时钟时默认开启, use -noframedrop to disable it.

-infbuf
# 不限制输入缓冲区大小。尽可能快地从输入中读取尽可能多的数据。
# 播放实时流时默认启用,如果未及时读取数据,则可能会丢弃数据,此选项
# 将不限制缓冲区的大小。 use -noinfbuf to disable it.

-filter_threads nb_threads
# 定义用于处理过滤器管道的线程数. 
# 每个管道会产生一个线程池,里边有许多线程用于并行处理. 
# 0代表由可用cpu的数量决定

-enable_vulkan
# 使用vulkan渲染器而不是SDL内置渲染器。取决于libplacebo。

-vulkan_params
Vulkan configuration using a list of key=value pairs separated by ":".

-hwaccel
# 使用HW加速解码。启用此选项将自动启用vulkan渲染器。

2.4 练习讲解

  • 播放本地文件
# 解:设置视频标题为hello, 从第2s开始播放,持续10s,完事自动退出
ffplay -window_title "hello" -ss 2 -t 10 -autoexit test.mp4

# 解:播放shijie.mp4文件
ffplay shijie.mp4
  • 播放网络流
# 设置标题为rtmp
ffplay -window_title "rtmp" rtmp://liteavapp.qcloud.com/live/liteavdemoplayerstreamid
  • 强制解码器
# mpeg解码器: 
ffplay -vcodec mpeg4 input.mp4
# h264解码器
ffplay -vcodec h264 input.mp4
  • 禁用音频或视频
# 禁用音频
ffplay test.mp4 -an
# 禁用视频
ffplay test.mp4 -vn
  • 播放YUV数据
# video_size 设置显示帧存储(WxH格式),仅适用于类似原始YUV等没有包含帧大小的视频
ffplay -pixel_format yuv420p -video_size 320×240 -framerate 5 yuv420p_320×240.yuv
  • 播放RGB数据
ffplay -pixel_format rgb24 -video_size 320×240 -i rgb24_320×240.rgb
ffplay -pixel_format rgb24 -video_size 320×240  -framerate 5 -i rgb24_320×240.rgb
  • 播放PCM数据
ffplay -ar 48000 -ac 2 -f f32le 48000_2_f32le.pcm
-ar 设置音频采样率(Hz)(从0到INT_MAX)
-ac 设置音频通道数(从0到INT_MAX)

2.5 简单过滤器

# 视频旋转90°
ffplay -i test.mp4 -vf transpose=1

# 视频反转
ffplay -i test.mp4 -vf hflip
ffplay -i test.mp4 -vf vflip

# 视频反转加旋转
ffplay test.mp4 -vf hflip, transpose=1

# 音频变速播放
ffplay -i test.mp4 -af atempo=2

# 视频变速播放
ffplay -i test.mp4 -vf setpts=PTS/2

# 音视频同时变速
ffplay -i test.mp4 -vf setpts=PTS/2 -af atempo=2

3 ffmpeg命令

3.1 ffmpeg常用选项

3.1.1 Main options

-f fmt      # 设定输入输出文件格式,输入不常用,一般都自动检测。
-i input    # 设定输入流
-y          # 不询问直接覆盖已有文件
-n          # 不覆盖已有文件,如果存在立即退出
-c(或codec) # 为一个或多个流选择
-c
-codec 
# 为一个或多个流选择编码器(输出文件)或解码器(输入文件)
# example 1
# 使用x264为所有的视频流编码,并直接复制音频流
ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT
# example 2
# 使用x264为第二个视频流编码,使用libvorbis为138th音频流编码,其余的直接复制
ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a137 libvorbis OUTPUT
-t duration    # 设定时长
-ss position   # 设定开始时间
-fs limit_size # 设定输出文件大小上限
-timestamp date # 设定输出文件时间戳
#
-metadata[:metadata_specifier] key=value (output,per-metadata)
# 设置文件元数据
-metadata[:metadata_specifier] key=value (output,per-metadata)
# example 1 设置文件标题
ffmpeg -i in.avi -metadata title="my title" out.flv
# example 2 设置首个音频流的语言
ffmpeg -i in.avi -metadata:s:a:0 language=eng out.avi
# 其他key
comment、encoder

3.1.2 Video Options

# 设置输出的视频帧数。这是-frames:v的过时别名,应该替换它
-vframes number

-b   #设定视频码率
-b:v   #视频码率
-r fps  # 设置帧速率
-s size # 设置画面的宽和高,格式是 ‘wxh’ ,其实就是分辨率
-aspect aspect # 设置视频长宽比(16:9、4:3、1.333)
-vn     # 不处理视频
-vcodec codec # 设定视频编解码器,这是 -codec:v的别名
-vf     # 视频过滤器
-pass n #择处理遍数(1或者2)。两遍编码非常有用。
		#第一遍生成统计信息,第二遍生成精确的请求的码率
ffmpeg -i test.mp4 -vframes 300 -b:v 300k -r 30  \
		-s 640x480 -aspect 16:9 -vcodec libx265
# 输入文件test.mp4   输出300帧 码率300k 帧率30
#        画面宽高640*480  长宽比16:9  265编解码
## 注意:如果-s 640x480这里总报错,可以改成640:480试试,
## 虽然文档写的是用乘号		

3.1.3 Advanced Video options

-pix_fmt format  # 设置像素格式,
				#用ffmpeg -pix_fmts查看支持的格式
				# 如果设置了不支持的,ffmpeg会自动选择最合适的
-

3.1.4 Audio Options

-aframes num  # 设置输出音频帧数,是-frames:a的过时别名
-ar           # 设定采样率
-aq           # 设置音频质量,是-q:a的别名
-ac           # 设置通道数
-an           # 不处理音频
-acodec       # 声音编解码器
-sample_fmt   # 设置音频样本格式
-af           # 音频过滤器,是-fliter:a的别名
# example
ffmpeg -i test.mp4 -aframes 200 -b:a 192k -ar 48000  \
		-ac 2  -acodec libmp3lame out2.mp3

3.2 ffmpeg命令练习

3.2.1 提取音视频数据

保留封装格式

ffmpeg -i test.mp4 -acodec copy -vn audio.mp4
ffmpeg -i test.mp4 -vcodec copy -an audio.mp4

提取视频

# 保留编码格式
ffmpeg -i test.mp4 -vcodec copy -an test_copy.h264
# 强制格式
ffmpeg -i test.mp4 -vcodec libx264 -an test.h264

提取音频

# 保留编码格式
ffmpeg -i test.mp4 -acodec copy -vn test.aac
# 强制格式
ffmpeg -i test.mp4 -acodec libmp3lame -vn test.mp3

3.2.2 提取像素格式和PCM数据

提取YUV

# 提取三秒数据,分辨率和源视频一致
ffmpeg -i test_1280×720.mp4 -t 3 -pix_fmt yuv420p
# 提取3秒数据,分辨率转为320×240
ffmpeg -i test_1280×720.mp4 -t 3 -pix_fmt yuv420p -s 320:240 out.yuv

Tip:忘了yuv420p是啥了这里查了一下 @handy周

提取RGB

ffmpeg -i test.mp4 -t 3 -pix_fmt rgb24 -s 320:240 out.rgb

YUV转RGB

ffmpeg -s 320x240 -pix_fmt yuv420p -i yuv420p_320xx240.yuv \
-pix_fmt rgb24 rgb24_320x240_2.rgb

提取PCM

ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -f s16le 48000_2_s16le.pcm
ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -sample_fmt s16 out_s16.wav
ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -codec:a pcm_s16le out2_s16le.wav
ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -f f32le 48000_2_f32le.pcm
ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -f f32le 48000_2_f32le.pcm

3.2.3 转封装

保持编码格式

# 可以看出封装格式一般不用指定 -f,可以通过文件扩展名推测
ffmpeg -i test.mp4 -vcodec copy -acodec copy test_copy.ts
ffmpeg -i test.mp4 -codec copy copy2.ts

改变编码格式

ffmpeg -i test.mp4 -vcodec libx265 -acodec libmp3lame out.mkv

修改帧率

ffmpeg -i test.mp4 -r 15 output.mp4

修改视频码率

# 此时音频也被重新编码
ffmpeg -i test.mp4 -b 400k output.mkv

修改视频码率

# 只对视频编码,音频不变
ffmpeg -i test.mp4 -b:v 400k output.mkv

修改音频码率

# 不像对video重新编码,需要加上vcodec copy
ffmpeg -i tset.mp4 -b:a 192k out.mp4

修改音视频码率

ffmpeg -i tset.mp4 -b:a 192k -b:v 400k out.mp4

修改视频分辨率

ffmpeg -i tset.mp4 -s 480:270 out.mp4

修改音频采样率

ffmpeg -i tset.mp4 -ar 44100 out.mp4

3.2.4 裁剪和合并视频

  1. 生成测试文件
    a. 找三个不同的视频,每个视频截取10s内容

    # 如果格式不统一则强制统一-vcodec libx264  -acodec aac
    ffmpeg -i test1.mp4 -ss 00:05:00 -t 10 -codec copy 1.mp4
    ffmpeg -i test2.mp4 -ss 00:05:00 -t 10 -codec copy 2.mp4
    ffmpeg -i test3.mp4 -ss 00:05:00 -t 10 -codec copy 3.mp4
    

    b. 将上述1.mp4/2.mp4/3.mp4转成ts格式

    ffmpeg -i 1.mp4  -codec copy -vbsf h264_mp4toannexb 1.ts
    ffmpeg -i 2.mp4  -codec copy -vbsf h264_mp4toannexb 2.ts
    ffmpeg -i 3.mp4  -codec copy -vbsf h264_mp4toannexb 3.ts
    

    c. 转成flv格式

    ffmpeg -i 1.mp4  -codec copy  1.flv
    ffmpeg -i 2.mp4  -codec copy  2.flv
    ffmpeg -i 3.mp4  -codec copy  3.flv
    

    分离某些封装格式(e.g: MP4/FLV/MKV等)中的H.264的时候,需要首先写入SPS和PPS,否则会导致分离出来的数据没有SPS、PPS从而无法播放。H.264码流中的SPS和PPS信息存储在AVCodecContext结构体的extradata中。需要使用ffmpeg中名称为h264_mp4toannexb的bitstream filter处理。

  2. 开始拼接文件
    a. 以MP4格式拼接

    # 方式1
    ffmpeg -i "concat:1.mp4|2.mp4|3.mp4" -c copy output.mp4
    # 方式2:将他们放在一起,然后内容如下
    file '1.mp4'
    file '2.mp4'
    file '3.mp4'
    # 执行命令
    ffmpeg -f concat -i video.txt -c copy concat.mp4
    

    b. 以TS格式进行拼接

    # 方式1
    ffmpeg -i "concat:1.ts|2.ts|3.ts" -c copy outts.mp4
    # 方式2:将他们放在一起,同上
    # 执行命令
    ffmpeg -f concat -i video.txt -c copy outts2.mp4
    

    c. 以FLV格式进行拼接

    # 方式1
    ffmpeg -i "concat:1.flv|2.flv|3.flv" -c copy outflv.mp4
    # 方式2:将他们放在一起,同上
    # 执行命令
    ffmpeg -f concat -i video.txt -c copy outflv2.mp4
    

    不是所有格式都能用方法1拼接,优先第二种方式

  3. 测试不同编码拼接
    a. 修改音频编码

    ffmpeg -i 2.mp4 -vcodec copy -acodec ac3 -vbsf h264_mp4toannexb 2.ts
    ffmpeg -i "concat:1.ts|2.ts|3.ts" -c copy outts.mp4  # 第二段没声音
    

    b. 修改音频采样率

    ffmpeg -i 2.mp4 -vcodec copy -acodec aac -ar 96000 -vbsf h264_mp4toannexb 2.ts
    ffmpeg -i "concat:1.ts|2.ts|3.ts" -c copy outts.mp4  # 第二段异常
    

    c. 修改视频编码格式

    ffmpeg -i 1.mp4 -vcodec libx265 -acodec copy 1.ts
    ffmpeg -i "concat:1.ts|2.ts|3.ts" -c copy outts.mp4  
    

    d. 修改视频分辨率

    ffmpeg -i 1.mp4 -vcodec libx265 -s 800:472 -acodec copy -vbsf h264_mp4toannexb 1.ts
    ffmpeg -i "concat:1.ts|2.ts|3.ts" -c copy outts.mp4
    
  • 把每个视频封装成统一的ts格式,拼接输出的时候再输出你需要的封装格式,比如MP4
  • 视频分辨率可以不同,但是编码格式需要统一
  • 音频编码格式需要统一,音频参数也需要统一
  • 拼接视频时,一般都需要按照第一个视频参数为准,后边的不一样会出问题

3.2.5 图片与视频互转

  • 截取一张图片
    ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640:360 test.jpg
    ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640:360 test.bmp
    # -i 输入
    # -y 覆盖
    # -f 格式
    # image2 一种格式
    # ss 起始时间
    # -vframes 帧数,如果大于1,输出加%03d.  test%03d.jpg
    # -s 分辨率
    
  • 转换视频为图片(每帧一张)
    ffmpeg -i test.mp4 -t 5 -s 640:480 -r 15 frmae%03d.jpg
    
  • 图片转化为视频
    ffmpeg -f image2 -i frame%03d.jpg -r 25 video.mp4
    
  • 从视频中生成gif图片
    ffmpeg -i test.mp4 -t 5 -r 1 image1.gif
    ffmpeg -i test.mp4 -t 5 -r 25 -s 640:480 image2.gif
    
  • 将gif转化为视频
    ffmpeg -f gif -i image2.gif image2.mp4
    

3.2.6 视频录制

3.2.4.1 Ubuntu
# 1. 获取屏幕分辨率
xrandr

# 2. 设置分辨率、帧率、输出格式、偏移量
ffmpeg -video_size 1024x768 -framerate 25 -f x11grab 
-i :0.0+100,00 output.mp4

# 3. 全屏录制
ffmpeg -video_size 1920:1080 -framerate 25 -f x11grab 
-i :0.0+0,00 output.mp4
3.2.4.2 Windows

需要安装dshow软件(dshow最新目前只支持4.7版本,最新的6不行,但是在其configuration/vendor/ffmpegbin目录下有编译好的可以用)

查看可用设备的名字
ffmpeg -list_devices true -f dshow -i dummy
录制视频(默认参数)
桌面 ffmpeg -f dshow -i video="screen-capture-recoder" v-out.mp4
摄像头 ffmpeg -f dshow -i video="自己的摄像头名字" -y v-out2.flv
录制音频(默认参数)
系统声音 ffmpeg -f dshow -i audio="virtual-audio-capture" a-out.aac
系统+麦克风声音
ffmpeg -f dshow -i audio="麦克风(Realtek Audio)" -f dshow 
-i audio="virtual-audio-capture" -filter_complex
amix=inputs=2:duration=first:dropout_transition=2 a-out2.aac
同时录制声音和视频(默认参数)
ffmpeg -f dshow -i audio="麦克风 (Realtek Audio)" -f  dshow -i audio="virtual-audio-capturer"
 -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f dshow 
 -i video="screen-capture-recorder" -y av-out
查看视频录制的可选参数
ffmpeg -f dshow -list_options true -i video="screen-capture-recorder"
查看音频录制的可选参数
ffmpeg -f dshow -list_options true -i audio="virtual-audio-capture"
ffmpeg -f dshow -list_options true -i audio="麦克风(Realtek Audio)"
指定参数录制音视频
# 
ffmpeg -f dshow -i  audio="麦克风(Realtek Audio)" -f dshow -i audio="virtual-audio-capture"
-fliter_complex amix=inputs=2:duration=first:dropout_transition=2 -f dshow
-video_size 1920:1080 -framerate 15  -pixel_format yuv420p -i video="screen-capture-recorder"
-vcodec h264_qsv -b:v 3M -y a-out.flv
# 
ffmpeg -f dshow -i  audio="麦克风(Realtek Audio)" -f dshow -i audio="virtual-audio-capture"
-fliter_complex amix=inputs=2:duration=first:dropout_transition=2 -f dshow
 -i video="screen-capture-recorder" -vcodec h264_qsv -b:v 3M -r 15 -y av-out2.mp4
# 
ffmpeg -f dshow -i  audio="麦克风(Realtek Audio)" -f dshow -i audio="virtual-audio-capture"
-fliter_complex amix=inputs=2:duration=first:dropout_transition=2 -f dshow
 -framerate 15  -pixel_format yuv420p -i video="screen-capture-recorder"
-vcodec h264_qsv -b:v 3M  -r 15 -y a-out.flv

3.2.7 直播

ffmpeg拉流
直播拉流
ffplay rtmp://server/live/streamName
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv
# 对于不是rtmp的协议 -c copy谨慎使用
可用地址

ffmpeg推流
直播推流
ffmpeg -re -i out.mp4 -c copy flv rtmp://server/live/streamName
# -re表示按照时间戳读取文件

3.2.8 过滤器

3.2.8.1 filter分类
按照处理数据的类型,通常多媒体的filter分为:
音频filter
视频filter
字幕filter
另一种按照处理编解码器的位置划分
prefilters: used before encoding
intrafilters: used while encoding (and are thus an integral part of a video codec)
postfilters: used after decoding
FFmpeg 中 filter 分为:
source filter (只有输出)
audio filter
video filter
Multimedia filter
sink filter (只有输入)
除了 source 和 sink filter,其他 filter 都至少有一个输入、至少一个输出。
3.2.8.2 视频裁剪

将输入视频帧的宽度和高度从x和y值表示的位置裁剪到指定的宽度和高度;
x 和y是输出的左上角坐标,协调系统的中心是输入视频帧的左上角。
如果使用了可选的keep_aspect参数,将会改变输出SAR(样本宽比)以补偿新的DAR(显
示长宽比)
注:起点默认在中心

语法:crop=ow[:oh[:x[:y[:keep_aspect]]]]

ffmpeg -i input -vf crop=iw/3:ih:0:0 output  
ffmpeg -i input -vf crop=iw/3:ih:iw/3:0 output  
ffmpeg -i input -vf crop=iw/3:ih:iw/3*2:0 output 
# 裁剪掉左右10像素,上下20像素 
crop=in_w-2*10:in_h-2*20
#裁剪中心区域,大小为输入视频的2/3
crop=2/3*in_w:2/3*in_h 
3.2.8.3 滤镜Filter 内置变量
变量说明
t以秒表示的时间戳,如果输入的时间是未知的则是NAN
n输入帧的顺序编号,从0开始
pos输入帧的位置,如果未知的则是NAN
w输入视频帧的宽度
h输入视频帧的高度
3.2.8.4 添加水印
  • 文字水印
    在视频中增加文字水印需要准备的条件比较多,需要有文字字库处理的相关文件,在编译FFmpeg时需要
    支持FreeType、FontConfig、iconv,系统中需要有相关的字库,在FFmpeg中增加纯字母水印可以使用drawtext滤镜进行支持,下面就来看一下drawtext的滤镜参数
    在这里插入图片描述
练习

1.将文字的水印加在视频的左上角

ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':x=20:y=20" 
将字体的颜色设置为绿色: 
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green" 
如果想调整文字水印显示的位置,调整x与y参数的数值即可。 
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:x=400:y=200" 
修改透明度 
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:x=400:y=200:alpha=0.5" 

2.文字水印还可以增加一个框,然后给框加上背景颜色

ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:box=1:boxcolor=yellow"

3.有些时候文字水印希望以本地时间作为水印内容,可以在drawtext滤镜中配合一些特殊用法来
完成,在text中显示本地当前时间,格式为年月日时分秒的方式

ffplay  -i input.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='%{localtime\:%Y\-%m\-%d %H%M-%S}':fontcolor=green:box=1:boxcolor=yellow" 
#在使用ffmpeg转码存储到文件时需要加上-re,否则时间不对。 
ffmpeg -re -i input.mp4 -vf  "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':fontcolor=green:box=1:boxcolor=yellow" out.mp4 

4.在个别场景中,需要定时显示水印,定时不显示水印,这种方式同样可以配合drawtext滤镜进
行处理,使用drawtext与enable配合即可,例如每3秒钟显示一次文字水印:

ffplay -i input.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='test':fontcolor=green:box=1:boxcolor=yellow:enable=lt(mod(t\,3)\,1)"  
# 在使用ffmpeg转码存储到文件时需要加上-re,否则时间不对。
# 表达式参考:http://www.ffmpeg.org/ffmpeg-utils.html 3 Expression Evaluation
# lt(x, y)  Return 1 if x is lesser than y, 0 otherwise. 
# mod(x, y) Compute the remainder of division of x by y. 

5.跑马灯效果

ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='helloworld':x=mod(100*t\,w):y=abs(sin(t))*h*0.7" 
#修改字体透明度,修改字体颜色 
ffplay -i input.mp4 -vf "drawtext=fontsize=40:fontfile=FreeSerif.ttf:text='超winter':x=mod(50*t\,w):y=abs(sin(t))*h*0.7:alpha=0.5:fontcolor=white:enable=lt(mod(t\,3)\,1)" 
  • 图片水印
    为视频添加图片水印可以使用movie滤镜,下面就来熟悉一下movie滤镜的参数
    在这里插入图片描述
ffmpeg -i input -vf "movie=logo.png[watermark];[in][watermark]overlay=x=10:y=10[out]" output
# 原始视频文件路径:input.mp4
# 水印图片路径:logo.png
# 水印位置:(x,y)=(10,10)<=(left,top)距离左侧、顶部各10像素;
# 输出文件路径:output.mp4 

在FFmpeg 中加入图片水印有两种方式,一种是通过movie指定水印文件路径,另外一种方式是通过
filter 读取输入文件的流并指定为水印,这里重点介绍如何读取movie图片文件作为水印。

(1)图片logo.png将会打入到input.mp4视频中,显示在x坐标50、y坐标20的位置
ffplay -i input.mp4 -vf "movie=logo.png[logo];[in][logo]overlay=50:10[out]"

由于 logo.png 图片的背景色是白色,所以显示起来比较生硬,如果水印图片是透明背景的,效果会更好,
下面找一张透明背景色的图片试一下:
ffplay -i input.mp4 -vf "movie=logo2.png[watermark];[in][watermark]overlay=50:10[out]"

感觉这个方法也不错,可以使用 overlay 滤镜
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=W-w-10:H-h-10:alpha=0.5" output.mp4

(2) 显示位置

# 开始坐标(10,10)
ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=10:10[out]" 
# main_w既代表了帧宽度,也代表了右上角坐标 
# 开始坐标(main_w-overlay_w-10,10)
ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=main_w-overlay_w-10:10[out]" 
ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=10:main_h-overlay_h-10[out]" 
ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=main_w-overlay_w-10:main_hoverlay_h-10[out]" 

(3)跑马灯

ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*h*0.7[out]"
  • 画中画
    在使用FFmpeg处理流媒体文件时,有时需要使用画中画的效果。在FFmpeg中,可以通过overlay将
    多个视频流、多个多媒体采集设备、多个视频文件合并到一个界面中,生成画中画的效果。在前面的滤镜
    使用中,以至于以后的滤镜使用中,与视频操作相关的处理,大多数都会与overlay滤镜配合使用,尤其是
    用在图层处理与合并场景中,下面就来了解一下overlay的参数

    从参数列表中可以看到,主要参数并不多,但实际上在overlay滤镜使用中,还有很多组合的参数可以
    使用,可以使用一些内部变量,例如overlay图层的宽、高、坐标等。

(1)显示画中画效果

ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20[out]" 
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20:eof_action=1[out]" 
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20:shortest =1[out]" 

#缩放子画面尺寸 
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4,scale=640x480[sub];[in][sub]overlay=x=20:y=20[out]"

(2)跑马灯效果

ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[test];[in][test]overlay= x=mod(50*t\,main_w):y=abs(sin(t))*main_h*0.7[out]" 
  • 视频多宫格
    视频除了画中画显示,还有一种场景为以多宫格的方式呈现出来,除了可以输入视频文件,还可以输入视
    频流、采集设备等。从前文中可以看出进行视频图像处理时,overlay 滤镜为关键画布,可以通过FFmpeg建立一个画布,也可以使用默认的画布。如果想以多宫格的方式展现,则可以自己建立一个足够大的画布,
    下面就来看一下多宫格展示的例子:
ffmpeg -i 1.mp4 -i 2.mp4 -i  3.mp4 -i  4.mp4 -filter_complex "nullsrc=size=640x480[base];[0:v] setpts=PTS-STARTPTS,scale=320x240[upperleft];[1:v]setpts=PTS-STARTPTS,scale=320x240[upperright];[2:v]setpts=PTS-STARTPTS,scale=320x240[lowerleft];[3:v]setpts=PTS-STARTPTS,scale=320x240[lowerright];[base][upperleft]overlay=shortest=1[tmp1];[tmp1][upperright]overlay=shortest=1:x=320[tmp2];[tmp2][lowerleft]overlay=shortest=1:y=240[tmp3];[tmp3][lowerright]overlay=shortest=1:x=320:y=240" out.mp4

1.2.3.4.mp4 为文件路径,out.MP4 为输出文件路径,通过nullsrc创建overlay画布,画布大小640:480,
使用[0:v][1:v][2:v][3:v]将输入的 4 个视频流去除,分别进行缩放处理,然后基于 nullsrc 生成的画布进行视
频平铺,命令中自定义upperleft,upperright,lowerleft,lowerright 进行不同位置平铺。
在这里插入图片描述
只叠加左上右上的命令:

ffmpeg -i 1.mp4 -i 2.mp4 -i  3.mp4 -i  4.mp4 -filter_complex "nullsrc=size=640x480[base];[0:v]setpts=PTS-STARTPTS,scale=320x240[upperleft];[1:v]setpts=PTS-STARTPTS,scale=320x240[upperright];[base][upperleft]overlay=shortest=1[tmp1];[tmp1][upperright]overlay=shortest=1:x=320" out2.mp4
  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值