文章目录
-
- ffplay
-
- 命令说明
-
- 基础命令
- 高级命令
- 使用示例
-
- 播放
- 简单过滤器
- ffprobe 查看视频信息
-
- 选项说明
- 使用示例
-
- 基本使用
- 输出格式
- frame 帧信息
- ffmpeg
-
- 命令说明
-
- 基本选项
- 流标识
- 音频选项
- 视频选项
- 高级选项
- 使用示例
-
- 查看支持信息
- 操作视频
- 编码格式转换
- 视频压缩
- 视频拼接
- 视频帧操作
- 图片与视频
- 图片格式转换
- 硬解码和软解码
- 分解与复用命令
- 命令处理原始数据
- 滤镜命令
- 裁剪合并命令
- 图片和视频互转命令
- 直播拉流推流
官方文档的 Command Line Tools Documentation 部分,详细介绍命令 https://ffmpeg.org/documentation.html
例子来自网络,需要整理更新。
ffplay
命令说明
基础命令
帮助
-L
, show license-h topic
, show help-? topic
, show help-help topic
, show help--help topic
, show help-version
, show version
显示信息
-buildconf
, show build configuration-formats
, show available formats-muxers
, show available muxers-demuxers
, show available demuxers-devices
, show available devices-codecs
, show available codecs-decoders
, show available decoders-encoders
, show available encoders-bsfs
, show available bit stream filters-protocols
, show available protocols-filters
, show available filters-pix_fmts
, show available pixel formats-layouts
, show standard channel layouts-sample_fmts
, show available audio sample formats-dispositions
, show available stream dispositions-colors
, show available color names
设置
-loglevel loglevel
, set logging level-v loglevel
, set logging level-report
, generate a report-max_alloc bytes
set maximum size of a single allocated block-sources device
, list sources of the input device-sinks device
, list sinks of the output device-x width
, force displayed width | 宽带强制显示-y height
, force displayed height | | 强制显示高度-s size
, set frame size (WxH or abbreviation)-fs
, force full screen | 全屏模式启动-an
, disable audio | 禁用音频(不播放声音)-vn
, disable video | 禁用视频(不播放视频)-sn
, disable subtitling | 禁用字幕(无字幕)-ss pos
, seek to a given position in seconds 跳到指定位置,注意时间单位;例如:55
, 55 seconds12:03:45
, 12 hours, 03 minutes and 45 seconds23.189
, 23.189 second
-t duration
, play “duration” seconds of audio/video | 设置播放视频/音频的长度-ss
选项-bytes val
, seek by bytes 0=off 1=on -1=auto | 按字节跳转(0=off 1=on -1=auto)-seek_interval seconds
, set seek interval for left/right keys, in seconds 自定义左右键定位拖动间隔(以秒为单位)-nodisp
, disable graphical display 关闭图形显示窗口,视频不会显示-noborder
, borderless window 无边框窗口-alwaysontop
, window always on top-olume volume
, set startup volume 0=min 100=max | 设置起始音量。音量范围[0 ~100]-f fmt
, force format-window_title window title
, set window title | 设置窗口标题(默认为输入文件名)-af filter_graph
, set audio filters-showmode mode
, select show mode (0 = video, 1 = waves, 2 = RDFT) 设置显示模式,可用的模式值:0 显示视频,1 显示音频波形,2 显示音频频谱。 缺省为0,如果视频不存在则自动选择2-i input_file
, read specified file-codec decoder_name
, force decoder-autorotate
, automatically rotate video
高级命令
-cpuflags flags
, force specific cpu flags 打印多个回放统计信息,包括显示流持续时间,编解码器参数,流中的当前位置,以及音频/视频同步差值。 默认情况下处于启用状态,要显式禁用它则需要指定-nostats。-cpucount count
, force specific cpu count-hide_banner
, hide_banner do not show program banner-ast stream_specifier
, select desired audio stream 指定音频流索引,比如-ast 3,播放流索引为3的音频流-vst stream_specifier
, select desired video stream 指定视频流索引,比如-vst 4,播放流索引为4的视频流-sst stream_specifier
, select desired subtitle stream 指定字幕流索引,比如-sst 5,播放流索引为5的字幕流-pix_fmt format
, force pixel format-stats
, show status-fast
, non spec compliant optimizations 非标准化规范的多媒体兼容优化。-genpts
, generate pts | 生成pts。-drp
, let decoder reorder pts 0=off 1=on -1=auto-lowres
-sync type
, force audio-video sync. type (type=audio/video/ext) 同步类型 将主时钟设置为audio(type=audio),video(type=video)或external(type=ext),默认是audio为主时钟。-autoexit
, force at the end | 视频播放完毕后退出-exitonkeydown
, force on key down | 键盘按下任何键退出播放-exitonmousedown
, force on mouse down | 鼠标按下任何键退出播放-loop loop count
, force number of times the playback shall be looped-framedrop
, drop frames when cpu is too slow | 如果视频不同步则丢弃视频帧。当主时钟非视频时钟时默认开启。 若需禁用则使用-noframedrop
-infbuf
, don’t limit the input buffer size (useful with realtime streams) 不限制输入缓冲区大小。尽可能快地从输入中读取尽可能多的数据。 播放实时流时默认启用,如果未及时读取数据,则可能会丢弃数据。 此选项将不限制缓冲区的大小。若需禁用则使用-noinfbuf
-left x pos
, force the x position for the left of the window-top y pos
, force the y position for the top of the window-vf filter_graph
, force video filters-rdftspeed msecs
, rdft speed-default
, generic catch all option-acodec decoder_name
, force audio decoder | 强制使用设置的音频解码器进行音频解码-scodec decoder_name
, force subtitle decoder | 强制使用设置的字幕解码器进行字幕解码-vcodec decoder_name
, force video decoder | 强制使用设置的视频解码器进行视频解码-find_stream_info
, read and decode the streams to fill missing information with heuristics-filter_threads
, number of filter threads per graph
使用示例
播放
# 播放音频、视频文件
ffplay test.mp3
ffplay input.mp4
# 播放完自动退出
ffplay -autoexit input.mp4
# 循环播放文件10次
ffplay 文件名 -loop 10
# 播放本地文件, 设置标题
ffplay -window_title "test time" -ss 2 -t 10 -autoexit test.mp4
# 播放网络流
ffplay -window_title "rtmp stream" rtmp://10.0.100.88:443/webcast/bshdlive-pc
# 禁用音频或视频
# 禁用音频:
ffplay test.mp4 -an
# 禁用视频:
ffplay test.mp4 -vn
# 播放视频第一路音频流;参数如果是2 就是第二路音频流,如果没有就会静音。
ffplay 文件名 -ast 1
# 播放视频第一路视频流;参数如果是2 就是第二路视频流 没有显示黑屏
ffplay 文件名 -vst 1
# 播放pcm文件 必须设置参数正确
ffplay .pcm文件 -f 格式 -channels 2 声道数 -ar 采样率
# -f rawvideo 代表原始格式
ffplay -f rawvideo -pixel_format yuv420p -s 480480 .yuv文件
# -s 480480 宽高
-pixel_format yuv420p 表示格式
# 播放rgb原始数据
ffplay -f rawvideo -pixel_format rgb24 -s 480*480 .rgb文件
# 指定ffplay使用音频为基准进行音视频同步默认ffplay也是这样
ffplay 文件名 -sync audio
# 指定ffplay使用视频为基准进行音视频同步
ffplay 文件名 -sync video
# 指定ffplay使用外部时钟为基准进行音视频同步
ffplay 文件名 -ext video
# 强制解码器
# mpeg4解码器
ffplay -vcodec mpeg4 test.mp4
# h264解码器:
ffplay -vcodec h264 test.mp4
# 播放YUV数据
ffplay -pixel_format yuv420p -video_size 320x240 -framerate 5 yuv420p_320x240.yuv
# 播放RGB数据
ffplay -pixel_format rgb24 -video_size 320x240 -i rgb24_320x240.rgb
ffplay -pixel_format rgb24 -video_size 320x240 -framerate 5 -i rgb24_320x240.rgb
# 播放PCM数据
ffplay -ar 48000 -ac 2 -f f32le 48000_2_f32le.pcm
-ar set audio sampling rate (in Hz) (from 0 to INT_MAX) (default 0)
-ac set number of audio channels (from 0 to INT_MAX) (default 0)
简单过滤器
# 视频旋转
ffplay -i test.mp4 -vf transpose=1
# 视频反转
ffplay test.mp4 -vf hflip
ffplay 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
ffprobe 查看视频信息
选项说明
-L
, 显示协议-h/-?/-help/--help topic
, 帮助可以选择话题-version
, 显示版本-buildconf
, 展示编译配置选项-formats
, 显示支持的编码-muxers
, 展示支持的封装器-demuxers
, 展示支持的解封装器-devices
, 展示支持的设备-codecs
, 展示支持的编码-decoders
, 显示支持的解码器-encoders
, 显示支持的编码器
-bsfs
, 显示支持的比特流过滤器-protocols
, 展示支持的协议-filters
, 展示支持的过滤器-pix_fmts
, 显示支持的像素格式-layouts
, 展示支持的声道格式-sample_fmts
, 显示支持的采样格式-colors
, 展示支持的颜色名称-loglevel loglevel
, 设置日志级别-v loglevel
, 设置日志级别-report
, 生成报告-max_alloc bytes
, 设置单个已分配块的最大大小-cpuflags flags
, 指定cpu标志-hide_banner hide_banner
, 不显示程序横幅-sources device
, 列出源的输出设备-sinks device
, 列出输出设备的接收器-f format
, 指定格式-unit
, 显示显示值的单位-prefix
, 对显示的值使用SI前缀-byte_binary_prefix
, 对字节单位使用二进制前缀-sexagesimal
, 对时间单位使用六十进制格式 HOURS:MM:SS.MICROSECONDS-pretty
, 美化显示输出的值,让人可读
-print_format format
, 设置打印格式 (available formats are: default, compact, csv, flat, ini, json, xml)-of format
, -print_format的编码
-select_streams stream_specifier
, 选择指定的stream-sections
, 打印节结构和节信息,然后退出
-show_data
, 显示数据包信息-show_data_hash
, 显示数据包hash值-show_error
, 显示探测中的错误-show_format
, 显示格式/容器信息-show_frames
, 显示帧信息-show_format_entry entry
, 显示格式/容器信息中的特定条目-show_entries entry_list
, 显示一组指定的项-show_log
, 显示log-show_packets
, 显示packet信息-show_programs
, 显示程序信息-show_streams
, 显示stream的信息-show_chapters
, 显示chapters的信息-count_frames
, 每个stream中的帧数-count_packets
, 每个stream中的包数量
-show_program_version
, ffprobe的版本-show_library_versions
, 库的版本-show_versions
, 程序和库的版本号
-show_pixel_formats
, 展示像素格式描述-show_private_data
, 显示私有数据-private
, 和显示私有数据一样-bitexact
, 强制提取bit输出-read_intervals read_intervals
, 设置读取间隔-default
, 默认所有选项-i input_file
, 读取指定文件-print_filename print_file
, 重新显示输入的文件名-find_stream_info
, 读取并解码流,用启发式方法填充缺失的信息
使用示例
基本使用
# 查看音频视频文件信息
ffprobe 文件名
# 查看文件的输出格式信息,时间长度,文件大小,比特率,流数目等。
ffprobe -show_format 文件名
# 以json格式输出 流 信息
ffprobe -print_format json -show_streams 文件名
# 显示帧信息
ffprobe -show_frames 文件名
# 查看包信息
ffprobe -show_packets 文件名
输出格式
支持格式:xml、ini、json、csv、flat
ffprobe -show_format test.mp4 -print_format json
ffprobe -show_frames -of json input.flv
frame 帧信息
# 查看视频总帧数
ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 gemfield.mp4
ffprobe -select_streams v -of xml -show_entries frame=pkt_pts,pkt_dts,pkt_size,pkt_duration,pict_type a.mp4
# 查看音频总帧数
ffprobe -v error -count_frames -select_streams a:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1
ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 -skip_frame nokey gemfield.mp4
# 查看 key frame 所在的时间
ffprobe -v error -skip_frame nokey -select_streams v:0 -show_entries frame=pkt_pts_time -of csv=print_section=0 gemfield.mp4
# 查看 key frame 分布的情况
ffprobe -v error -show_frames gemfield.mp4 | grep pict_type
# 查看 key frame 所在的帧数
ffprobe -v error -select_streams v -show_frames -show_entries frame=pict_type -of csv gemfield.mp4 | grep -n I | cut -d ':' -f 1
# 重新设置 key frame interval
ffmpeg -i gemfield.mp4 -vcodec libx264 -x264-params keyint=1:scenecut=0 -acodec copy out.mp4
# 查看视频波特率
ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1:nokey=1 gemfield.mp4
# 只查看音频(a)、视频(v)、字幕(s)的信息
ffprobe -show_frames -select_streams v -of json input.mp4
ffprobe -show_frames -select_streams a -of json input.mp4
# packet 数据包
ffprobe -show_packets video.mp4
show_packets 查看的多媒体包信息使用PACKET标签所包括起来,其中包含的信息主要如下:
- codec_type: 多媒体类型,例如视频包,音频包等;
- stream_index: 多媒体的stream索引;
- pts: 多媒体的显示时间值
- pts_time: 根据不同格式计算过后的多媒体的显示时间
- dts: 多媒体解码时间值
- dts_time: 根据不同格式计算过后的多媒体解码时间
- duration: 多媒体包占用的时间值
- duration_time: 根据不同格式计算过后的多媒体包占用的时间值
- size: 多媒体包的大小
- pos: 多媒体包所在的文件偏移位置
- flags: 多媒体包标记,关键包与非关键包的标记
ffmpeg
ffmpeg [global options] {
[infile options]['-i' 'infile'] ...} {
[outfile options] 'outfile' ...}
参数选项由三部分组成:可选的一组全局参数、一组或多组输入文件参数、一组或多组输出文件参数。 其中,每组输入文件参数以 -i
为结束标记; 每组输出文件参数以输出文件名为结束标记。
ffmepg 中的转码过程,如下图:
_______ ______________
| | | |
| input | demuxer | encoded data | decoder
| file | ---------> | packets | -----+
|_______| |______________| |
v
_________
| |
| decoded |
| frames |
|_________|
________ ______________ |
| | | | |
| output | <-------- | encoded data | <----+
| file | muxer | packets | encoder
|________| |______________|
Filtering
Simple filtergraphs
_________ ______________
| | | |
| decoded | | encoded data |
| frames |\ _ | packets |
|_________| \ /||______________|
\ __________ /
simple _\|| | / encoder
filtergraph | filtered |/
| frames |
|__________|
_______ _____________ _______ ________
| | | | | | | |
| input | ---> | deinterlace | ---> | scale | ---> | output |
|_______| |_____________| |_______| |________|
Complex filtergraphs
_________
| |
| input 0 |\ __________
|_________| \ | |
\ _________ /| output 0 |
\ | | / |__________|
_________ \| complex | /
| | | |/
| input 1 |---->| filter |\
|_________| | | \ __________
/| graph | \ | |
/ | | \| output 1 |
_________ / |_________| |__________|
| | /
| input 2 |/
|_________|
命令说明
基本选项
支持能力
-formats
, 列出支持的文件格式。-codecs
, 列出支持的编解码器。-decoders
, 列出支持的解码器。-encoders
, 列出支持的编码器。-protocols
, 列出支持的协议。-bsfs
, 列出支持的比特流过滤器。-filters
, 列出支持的滤镜。-pix_fmts
, 列出支持的图像采样格式。-sample_fmts
, 列出支持的声音采样格式。
常用输入选项
-i filename
, 指定输入文件名。-f fmt
, 强制设定文件格式,需使用能力集列表中的名称(缺省是根据扩展名选择的)。-ss hh:mm:ss[.xxx]
, 设定输入文件的起始时间点,启动后将跳转到此时间点然后开始读取数据。-y
, 覆盖已有文件。-t duration
, 指定时长。-fs limit_size
, 设置文件大小的上限。-ss limit_size
, 从指定的时间(单位为秒)开始,也支持[-]hh:mm:ss[.xxx]格式-re
, 代表按照帧率发送。在作为推流工具的时候一定要加入该参数,否则ffmpeg会按照最高速率向流媒体服务器不停地发送数据。-map
, 指定输出文件的流映射关系。如果没有-map选项,则ffmpeg采用默认的映射关系。
对于输入,以下选项通常是自动识别的,但也可以强制设定。
-c codec
, 指定解码器,需使用能力集列表中的名称。-acodec codec
, 指定声音的解码器,需使用能力集列表中的名称。-vcodec codec
, 指定视频的解码器,需使用能力集列表中的名称。-b:v bitrate
, 设定视频流的比特率,整数,单位bps。-r fps
, 设定视频流的帧率,整数,单位fps。-s WxH
, 设定视频的画面大小。也可以通过挂载画面缩放滤镜实现。-pix_fmt format
, 设定视频流的图像格式(如RGB还是YUV)。-ar sample rate
, 设定音频流的采样率,整数,单位Hz。-ab bitrate
, 设定音频流的比特率,整数,单位bps。-ac channels
, 设置音频流的声道数目。
常用输出选项
-f fmt
, 强制设定文件格式,需使用能力集列表中的名称(缺省是根据扩展名选择的)。-c codec
, 指定编码器,需使用能力集列表中的名称(编码器设定为”copy“表示不进行编解码)。-acodec codec
, 指定声音的编码器,需使用能力集列表中的名称(编码器设定为”copy“表示不进行编解码)。-vcodec codec
, 指定视频的编码器,需使用能力集列表中的名称(编解码器设定为”copy“表示不进行编解码)。-r fps
, 设定视频编码器的帧率,整数,单位fps。-pix_fmt format
, 设置视频编码器使用的图像格式(如RGB还是YUV)。-ar sample rate
, 设定音频编码器的采样率,整数,单位Hz。-b bitrate
, 设定音视频编码器输出的比特率,整数,单位bps。-ab bitrate
, 设定音频编码器输出的比特率,整数,单位bps。-ac channels
, 设置音频编码器的声道数目。-an
, 忽略任何音频流。-vn
, 忽略任何视频流。-t hh:mm:ss[.xxx]
, 设定输出文件的时间长度。-to hh:mm:ss[.xxx]
, 如果没有设定输出文件的时间长度的画可以设定终止时间点。
流标识
FFMPEG的某些选项可以对一个特定的媒体流起作用,这种情况下需要在选项后面增加一个流标识。流标识允许以下几种格式`,
- 流序号。譬如“:1”表示第二个流。
- 流类型。譬如“:a“表示音频流,流类型可以和流序号合并使用,譬如“🅰️1”表示第二个音频流。
- 节目。节目和流序号可以合并使用。
- 流标识。流标识是一个内部标识号。
假如要设定第二个音频流为copy,则需要指定-codec🅰️1 copy
音频选项
-ab
, 设置比特率(单位为bit/s)。-aq
, 等价于q:a,老版本为qscale:a,用于设定音频质量。-aq quality
, 设置音频质量(指定编码)。-ar rate
, 设置音频采样率(单位为Hz)。-ac channels
, 设置声道数。1就是单声道,2就是立体声。-an
, 取消音频轨。-acodec codec
, 指定音频编码('copy’代表不做音频转码)。-aframes
, 等价于frames:a,输出选项,用于指定输出的音频帧数目。-atag
, 等价于tag:a,用于设定音频流的标签。-af
, 等价于filter:a,用于设定一个声音的后处理过滤链,其参数为一个描述声音后处理链的字符串。-vol volume
, 设置录制音量大小(默认256)<百分比>。
视频选项
-b
, 指定比特率(bit/s),ffmpeg是自动使用VBR的,若指定了该参数则使用平均比特率。-bitexact
, 使用标准比特率。-vb
, 指定视频比特率(bit/s).-r rate
, 帧速率(fps)。-s size
, 指定分辨率(320 * 320)-aspect aspect
, 设置视频长宽比(4:3,16:9或者1.3333,1.7777)。-croptop size
, 设置顶部切除尺寸(in pixels)。-cropbottom size
, 设置顶底切除尺寸(in pixels)。-cropleft size
, 设置左切除尺寸(in pixels)。-cropright size
, 设置右切除尺寸(in pixels)。-padtop size
, 设置顶部补齐尺寸(in pixels)。-padbottom size
, 设置底部补齐尺寸(in pixels)。-padleft size
, 设置左补齐尺寸(in pixels)。-padright size
, 设置右补齐尺寸(in pixels)。-padcolor color
, 补齐带颜色(000000-FFFFFF)。-vn
, 取消视频的输出。-vcode codec
, 强制使用 codec 编解码方式( 'copy’代表不进行重新编码)。-vframes
, 等价于frames:v
,输出选项,用于指定输出的视频帧数目。-aspect
, 设置宽高比,如4:3、16:9、1.3333、1.7777等。-bits_per_raw_sample
, 设置每个像素点的比特数。-vstats
, 产生video统计信息。-vf
, 等价于filter:v
,用于设定一个图像的后处理过滤链,其参数为一个描述图像后处理链的字符串。-vtag
, 等价于tag:v
,用于设定视频流的标签。-force_fps
, 强制设定视频帧率。-force_key_frames
, 显式控制关键帧的插入,参数为字符串,可以是一个时间戳,也可以是一个expr:
前缀的表达式。如-force_key_frames 0:05:00
、-force_key_frames expr:gte(t,n_forced*5)
高级选项
-re
, 要求按照既定速率处理输入数据,这个速率即是输入文件的帧率。-map
, 指定输出文件的流映射关系。例如 “-map 1:0 -map 1:1”要求将第二个输入文件的第一个流和第二个流写入到输出文件。如果没有-map选项,ffmpeg采用缺省的映射关系。
使用示例
查看支持信息
# 查看FFmpeg支持的编码器
ffmpeg configure -encoders
# 查看FFmpeg支持的解码器
ffmpeg configure -decoders
# 查看FFmpeg支持的通信协议
ffmpeg configure -protocols
# 查看FFmpeg所支持的音视频编码格式、文件封装格式与流媒体传输协议
ffmpeg configure --help
# 列出ffmpeg支持的所有格式
ffmpeg -formats
# 将一个老式的avi文件转成mp4
ffmpeg -i final.avi -acodec copy -vcodec copy final.mp4
# 从一个视频文件中抽取一帧图像
ffmpeg -y -i test.mp4 -ss 00:03:22.000 -vframes 1 -an test.jpg
ffmpeg -i final.avi -vf scale=640:640 square.avi
4、
# 使用alsa接口录制一段音频存放到某个wav文件中
ffmpeg -f alsa -i hw:0 -t 100 alsaout.wav
# 使用alsa接口搭建一个个人网络电台
ffmpeg -f alsa -i default -acodec aac -strict -2 -b:a 128k -r 44100 /var/www/data/main.m3u8
# 将一个mp4文件的音视频流实时转码之后发送给某个远程设备,远程设备可以通过http获取的sdp文件来接收rtp媒体数据。
ffmpeg -re -i example.mp4 -acodec copy -vcodec libx264 -s 480x270 -map 0:0 -f rtp rtp://10.131.202.62:1234 -map 0:1 -f rtp rtp://10.131.202.62:1238 > /var/www/live.sdp
操作视频
设置视频的屏幕高宽比
ffmpeg -i input.mp4 -aspect 16:9 output.mp4
通常使用的宽高比是: 16:9 4:3 16:10 5:4 2:21:1 2:35:1 2:39:1
编码格式转换
MPEG4编码转成H264编码
ffmpeg -i input.mp4 -strict -2 -vcodec h264 output.mp4
H264编码转成MPEG4编码
ffmpeg -i input.mp4 -strict -2 -vcodec mpeg4 output.mp4
视频压缩
ffmpeg -i 2020.mp4 -vcodec h264 -vf scale=640:-2 -threads 4 2020_conv.mp4
ffmpeg -i 1579251906.mp4 -strict -2 -vcodec h264 1579251906_output.mp4
参数解释:
-i 2020.mp4
, 输入文件,源文件2020_conv.mp4
, 输出文件,目标文件-vf scale=640:-2
, 改变视频分辨率,缩放到640px宽,高度的-2是考虑到libx264要求高度是偶数,所以设置成-2,让软件自动计算得出一个接近等比例的偶数高-threads 4
, 4核运算
其他参数:
-s 1280x720
设置输出文件的分辨率,w*h
。-b:v
, 输出文件的码率,一般500k左右即可,人眼看不到明显的闪烁,这个是与视频大小最直接相关的。-preset
, 针对特定类型的源内容(比如电影、动画等),还可以使用-tune参数进行特别的优化。 指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。 与 veryslow相比,placebo以极高的编码时间为代价,只换取了大概1%的视频质量提升。这是一种收益递减准则:slow 与 medium相比提升了5%~10%;slower 与 slow相比提升了5%;veryslow 与 slower相比提升了3%。-an
, 去除音频流。-vn
, 去除视频流。-c:a
, 指定音频编码器。-c:v
, 指定视频编码器,libx264,libx265,H.262,H.264,H.265。- libx264:最流行的开源 H.264 编码器。
- NVENC:基于 NVIDIA GPU 的 H.264 编码器。
- libx265:开源的 HEVC 编码器。
- libvpx:谷歌的 VP8 和 VP9 编码器。
- libaom:AV1 编码器。
-vcodec copy
, 表示不重新编码,在格式未改变的情况采用。-re
, 以源文件固有帧率发送数据。-minrate 964K -maxrate 3856K -bufsize 2000K
, 指定码率最小为964K,最大为3856K,缓冲区大小为 2000K。-y
, 不经过确认,输出时直接覆盖同名文件。-crf
, 参数来控制转码,取值范围为 051,其中0为无损模式,1828是一个合理的范围,数值越大,画质越差。
视频拼接
# 将4个视频拼接成一个很长的视频(无声音)
ffmpeg -i 0.mp4 -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex '[0:0][1:0] [2:0][3:0] concat=n=4:v=1 [v]' -map '[v]' output.mp4
# 将4个视频拼接成一个很长的视频(有声音)
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex '[0:0][0:1] [1:0][1:1] [2:0][2:1] concat=n=3:v=1:a=1 [v][a]' -map '[v]' -map '[a]' output.mp4
参数解释:
[0:0][0:1] [1:0][1:1] [2:0][2:1]
, 分别表示第1个输入文件的视频、音频,第2个输入文件的视频、音频,第3个输入文件的视频、音频。concat=n=3:v=1:a=1
, 表示有3个输入文件,输出一条视频流和一条音频流。[v][a]
, 得到的视频流和音频流的名字,注意在 bash 等 shell 中需要用引号,防止通配符扩展。
横向拼接2个视频
ffmpeg -i 0.mp4 -i 1.mp4 -filter_complex "[0:v]pad=iw*2:ih*1[a];[a][1:v]overlay=w" out.mp4
参数解释:
pad
将合成的视频宽高,这里iw代表第1个视频的宽,iw*2代表合成后的视频宽度加倍,ih为第1个视频的高,合成的两个视频最好分辨率一致。- overlay 覆盖,
[a][1:v]overlay=w
,后面代表是覆盖位置w:0。
竖向拼接2个视频
ffmpeg -i 0.mp4 -i 1.mp4 -filter_complex "[0:v]pad=iw:ih*2[a];[a][1:v]overlay=0:h" out_2.mp4
横向拼接3个视频
ffmpeg -i 0.mp4 -i 1.mp4 -i 2.mp4 -filter_complex "[0:v]pad=iw*3:ih*1[a];[a][1:v]overlay=w[b];[b][2:v]overlay=2.0*w" out_v3.mp4
竖向拼接3个视频
ffmpeg -i 0.mp4 -i 1.mp4 -i 2.mp4 -filter_complex "[0:v]pad=iw:ih*3[a];[a][1:v]overlay=0:h[b];[b][2:v]overlay=0:2.0*h" out_v4.mp4
4个视频2x2方式排列
ffmpeg -i 0.mp4 -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex "[0:v]pad=iw*2:ih*2[a];[a][1:v]overlay=w[b];[b][2:v]overlay=0:h[c];[c][3:v]overlay=w:h" out.mp4
切割视频
ffmpeg -i input.mp4 -ss 00:00:50.0 -codec copy -t 20 output.mp4
- 表示将文件input.mp4从第50s开始剪切20s的时间,
- 输出到文件output.mp4中,
- 其中 -ss指定偏移时间( time Offset) ,
-t
指定的时长( duration)
视频帧操作
ffmpeg和H264视频的编解码
# 查看每帧的信息
ffprobe -v error -show_frames gemfield.mp4
从pict_type=I
可以看出这是个关键帧,然后key_frame=1
表示这是 IDR frame,如果 key_frame=0 表示这是 Non-IDR frame。
截取视频中的某一帧
把 gemfield.mp4 视频的第1分05秒的一帧图像截取出来。
input seeking
ffmpeg -ss 00:1:05 -i gemfield.mp4 -frames:v 1 out.jpg
output seeking
ffmpeg -i gemfield.mp4 -ss 00:1:05 -frames:v 1 out1.jpg
参数解释:
-frame:v 1
,在video stream上截取1帧。 input seeking使用的是key frames,所以速度很快; 而output seeking是逐帧decode,直到1分05秒,所以速度很慢。
重要说明:
ffmpeg 截取视频帧有2种 seeking 方式,对应有2种 coding 模式:transcoding 和 stream copying(ffmpeg -c copy)。
transcoding 模式:需要 decoding + encoding 的模式,即先 decoding 再encoding。
stream copying 模式:不需要decoding + encoding的模式,由命令行选项-codec加上参数copy来指定(-c:v copy )。在这种模式下,ffmpeg在video stream上就会忽略 decoding 和 encoding步骤。
图片与视频
图片转视频(规则的名称)
ffmpeg -f image2 -i 'in%6d.jpg' -vcodec libx264 -r 25 -b 200k test.mp4
参数解释:
-r 25
, 表示每秒播放25帧-b 200k
, 指定码率为200k
图片的文件名为"in000000.jpg",从0开始依次递增。
图片转视频(不规则的名称)
不规则图片名称转视频。
方法一
不规则图片名称合成视频文件。
ffmpeg -framerate 10 -pattern_type glob -i '*.jpg' out.mp4
cat *.png | ffmpeg -f image2pipe -i - output.mp4
参数解释:
-framerate 10
:视频帧率-pattern_type glob:Glob pattern-
模糊匹配-f image2pipe-
:图像管道,模糊匹配得到图片名称
方法二
不规则图片名称合成视频文件。 先动手把不规则文件重命名规则图片名。
def getTpyeFile(filelist, type):
res = []
for item in filelist:
name, suf = os.path.splitext(item) # 文件名,后缀
if suf == type:
res.append(item)
return res
pwd = os.getcwd() # 返回当前目录的绝对路径
dirs = os.listdir() # 当前目录下所有的文件名组成的数组
typefiles = getTpyeFile(dirs, '.jpg')
for i in range(0,len(typefiles)):
os.rename(typefiles[i],"./%d.jpg" % (i)) #将文件以数字规则命令
将需要合成的图片放在txt中,通过读取txt文件合并成视频。
ffmpeg -f concat -i files.txt output.mp4
图片格式转换
# webp转换成jpg
ffmpeg -i in.webp out.jpg
# webp转换成png
ffmpeg -i in.webp out.png
# jpg转换成png
ffmpeg -i in.jpg out.png
# jpg转换成webp
ffmpeg -i in.jpg out.webp
# png转换成webp
ffmpeg -i in.png out.webp
# png转换成jpg
ffmpeg -i in.png out.jpg
如果在手机中录制了一个时间比较长的视频无法分享到微信中,那么可以使用ffmpeg将该视频文件切割为多个文件
ffmpeg -i input.mp4 -t 00:00:50 -c copy small-1.mp4 -ss 00:00:50 -codec copy small-2.mp4
# 使一个视频中的音频静音, 即只保留视频
ffmpeg -i input.mp4 -an -vcodec copy output.mp4
# 从MP4文件中抽取视频流导出为裸H264数据
ffmpeg -i output.mp4 -an -vcodec copy -bsf:v h264_mp4toannexb output.h264
- 视频数据使用mp4toannexb这个bitstream filter来转换为原始的H264数据,
# 使用AAC音频数据和H264的视频生成MP4文件
ffmpeg -i test.aac -i test.h264 -acodec copy -bsf:a aac_adtstoasc -vcodec copy -f mp4 output.mp4
7、
# 对音频文件的编码格式做转换
ffmpeg -i input.wav -acodec libfdk_aac output.aac
# 从WAV音频文件中导出PCM裸数据
ffmpeg -i input.wav -acodec pcm_s16le -f s16le output.pcm
- 这样就可以导出用16个bit来表示一个sample的PCM数据了,
- 并且每个sample的字节排列顺序都是小尾端表示的格式,
- 声道数和采样率使用的都是原始WAV文件的声道数和采样率的PCM数据。
# 重新编码视频文件, 复制音频流, 同时封装到MP4格式的文件中
ffmpeg -i input.flv -vcodec libx264 -acodec copy output.mp4
# 将一个MP4格式的视频转换成为gif格式的动图
ffmpeg -i input.mp4 -vf scale=100:-1 -t 5 -r 10 image.gif
- 上述代码按照分辨比例不动宽度改为100( 使用VideoFilter的scaleFilter) ,
- 帧率改为10(-r),只处理前5秒钟(-t)的视频,生成gif
# 将一个视频的画面部分生成图片,可以用来分析一个视频里面的每一帧都是什么内容
ffmpeg -i output.mp4 -r 0.25 frames_%04d.png
# 使用一组图片可以组成一个gif
ffmpeg -i frames_%04d.png -r 5 output.gif
# 使用音量效果器,可以改变一个音频媒体文件中的音量
ffmpeg -i input.wav -af ‘volume=0.5’ output.wav
- 上述命令是将input.wav中的声音减小一半, 输出到output.wav文件中,
- 可以直接播放来听, 或者放到一些音频编辑软件中直接观看波形幅度的效果
# 淡入效果器的使用
ffmpeg -i input.wav -filter_complex afade=t=in:ss=0:d=5 output.wav
- 上述命令可以将input.wav文件中的前5s做一个淡入效果, 输出到output.wav中,
- 可以将处理之前和处理之后的文件拖到Audacity音频编辑软件中查看波形图
# 淡出效果器的使用
ffmpeg -i input.wav -filter_complex afade=t=out:st=200:d=5 output.wav
- 上述命令可以将input.wav文件从200s开始, 做5s的淡出效果, 并放到output.wav文件中
# 将两路声音进行合并, 比如要给一段声音加上背景音乐
ffmpeg -i vocal.wav -i accompany.wav -filter_complex amix=inputs=2:duration=shortest output.wav
- 上述命令是将vocal.wav和accompany.wav两个文件进行mix,
- 按照时间长度较短的音频文件的时间长度作为最终输出的output.wav的时间长度。
# 对声音进行变速但不变调效果器的使用
ffmpeg -i vocal.wav -filter_complex atempo=0.5 output.wav
- 上述命令是将vocal.wav按照0.5倍的速度进行处理生成output.wav,
- 时间长度将会变为输入的2倍。 但是音高是不变的, 这就是大家常说的变速不变调
# 为视频增加水印效果
ffmpeg -i input.mp4 -i changba_icon.png -filter_complex
'[0:v][1:v]overlay=main_w-overlay_w-10:10:1[out]' -map '[out]' output.mp4
- 上述命令包含了几个内置参数,
- main_w代表主视频宽度,
- overlay_w代表水印宽度,
- main_h代表主视频高度,
- overlay_h代表水印高度
# 视频提亮效果器的使用
ffmpeg -i input.flv -c:v libx264 -b:v 800k -c:a libfdk_aac -vf eq=brightness=0.25
-f mp4 output.mp4
- 提亮参数是brightness,取值范围是从-1.0到1.0,默认值是0
# 为视频增加对比度效果 ffmpeg -i input.flv -c:v libx264 -b:v 800k -c:a libfdk_aac -vf 标签:
pcm260变送器