一、三个自带程序的功能
- ffmpeg 超快音视频编码器
- ffplay 简单媒体播放器
- ffprobe 简单多媒体流分析器
二、常用命令
1. 播放文件
- 播放本地视频
ffplay .\testvideo1.mp4
- 播放网络视频
ffplay rtmp://ns8.indexforce.com/home/mystream
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. 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
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
5. YUV 转 RGB
ffmpeg -s 640x480 -pix_fmt yuv420p -i testvideo1_yuv420p_640x480.yuv -pix_fmt rgb24 -s 320x240 testvideo1_rgb24_320x240.rgb
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
ffmpeg -muxers | findstr PCM
ffmpeg -ss 00:00:30 -t 10 -i testvideo1.mp4 -ar 48000 -ac 2 -sample_fmt s16 testvideo1_48000_2_s16.wav
ffmpeg -sample_fmts
ffmpeg -ss 00:00:30 -t 10 -i testvideo1.mp4 -ar 48000 -ac 2 -codec:a pcm_s16le testvideo1_48000_2_s16le.wav
ffmpeg -encoders | findstr pcm
- 播放 pcm
ffplay -ar 48000 -ac 2 -f f32le testvideo1_48000_2_f32le.pcm
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
8. 命令行查看帮助文档
- 基本信息
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
9. 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/2
2倍速
- 音频变速
ffplay -i .\testvideo1.mp4 -af atempo=2
2倍速
- 视频音频同时变速
ffplay -i .\testvideo1.mp4 -af atempo=2 -vf setpts=PTS/2
2倍速
10. 视频裁剪合并
- 如果音视频格式不统一,则先统一格式
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
(成功)
- 方法一:
注意:
- 建议使用方法二进行拼接
- 转成ts格式进行拼接
- 视频分辨率可以不同,但是(视频、音频)编码格式需要统一
11. 图片和视频相互转换
- 截取一张图
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
12. 录制
安装dshow
查看设备名字
ffmpeg -list_devices true -f dshow -i dummy
- 录制视频
使用 dshow 下边的ffmpeg C:\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
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 需要谨慎使用,不写会自动转码
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
15. 水印
- 文字水印
- 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"
- 图片水印
- 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
16. 画中画
- overlay 参数列表
参数 | 类型 | 说明 |
x | 整数 | x坐标 |
y | 整数 | y坐标 |
eof_action | 整数 | 遇到eof表示时的处理方式,默认为重复
|
shortest | 布尔 | 终止最短的视频时全部终止(默认 false) |
format | 整数 | 设置output的像素格式,默认为yuv420p
|
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]"
17. 多宫格
- 2X2
ffmpeg -i .\video.mp4 -i .\video.mp4 -i .\video.mp4 -i .\video.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_video_2x2.mp4
- 2x1
ffmpeg -i .\video.mp4 -i .\video.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" out_video_2x1.mp4
三、转码流程
ffmpeg -i .\testvideo1.mp4 -acodec copy -vcodec libx264 -s 960x360 testvideo1_960x360.flv
ffmpeg -i .\testvideo1.mp4 -acodec copy -vcodec libx265 -s 960x360 testvideo1_960x360.mkv
ffmpeg调用libavformat库(包含解复用器)来读取输入文件,并从中获取包含编码数据的数据包。当有多个输入文件时,ffmpeg试图通过跟踪任何活动输入流上的最低时间戳来保持它们的同步。
编码后的数据包随后被传递到解码器(除非流选择了streamcopy,请参阅进一步的描述)。解码器产生未压缩的帧(原始视频/PCM音频/…),可以通过滤波进行进一步处理(见下一节)。在滤波之后,帧被传递到编码器,编码器对它们进行编码并输出编码的分组。最后,这些数据被传递给复用器,复用器将编码的数据包写入输出文件。
四、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渲染器
五、ffmpeg 主要选项
1. -i
设定输入流i
2. -f
设定输出格式(format)
3. -ss
开始时间
4. -t
duration 时间长度
5. -y
覆盖之前的同名文件
6. 音频参数
- -aframes 设置要输出的音频帧数
- -b:a 音频码率
- -ar 设置采样率
- -ac 设置声音的通道数
- -acodec 设置声音编解码器,如果用copy表示原始编解码数据必须被拷贝
- -an 不处理音频
- -af 音频过滤器
使用实例 MP4 转 指定 MP3
ffmpeg -i testvideo1.mp4 -ss 60 -aframes 250 -b:a 129k -ar 48000 -ac 2 -acodec libmp3lame testvideo1_48000_129_2.mp3
7. 视频参数
- -vframes 设置要输出的视频帧数 如果 大于1 输出 加%03d 如 test%03d.jpg
- -b 设置视频码率
- -b:v 视频码率
- -r 设置帧速率
- -s 设置画面的宽与高
- -vn 不处理视频
- -aspect aspect 设置横纵比 4:3 16:9 或1.3333 1.7777
- -vcodec 设置视频编解码器,如果用copy表示原始编解码数据必须被拷贝
- -vf 音频过滤器
使用实例 MP4 转 265编码
ffmpeg -i testvideo1.mp4 -ss 60 -vframes 250 -b:v 1000k -r 30 -s 640x480 -aspect 4:3 -vcodec libx265 testvideo1_265.h265
8. 滤镜(filter)内置变量
- t 以秒表示的时间戳,如果输入时间是未知则为NAN
- n 输入帧的顺序编号,从0开始
- pos 输入帧的位置 ,如果未知则为NAN
- w 输入视频帧的宽度
- h 输入视频帧的高度
测试音视频素材文件
【免费】素材(mp4、flv、ts、h264、h265、mkv、yuv、rgb、mp3、wav、pcm、aac、jpg、bmp、gif)资源-CSDN文库