音视频面经_音视频知识解析:第二章 FFmpeg命令详解
本专栏会持续更新优质内容,敬请订阅,关注更新。
专栏地址:音视频面经_音视频知识解析
------------下面正文开始-------------
1 前言
FFMPEG(Fast Forward Moving Picture Experts Group)是一个多功能的开源多媒体框架,它提供了丰富的多媒体处理工具,包括视频和音频的转码、格式转换、混合、裁剪以及其他各种处理任务。
FFMPEG的核心组件是libavcodec、libavformat、libavfilter、libavdevice、libavutil、libswscale、libswresample和libavfilter等库。这些库支持广泛的音视频格式、编码器、解码器、过滤器以及设备驱动。
FFMPEG支持从大多数标准格式中读写数据,并能根据需求进行格式转换。它还支持各种协议,如HTTP、RTMP、FTP等,用于获取和发送音视频数据。
使用广泛
▫ 使用FFmpeg作为内核的视频播放器
Mplayer,射手播放器,暴风影音,KMPlayer,QQ影音...
▫ 使用FFmpeg作为内核的转码器
格式工厂,狸窝视频转换器,暴风转码...
▫ 总而言之,FFmpeg是视频行业中的“瑞士军刀”
• 特点
▫ 基于命令行
FFmpeg界面不太人性化,操作相对复杂,但是也更加灵活。
▫ 开源
可以吸引全世界优秀的开发者加入其中进行开发。
2 FFmpeg命令行工具获取
2.1 系统环境
我这里使用的Windows 11 64位
2.2下载FFmpeg
下载页面 : https://github.com/BtbN/FFmpeg-Builds/releases
这里,我们下载ffmpeg-n4.4-latest-win64-gpl-4.4.zip
解压ffmpeg-n4.4-latest-win64-gpl-4.4.zip后可以看到
bin目录里包含了FFmpeg.exe、ffplay.exe、ffprobe.exe,它们的用途分别是:
● FFmpeg.exe:这是FFmpeg框架的核心组件,用于执行各种多媒体处理任务。它可以用来转码视频和音频、格式转换、混合、裁剪以及其他处理工作。FFmpeg支持广泛的音视频格式、编码器、解码器和过滤器。
● ffplay.exe:这是一个基于FFmpeg库的轻量级多媒体播放器,它能够播放多种格式的视频和音频文件。ffplay提供了用户界面,允许用户进行播放、暂停、快进、快退等基本操作。
● ffprobe.exe:这个工具用于分析多媒体文件,并提供关于文件内容的详细信息。它可以展示音视频流的参数、编码信息等,帮助用户了解媒体文件的结构和特性。
doc目录里是FFmpeg相关的文档
3 FFmpeg命令行工具使用
打开window终端,进入解压后的FFmpeg的bin目录,命令行中输入ffmpeg.exe,查看弹出的信息
3.1 ffmpeg.exe的使用
3.1.1 命令格式
▫ 最简单的命令
ffmpeg -i input.avi -b:v 640k output.ts
该命令将当前文件夹下的input.avi文件转换为output.ts文件,并将
output.ts文件视频的码率设置为640kbps。
▫ 命令格式
ffmpeg -i {输入文件路径} -b:v {输出视频码率} {输出文件路径}
所有的参数都是以键值对的形式指定的。例如输入文件参数是“
-i”,
而参数值是文件路径;输出视频码率参数是“
-b:v”,而参数值是视频的
码率值。但是注意位于最后面的输出文件路径前面不包含参数名称。
3.1.2 命令参数
PS:详细的参数可以访问http://ffmpeg.org/ffmpeg.html
也可以在命令行中,用ffmpeg.exe --help查看
3.1.3 使用示例
3.1.3.1 查看基本信息
Print help / information / capabilities:
-L show license
-h <topic> show help
-version show version
-muxers show available muxers
-demuxers show available demuxers
-devices show available devices
-decoders show available decoders
-encoders show available encoders
-filters show available filters
-pix_fmts show available pixel formats
-layouts show standard channel layouts
-sample_fmts show available audio sample formats
ffmpeg -formats 显示可用的容器格式(demux / mux)
ffmpeg -codecs显示可用的编解码器 (eg.DEV.LS,D表示decoder,E 表示 encoder,V 表示 video)
ffmpeg -pix_fmts
ffmpeg -i sintel.ts查看一个文件的信息
● 基本信息 ffmpeg -h
● 高级信息 ffmpeg -h long m
● 所有信息 ffmpeg -h full ffplay -h
● 搜索指定内容 ffmpeg -h full | findstr 264
● 分页查找 ffmpeg -h full | more
● 指定查找 ffmpeg -encoders | findstr 265
● 查找指定属性的内容 ffmpeg -h encoder=libx264
3.1.3.2. 剪辑多媒体文件
● 按时间裁剪指定长度
ffmpeg -i .\testvideo1.mp4 -ss 00:00:10 -t 00:00:20 -codec copy testvideo1_out.mp4
● 提取音频或视频
提取音频
ffmpeg -i .\testvideo1.mp4 -acodec copy -vn testvideo1_out.aac
保留封装格式 提取视频
ffmpeg -i .\testvideo1.mp4 -acodec copy -an testvideo1_out.mp4
3.1.3.3. yuv相关
● mp4 转 yuv
ffmpeg -ss 00:00:30 -t 10 -i testvideo1.mp4 -pix_fmt yuv420p -s 640x480 testvideo1_yuv420p_640x480.yuv
● 播放yuv
ffplay -pixel_format yuv420p -video_size 640x480 -framerate 25 .\testvideo1_yuv420p_640x480.yuv
3.1.3.4. rgb相关
● mp4 转 rgb
ffmpeg -ss 00:00:30 -t 10 -i testvideo1.mp4 -pix_fmt rgb24 -s 640x480 testvideo1_rgb24_640x480.rgb
● 播放rgb
ffplay -pixel_format rgb24 -video_size 640x480 -framerate 25 .\testvideo1_rgb24_640x480.rgb
3.1.3.5. YUV 转 RGB
ffmpeg -s 640x480 -pix_fmt yuv420p -i testvideo1_yuv420p_640x480.yuv -pix_fmt rgb24 -s 320x240 testvideo1_rgb24_320x240.rgb
3.1.3.6. pcm 相关
参数解释
-f s32le PCM signed 32-bit little-endian samples
-ac 2 2 channel
-ar 48000 sample rate 48000Hz
● mp3 转 pcm
`ffmpeg -i testvideo1_48000_129_2.mp3 -ar 48000 -ac 2 -f f32le testvideo1_48000_129_2.pcm`
● mp4 转 pcm
ffmpeg -ss 00:00:30 -t 10 -i testvideo1.mp4 -ar 48000 -ac 2 -f f32le testvideo1_48000_2_f32le.pcm
● 播放 pcm
ffplay -ar 48000 -ac 2 -f f32le testvideo1_48000_2_f32le.pcm
3.1.3.7. 转封装格式
● 保持编码格式
ffmpeg -i .\testvideo3.mp4 -vcodec copy -acodec copy testvideo3.ts
ffmpeg -i .\testvideo3.mp4 -codec copy testvideo3_2.ts
● 改变编码格式
ffmpeg -i .\testvideo3.mp4 -vcodec libx265 -acodec libmp3lame testvideo3_h265_mp3.mkv
● 修改帧率
ffmpeg -i .\testvideo3.mp4 -r 15 testvideo3_r15.mp4
● 修改视频码率
ffmpeg -i .\testvideo3.mp4 -b:v 400k testvideo3_400k.mp4
ffmpeg -i .\testvideo3.mp4 -b 400k testvideo3_400k_b.mkv(此时音频也被重新编码)
● 修改音频码率
如果不想重新编码video 需要加上 -vcodec copy
ffmpeg -i .\testvideo3.mp4 -b:a 192k testvideo3_ba_192k.mp4
● 修改视频分辨率
ffmpeg -i .\testvideo3.mp4 -s 640x320 testvideo3_640x320.mp4
● 修改音频采样率
ffmpeg -i .\testvideo3.mp4 -ar 48000 testvideo3_48000hz.mp4
3.1.3.8 使用map
将abc.ts和def.ts合成一路out.ts,并对其中的码流做转码处理:
ffmpeg -i abc.ts -i def.ts
-map 0:0 //#0输入的stream0(abc的video),-map 0:v可以指代所有video stream
-map 0:1 //#0输入的stream1(abc的第一路audio),-map 0:a可以指代所有audio stream
-map 0:1 //#0输入的stream1(abc的第一路audio,第二路audio被丢弃)
-map 1:0 //#1输入的stream0(def的stream0)
-map 1:1 //#1输入的stream1(def的stream1)
-c copy //对所有码流默认做copy处理
-c:v libx264 //对所有video码流默认编码为h264
-c:a:0 libmp3lame -b:a:0 128k //特定于第0个audio,编码为mp3(128kbps)
-c:a:1 libfaac -b:a:1 96k //特定于第1个audio,编码为aac(96kbps)
-c:v:1 mpeg2video //特定于第1个video,编码为mp2
out.ts //out.ts中流的顺序会和map顺序一致
//结合滤镜,map指定滤镜输出,作为输出stream:
ffmpeg -i abc.mp4
-filter_complex "[0:0] scale=100x100[smaller_sized]" -map "[smaller_sized]"
out.mp4
//创建具有多个program的ts流:
ffmpeg -i abc.ts -i def.ts
-map 0:0 -map 0:1 -map 1:0 -map 0:2 //分别是st0,st1,st2,st3
-c copy
-program title=pro001:program_num=1:st=0:st=1
-program title=pro002:program_num=2:st=2:st=3
-f mpegts two_program.ts
3.1.3.9. 视频裁剪合并
● 如果音视频格式不统一,则先统一格式
ffmpeg -i .\testvideo1.mp4 -ss 30 -t 10 -vcodec libx264 -acodec aac clip_1.mp4
ffmpeg -i .\testvideo2.mp4 -ss 30 -t 10 -vcodec libx264 -acodec aac clip_2.mp4
ffmpeg -i .\testvideo3.mp4 -ss 30 -t 10 -vcodec libx264 -acodec aac clip_3.mp4
● 将统一格式后的文件转成ts格式(-vbsf 提高兼容性)
ffmpeg -i .\clip_1.mp4 -codec copy -vbsf h264_mp4toannexb clip_1.ts
ffmpeg -i .\clip_2.mp4 -codec copy -vbsf h264_mp4toannexb clip_2.ts
ffmpeg -i .\clip_3.mp4 -codec copy -vbsf h264_mp4toannexb clip_3.ts
● mp4 转 flv
ffmpeg -i .\clip_1.mp4 -codec copy clip_1.flv
ffmpeg -i .\clip_2.mp4 -codec copy clip_2.flv
ffmpeg -i .\clip_3.mp4 -codec copy clip_3.flv
● 拼接
● 以mp4格式拼接
○ 方法一: ffmpeg -i "concat:clip_1.mp4|clip_2.mp4|clip_3.mp4" -codec copy out_mp4_1.mp4 (失败)
○ 方法二: ffmpeg -f concat -i .\clip_mp4.txt -codec copy out_mp4_2.mp4 (成功)
● 以flv格式拼接
○ 方法一: ffmpeg -i "concat:clip_1.flv|clip_2.flv|clip_3.flv" -codec copy out_flv_1.mp4 (失败)
○ 方法二: ffmpeg -f concat -i .\clip_flv.txt -codec copy out_flv_2.mp4 (成功)
● 以ts格式拼接
○ 方法一: ffmpeg -i "concat:clip_1.ts|clip_2.ts|clip_3.ts" -codec copy out_ts_1.mp4 (成功)
○ 方法二: ffmpeg -f concat -i .\clip_ts.txt -codec copy out_ts_2.mp4 (成功)
注意:
1. 建议使用方法二进行拼接
2. 转成ts格式进行拼接
3. 视频分辨率可以不同,但是(视频、音频)编码格式需要统一
3.1.3.10. 图片和视频相互转换
● 截取一张图
ffmpeg -i .\clip_2.mp4 -y -f image2 -ss 5 -vframes 1 -s 640x360 clip_2.bmp
ffmpeg -i .\clip_2.mp4 -y -f image2 -ss 5 -vframes 1 -s 640x360 clip_2.jpg
● 截图多张图
ffmpeg -i .\clip_2.mp4 -ss 5 -r 15 -s 640x360 clip_2_%02d.jpg
● 多图转视频
ffmpeg -i clip_2_%02d.jpg -r 25 iamge_to_video.mp4
● 视频转gif
ffmpeg -i .\clip_2.mp4 -ss 5 -r 1 -s 640x360 clip_2_1.gif
ffmpeg -i .\clip_2.mp4 -ss 5 -r 25 -s 640x360 clip_2_25.gif
● gif转视频
ffmpeg -f gif -i clip_2_25.gif gif_to_video.mp4
3.1.3.11. 录制
安装dshow
查看设备名字
ffmpeg -list_devices true -f dshow -i dummy
● 录制视频
使用 dshow 下边的ffmpegC:\Program Files (x86)\Screen Capturer Recorder\configuration_setup_utility\vendor\ffmpeg\bin(新版本ffmpeg 不支持)
● 录制桌面
.\ffmpeg.exe -f dshow -i video="screen-capture-recorder" record_desktop.mp4
生成的文件在C:\Users\wangkun\AppData\Local\VirtualStore\Program Files (x86)\Screen Capturer Recorder\configuration_setup_utility\vendor\ffmpeg\bin
● 录制摄像头
.\ffmpeg.exe -f dshow -i video="HD Camera" record_camera.mp4
● 录制声音
○ 系统声音
.\ffmpeg.exe -f dshow -i audio="virtual-audio-capturer" record_system.aac
● 系统+麦克风声音
.\ffmpeg.exe -f dshow -i audio="virtual-audio-capturer" -f dshow -i audio=" " -filter_complex amix=inputs=2:duration=first:dropout_transition=2 record_system_realtek.aac
● 同时录制视频和声音
.\ffmpeg.exe -f dshow -i audio="virtual-audio-capturer" -f dshow -i audio="麦克风 (Earbuds X3)" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f dshow -i video="screen-capture-recorder" record_system_realtek_screencapture.mp4
● 查看音视频录制的可选参数
./ffmpeg.exe -f dshow -list_options true -i video="screen-capture-recorder"
./ffmpeg.exe -f dshow -list_options true -i audio="麦克风 (Earbuds X3)"
● 指定参数录制音视频
.\ffmpeg.exe -f dshow -i audio="virtual-audio-capturer" -f dshow -i audio="麦克风 (Earbuds X3)" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f dshow -video_size 1920x1080 -framerate 15 -i video="screen-capture-recorder" -vcodec libx264 -b:v 3M record_system_realtek_screencapture_custom_param.mp4
3.1.3.13. 拉流
● 播放
ffplay rtmp://la.sinsam.com/v/sinsam_h264
● 下载
ffmpeg -i rtmp://la.sinsam.com/v/sinsam_h264 -codec copy dump.flv
对于不是rtmp的协议 -codec copy 需要谨慎使用,不写会自动转码
3.1.3.14. 裁剪
● 输出到文件
ffmpeg -i .\image.jpg -vf crop=iw/3:ih:0:0 out1.jpg
ffmpeg -i .\image.jpg -vf crop=iw/3:ih:iw/3:0 out2.jpg
● ffplay直接查看输出效果
ffplay -i .\image.jpg -vf crop=iw/3:ih:iw/3:0
● 视频
ffmpeg -i .\video.mp4 -vf crop=iw/3:ih:iw/3:0 out.mp4
ffplay -i .\video.mp4 -vf crop=iw/3:ih:iw/3:0
3.2 ffplay.exe的使用
3.2.1命令格式
▫ 最简单的命令
ffplay input.avi
该命令将播放当前文件夹下的input.avi文件。
▫ 命令格式
ffplay {输入文件路径}
ffplay.exe的参数格式和ffmpeg.exe是类似的。所有的参数都是以键值
对的形式指定的(由于不包含输出文件,所以只能指定输入参数)。注意
位于最后面的输入文件路径前面不包含参数名称。
• 快捷键
PS:详细的参数可以访问http://ffmpeg.org/ffplay.html
ffplay 主要选项
1. -x width
指定显示宽度
2. -y height
指定显示高度
3. -fs
全屏模式
4. -an
不显示音频
5. -vn
不显示视频
6. -sn
不显示字幕
7. -ss pos
Seek 位置
8. -t duration
播放的时间长度
9. -bytes
按字节seek
10. -seek_interval
设置使用左/右键seek的自定义时间间隔(以秒为单位)默认值为10秒
11. -nodisp
禁用图形显示
12. -noborder
窗口无边框
13. -alwaysontop
窗口总是在最上边 适用于: X11 with SDL >= 2.0.5, Windows SDL >= 2.0.6.
14. -volume
设置启动音量。0表示静音,最大100
15. -f fmt
指定格式
16. -window_title title
设置窗口名称 默认显示流名称
17. -left title
设置窗口x位置 默认居中
18. -top title
设置窗口y位置 默认居中
19. -loop number
循环播放次数 0表示不循环
20. -showmode mode
设置显示模式:
‘0, video’ 显示视频
‘1, waves’显示音频波形图
‘2, rdft’
使用RDFT((逆)实离散傅立叶变换)显示音频频带
默认值为“视频”,如果视频不存在或无法播放,则自动选择“rdft”。
通过按w键,可以交互式地循环使用可用的显示模式。
21. -vf filtergraph
过滤视频流
22. -af filtergraph
过滤音频流
23. -i input_url
输入源
24. -stats
打印几个播放统计信息,特别是显示流持续时间、编解码器参数、流中的当前位置以及音频/视频同步漂移。除非日志级别低于信息,否则默认情况下会显示它。可以通过手动指定此选项来强制显示。要禁用它,您需要指定-nostats。
25. -fast
不符合规范的优化
26. -genpts
生成 pts.
27. -sync type
将主时钟设置为音频(类型=音频)、视频(类型=视频)或外部(类型=文本)。默认为音频。主时钟用于控制音频-视频同步。大多数媒体播放器使用音频作为主时钟,但在某些情况下(流媒体或高质量广播)有必要改变这一点。此选项主要用于调试目的
28. -ast audio_stream_specifier
使用给定的流说明符选择所需的音频流。流说明符在流说明符一章中进行了描述。如果未指定此选项,则在已选择的视频流的程序中选择“最佳”音频流。
29. -vst video_stream_specifier
使用给定的流说明符选择所需的视频流。流说明符在流说明符一章中进行了描述。如果未指定此选项,则会选择“最佳”视频流。
30. -sst subtitle_stream_specifier
使用给定的流说明符选择所需的字幕流。流说明符在流说明符一章中进行了描述。如果未指定此选项,则在已选择的视频或音频流的节目中选择“最佳”字幕流。
31. -autoexit
视频播放完之后自动退出
32. -exitonkeydown
按任意键退出
33. -exitonmousedown
如果按下任何鼠标按钮,则退出
34. -codec:media_specifier codec_name
为media_specifier标识的流强制执行特定的解码器实现,该解码器可以采用值a(音频)、v(视频)和s字幕
35. -acodec codec_name
指定音频编码器
36. -vcodec codec_name
指定视频编码器
37. -scodec codec_name
指定字幕编码器
38. -autorotate
根据文件元数据自动旋转视频。默认情况下已启用,使用-nautorotate将其禁用
39. -framedrop
如果视频不同步,则丢弃视频帧。如果主时钟未设置为视频,则默认启用。使用此选项可以为所有主时钟源启用帧丢弃,使用-noframedrop可以禁用它
40. -infbuf
不要限制输入缓冲区的大小,尽快从输入中读取尽可能多的数据。默认情况下为实时流启用,如果不及时读取,数据可能会被丢弃。使用此选项可以为所有输入启用无限缓冲区,使用-noinfbuf可以禁用它
41. -filter_threads nb_threads
定义用于处理筛选器管道的线程数。每个管道将产生一个线程池,其中有这么多线程可用于并行处理。默认值为0,这意味着线程计数将由可用CPU的数量决定
42. -enable_vulkan
使用vulkan渲染器,而不是SDL内置的渲染器。取决于libplacebo
43. -vulkan_params
使用由“:”分隔的键=值对列表的Vulkan配置
44. -hwaccel
使用硬件加速解码。启用此选项将自动启用vulkan渲染器
3.2.3 使用示例
3.2.3.1. 播放文件
● 播放本地视频
ffplay .\testvideo1.mp4
● 播放网络视频
ffplay rtmp://ns8.indexforce.com/home/mystream
3.2.3.2.ffplay简单过滤器
● 视频旋转 ffplay -i .\testvideo1.mp4 -vf transpose=1
● 视频翻转
○ 垂直翻转 ffplay -i .\testvideo1.mp4 -vf vflip
○ 水平翻转 ffplay -i .\testvideo1.mp4 -vf hflip
● 视频旋转和翻转
ffplay -i .\testvideo1.mp4 -vf transpose=1,hflip
● 视频变速
ffplay -i .\testvideo1.mp4 -vf setpts=PTS/22倍速
● 音频变速
ffplay -i .\testvideo1.mp4 -af atempo=22倍速
● 视频音频同时变速
ffplay -i .\testvideo1.mp4 -af atempo=2 -vf setpts=PTS/22倍速
3.2.3.3. 水印
1. 文字水印
● drawtext 参数列表
参数 | 类型 | 说明 |
text | 字符串 | 文字 |
textfile | 字符串 | 文字文件 |
box | 布尔 | 文字区域背景框 |
boxcolor | 色彩 | 文字区域背景框颜色 |
font | 字符串 | 字体名称 默认为Sans字体 |
fontsize | 整数 | 字体大小 |
x | 数字 | 文字位置默认为0 |
y | 数字 | 文字位置默认为0 |
alpha | 浮点数 | 透明度 0-1之间 |
fontfile | 字符串 | 字体文件路径 |
● 查看效果
ffplay -i .\video.mp4 -vf "drawtext=text='hello':box=true:boxcolor=red:fontfile=C\\:/Windows/fonts/simhei.ttf:fontcolor=yellow:fontsize=100:x=50:y=100:alpha=0.5"
● 直接输出文件
ffmpeg -i .\video.mp4 -vf "drawtext=text='hello':box=true:boxcolor=red:fontfile=C\\:/Windows/fonts/simhei.ttf:fontcolor=yellow:fontsize=100:x=50:y=100:alpha=0.5" video_drawtext.mp4
● 水印内容显示本地时间
ffplay -i .\video.mp4 -vf "drawtext=text='%{localtime\:%Y\-%m\-%d %H_%M_%S}':box=true:boxcolor=red:fontfile=C\\:/Windows/fonts/simhei.ttf:fontcolor=yellow:fontsize=100:x=50:y=100:alpha=0.5"
显示本地时间存储到文件时,需要加上-re 否则时间不对
ffmpeg -re -i .\video.mp4 -vf "drawtext=text='%{localtime\:%Y\-%m\-%d %H_%M_%S}':box=true:boxcolor=red:fontfile=C\\:/Windows/fonts/simhei.ttf:fontcolor=yellow:fontsize=100:x=50:y=100:alpha=0.5" video_drawtext_localtime.mp4
● 定时显示水印
3秒显示一次
lt(x,y) x<y ? 1:0
ffplay -i .\video.mp4 -vf "drawtext=text='hello':box=true:boxcolor=red:fontfile=C\\:/Windows/fonts/simhei.ttf:fontcolor=yellow:fontsize=100:x=50:y=100:alpha=0.5:enable=lt(mod(t\,3)\,1)"
● 跑马灯效果
ffplay -i .\video.mp4 -vf "drawtext=text='hello':box=true:boxcolor=red:fontfile=C\\:/Windows/fonts/simhei.ttf:fontcolor=yellow:fontsize=100:x=mod(100*t\,w):y=abs(sin(t)*h*0.7):alpha=0.5"
1. 图片水印
● movie 参数列表
参数 | 类型 | 说明 |
filename | 字符串 | 输入的文件名(文件、协议、设备) |
format_name,f | 字符串 | 输入的封装格式 |
stream_index,si | 整数 | 输入的流索引编号 |
seek_point,sp | 浮点数 | seek输入流的时间位置 |
streams,s | 字符串 | 输入多个流的流信息 |
loop | 整数 | 循环次数 |
discontinuity | 时间差值 | 支持跳动的时间戳差值 |
● 水印在左上角
ffplay -i .\video.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=x=20:y=20[out]"
● 水印在右下角
ffplay -i .\video.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=x=main_w-overlay_w-10:y=main_h-overlay_h-10[out]"
main_w 视频单帧宽
main_h 视频单帧高
overlay_w 水印图片宽
overlay_h 水印图片高
● 水印跑马灯
ffplay -i .\video.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=x=mod(100*t\,main_w):y=abs(sin(t)*h*0.7)[out]"
ffplay -i .\video.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=x=mod(100*t\,w):y=abs(sin(t)*h*0.7)[out]"
ffmpeg -i .\video.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=x=mod(100*t\,main_w):y=abs(sin(t)*h*0.7)[out]" video_movie.mp4
3.2.3.4. 画中画
● overlay 参数列表
参数 | 类型 | 说明 |
x | 整数 | x坐标 |
y | 整数 | y坐标 |
eof_action | 整数 | 遇到eof表示时的处理方式,默认为重复 ● repeat(0):重复前一帧 ● endcall(1):停止所有流 ● pass(2):保留主图层 |
shortest | 布尔 | 终止最短的视频时全部终止(默认 false) |
format | 整数 | 设置output的像素格式,默认为yuv420p ● yuv420(0) ● yuv422(1) ● yuv444(2) ● rgb(3) |
ffplay -i .\video.mp4 -vf "movie=video.mp4,scale=400x300[subvideo];[in][subvideo]overlay=x=mod(100*t\,main_w):y=abs(sin(t)*h*0.7):eof_action=2[out]"
3.3 ffprobe.exe的使用
3.3.1 介绍
ffprobe是FFmpeg项目中的一个命令行工具,用于分析多媒体数据(音频、视频、字幕等)。它可以读取一个多媒体文件,并输出其编码信息、格式信息、帧信息、包信息等。这些信息对于音视频处理、流媒体传输、内容分析等场景都非常重要。
3.3.2 ffprobe基本使用方法
ffprobe的基本语法如下:
ffprobe [options] [input_file]
其中,[options]是可选的参数,用于指定输出格式、选择输出字段等;[input_file]是要分析的多媒体文件路径。
例如,要获取一个MP4文件的基本信息,可以使用以下命令:
ffprobe input.mp4
执行该命令后,ffprobe会输出文件的格式、编解码器、时长、比特率等基本信息。
3.3.3 常用选项介绍
-show_streams:显示流信息,包括编解码器、分辨率、帧率等。
ffprobe -show_streams input.mp4
-show_format:显示格式信息,包括封装格式、时长、比特率等。
ffprobe -show_format input.mp4
-print_format json:以JSON格式输出信息,便于解析和处理。
ffprobe -show_streams -print_format json input.mp4
-select_streams:选择特定的流进行分析。例如,只分析视频流:
ffprobe -select_streams v:0 -show_streams input.mp4
-loglevel:设置日志级别,用于控制输出信息的详细程度。常用的级别有quiet、panic、fatal、error、warning、info、verbose、debug等。
3.3.4 ffprobe高级用法
1.指定输出具体字段
有时,我们可能只对文件的某些特定字段感兴趣,而不是输出所有信息。这时,可以使用-show_entries选项来指定要输出的字段。例如,如果我们只想查看视频流的编码器和帧率,可以这样做:
ffprobe -v error -show_entries stream=codec_name,r_frame_rate -of default=noprint_wrappers=1:nokey=1 input.mp4
这个命令会输出类似以下的结果:
stream
codec_name=h264
r_frame_rate=30/1
这里,-v error用于减少不必要的输出,只显示错误信息;-show_entries stream=codec_name,r_frame_rate指定了我们要查看的字段;-of default=noprint_wrappers=1:nokey=1则用于简化输出格式,只显示字段的值。
2.以特定格式输出信息
除了默认的文本格式外,ffprobe还支持以其他格式输出信息,如JSON、CSV等。这对于后续的数据处理和分析非常有用。例如,以下命令将输出文件的流信息为JSON格式:
ffprobe -v error -show_streams -print_format json input.mp4
执行这个命令后,你会得到一个完整的JSON对象,其中包含了文件的所有流信息。你可以使用任何支持JSON的编程语言或工具来解析和处理这些数据。
3.筛选特定的流
如果一个多媒体文件包含多个音频流或视频流,我们可能只对其中一个感兴趣。这时,可以使用-select_streams选项来筛选特定的流。例如,以下命令只显示第一个视频流的信息:
ffprobe -v error -select_streams v:0 -show_streams input.mp4
这里,v:0表示选择第一个视频流(在FFmpeg中,视频流的类型标识为v)。同样,你也可以使用a:0来选择第一个音频流。
4.分析网络流
除了本地文件外,ffprobe还可以分析网络流。这对于实时媒体处理或流媒体分析非常有用。例如,你可以使用以下命令来分析一个RTMP流的格式和编码信息:
ffprobe -v error -i rtmp://server/live/stream -show_format -show_streams
这里,-i选项用于指定输入流(在这个例子中是RTMP流),然后结合-show_format和-show_streams来显示格式和流信息。
5.查看视频流的宽度和高度
ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of default=noprint_wrappers=1:nokey=1 input.mp4
说明:这个命令会显示输入文件input.mp4中第一个视频流的宽度和高度。
6.获取音频流的采样率
ffprobe -v error -select_streams a:0 -show_entries stream=sample_rate -of default=noprint_wrappers=1:nokey=1 audio.mp3
说明:此命令会返回audio.mp3文件中第一个音频流的采样率。
7.以CSV格式输出所有流的编码信息
ffprobe -v error -show_streams -print_format csv=p=0 input.mkv
说明:这个命令会将input.mkv文件中所有流的信息以CSV格式输出,其中p=0表示不打印行号。
8.查找特定编解码器的流
ffprobe -v error -show_streams -f lavf -i input.flv -select_streams 'codec_name=h264'
说明:该命令会查找input.flv文件中所有使用H.264编解码器的流。
9.获取文件的总比特率
ffprobe -v error -select_streams v+a -show_entries format=bit_rate -of default=noprint_wrappers=1:nokey=1 input.ts
说明:此命令会返回input.ts文件中所有视频流和音频流的总比特率。
10.获取文件的播放时长
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mov
说明:这个命令会返回input.mov文件的播放时长(以秒为单位)。
11.检查文件是否包含特定字幕流
ffprobe -v error -show_streams -select_streams s -count_frames -of default=noprint_wrappers=1:nokey=1 input.mp4 2>&1 | grep -q "stream" if [ $? -eq 0 ]; then echo "文件包含字幕流" else echo "文件不包含字幕流" fi
说明:这个脚本会检查input.mp4文件是否包含字幕流,并打印相应的信息。
12.分析网络直播流的帧率
ffprobe -v error -i rtmp://server/live/stream -select_streams v -show_entries stream=r_frame_rate -of default=noprint_wrappers=1:nokey=1
说明:此命令会返回RTMP直播流中视频流的帧率。
13.以JSON格式输出文件的元数据
ffprobe -v error -print_format json -show_format input.webm
说明:这个命令会以JSON格式输出input.webm文件的元数据,包括封装格式、时长等信息。
14.查找特定标签的元数据项
ffprobe -v error -show_entries format_tags=encoder -of default=noprint_wrappers=1:nokey=1 input.avi
说明:这个命令会查找input.avi文件的格式标签中名为encoder的项,并返回其值。
15.查找并显示文件的封面图片
ffprobe -v error -select_streams v:0 -show_entries stream=tags=title,comment -of default=noprint_wrappers=1:nokey=1 video.mp4
说明:有些多媒体文件会包含封面图片,通常作为视频流的元数据标签存在。这个命令用于查找视频流(v:0表示第一个视频流)中的title和comment标签,这些标签可能包含封面图片的信息。如果封面图片是以某种形式编码在这些标签中,那么这条命令将帮助你找到它。然而,请注意,封面图片通常不会直接以这种方式嵌入,而是作为文件的一个单独流存在。要提取封面图片,你可能需要使用ffmpeg的-map_metadata选项或其他专门的工具。
16.分析多媒体文件的章节信息
ffprobe -v error -show_chapters -print_format json input.mkv
说明:MKV(Matroska)是一种常用的多媒体容器格式,它支持章节功能,允许将视频分割成多个逻辑部分。这个命令会以JSON格式输出input.mkv文件中所有的章节信息,包括每个章节的起始时间、结束时间、标题等。这对于需要处理或分析多媒体文件章节结构的应用场景非常有用,比如制作视频索引或编辑特定章节的内容。
五、注意事项
在使用ffprobe时,需要注意以下几点:
确保已经正确安装了FFmpeg,并且ffprobe命令可用。
对于大文件或网络流,ffprobe可能需要一定的时间来分析数据。请耐心等待或根据需要调整日志级别和输出内容。
ffprobe的输出可能包含大量信息,建议结合实际需求进行筛选和解析。可以使用文本处理工具(如grep、awk等)或编程语言(如Python、Shell等)对输出进行进一步处理。
4 window环境下搭建RTSP视频推流服务器
1. 环境与配置
1.1 系统环境
我这里使用的Windows 11 64位
1.2 下载RTSP服务器
下载页面 : https://github.com/aler9/rtsp-simple-server/releases
这里,我们下载rtsp-simple-server_v0.19.1_windows_amd64.zip
1.3 下载FFmpeg
下载页面 : https://github.com/BtbN/FFmpeg-Builds/releases
这里,我们下载ffmpeg-n4.4-latest-win64-gpl-4.4.zip
1.4 获取一个视频文件
可以是自己用手机录一段视频,导入到电脑上。
或者从网上下载一段视频文件。
1.5 解压到同一个文件夹下
将rtsp-simple-server_v0.19.1_windows_amd64.zip、ffmpeg-n4.4-latest-win64-gpl-4.4.zip解压到同一文件夹下。
同时,将视频文件也放入该文件夹下。
2. 启动服务器,进行推流
2.1 使用命令行,运行rtsp-simple-server.exe
我们打开CMD,进入该文件夹目录下,执行rtsp-simple-server.exe
看到[RTSP] listener opened on :8554 (TCP),就说明rtsp服务器启动成功了
还有rtmp、hls之类,有兴趣可以研究下
2.2 使用ffmpeg 执行推流
我们打开一个新的CMD窗口,进入文件夹目录下,执行如下命令,注意:这里的视频文件名需要改成你自己的视频文件名
ffmpeg -re -stream_loop -1 -i 你视频的文件名 -c copy -f rtsp rtsp://127.0.0.1:8554/video
参数说明-re是以流的方式读取 -stream_loop -1 表示无限循环读取 -i 就是输入的文件 -f 格式化输出到哪里
执行完毕后,如下所示
2.3 打开VLC media Palyer
打开VLC media Palyer,这个是win10自带的播放器,选择媒体->打开网络串流
也可以使用迅雷影音,也能播放rtsp流
输入rtsp://127.0.0.1:8554/video
点击播放,就可以看到视频在播放了
5练习
• 使用ffmpeg.exe将测试文件转换成如下格式
▫ MKV文件,起始时间为第10s, 持续时间为10s。
▫ MP4文件,视频编码器为libx264,音频编码器为libmp3lame。
▫ AVI文件,分辨率为640x360,帧率为25fps,视频码率为600kbps,
音频码率为64kbps。
▫ FLV文件,视频编码器为libx264,音频编码器为libmp3lame,音频
采样率为44100Hz。
▫ YUV420P格式像素数据,分辨率为640x360。
▫ H.264码流文件,分辨率为640x360。
▫ WAVE格式音频采样数据。
▫ MP3码流文件。
• 使用ffplay.exe播放测试文件,并练习各种快捷键
6 参考
1. ffmpeg 命令行详解
3. 雷霄骅-(2) FFmpeg命令行工具的使用.pdf
本专栏会持续更新优质内容,敬请订阅,关注更新。
专栏地址:音视频面经_音视频知识解析
点赞、订阅后,可在评论区留言领取资料和源码工程
本人在CVTE从事音视频开发工作多年,推出该专栏的目的是帮助更多有意向从事音视频开发的同学了解音视频编解码等基本知识、熟悉FFmpeg、SDL、OpenGL等开源框架的使用和编程,并动手开发视频播放器。 这些都是目前大厂音视频开发工程师相关职位要求的必备技能。本专栏会持续更新优质内容,敬请订阅,关注更新。随着内容不断丰富,可能会做付费专栏。另外提供CVTE内推、职位信息、面试答疑