文章目录
- 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 自定义左/右键定位拖动间隔(以秒为单位),默认值为10秒-nodisp
, disable graphical display 关闭图形化显示窗口,视频将不显示-noborder
, borderless window 无边框窗口-alwaysontop
, window always on top-volume 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.mp3ffplay 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.rgbffplay -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 jsonffprobe -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.mp4ffprobe -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=1ffprobe -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 _\|| | / encoderfiltergraph | 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.mp4ffmpeg -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.mp4cat *.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 respwd = 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 eq=contrast=1.5 -f mp4 output.mp4
- 对比度参数是contrast, 取值范围是从-2.0到2.0, 默认值是1.0
# 视频旋转效果器的使用
ffmpeg -i input.mp4 -vf "transpose=1" -b:v 600k output.mp4
# 视频裁剪效果器的使用
ffmpeg -i input.mp4 -an -vf "crop=240:480:120:0" -vcodec libx264 -b:v 600k output.mp4
# 将一张RGBA格式表示的数据转换为JPEG格式的图片
ffmpeg -f rawvideo -pix_fmt rgba -s 480*480 -i texture.rgb -f image2 -vcodec mjpeg output.jpg
23、
# 将一个YUV格式表示的数据转换为JPEG格式的图片
ffmpeg -f rawvideo -pix_fmt yuv420p -s 480*480 -i texture.yuv -f image2 -vcodec mjpeg output.jpg
24、
# 将一段视频推送到流媒体服务器上
ffmpeg -re -i input.mp4 -acodec copy -vcodec copy -f flv rtmp://xxx
- 上述代码中, rtmp: //xxx代表流媒体服务器的地址,
- 加上-re参数代表将实际媒体文件的播放速度作为推流速度进行推送
# 将流媒体服务器上的流dump到本地ffmpeg -i http://xxx/xxx.flv -acodec copy -vcodec copy -f flv output.flv
- 上述代码中, http://xxx/xxx.flv 代表一个可以访问的视频网络地址,
- 可按照复制视频流格式和音频流格式的方式, 将文件下载到本地的output.flv媒体文件中
将两个音频文件以两路流的形式封装到一个文件中,
- 比如在K歌的应用场景中, 原伴唱实时切换的场景下,
- 可以使用一个文件包含两路流, 一路是伴奏流, 另外一路是原唱流
ffmpeg -i 131.mp3 -i 134.mp3 -map 0:a -c:a:0 libfdk_aac -b:a:0 96k -map 1:a -c:a:1libfdk_aac -b:a:1 64k -vn -f mp4 output.m4a
ffmpeg -formats
列出ffmpeg支持的所有格式ffmpeg -i 输入文件 -ss 00:00:50.0 -codec copy -t 20 输出文件名
-i 指定输入文件
-ss 从指定时间开始
-codec 强制使用codec编解码方式 copy代表不进行重新编码
-t 指定时长 秒
剪切一段媒体文件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 -vn -acodec copy output.m4a
-vn 取消视频输出 -acodec 指定音频编码 copy代表不进行重新编码
提取一个视频文件中的音频文件ffmpeg -i input.mp4 -an -vcodec copy output.mp4
-an 取消音频输出 -vcodec 指定视频编码 copy代表不进行重新编码
使一个视频中的音频静音,只保留视频ffmpeg -i output.mp4 -an -vcodec copy -bsf:v h264_mp4toannexb output.h264
视频数据使用h264_mp4toannexb这个bitstream filter来转换为原始的H264数据。
从mp4文件中抽取视频流导出为裸H264数据ffmpeg -i test.aac -i test.h264 -acodec copy -bsf:a aac_adtstoasc -vcodec copy -f mp4 output.mp4
-f 指定输出格式
使用aac音频数据和H264的视频生成MP4文件ffmpeg -i input.wav -acodec libfdk_aac output.aac
对音频文件的编码格式做转换ffmpeg -i input.wav -acodec pcm_s16le -f s16le output.pcm
从wav音频文件中导出pcm裸数据ffmpeg -i input.flv -vcodec libx264 -acodec copy output.mp4
重新编码视频文件,复制音频流 同时封装到MP4格式文件中ffmpeg -i input.mp4 -vf scale=100:-1 -t 5 -r 10 image.gif
-vf设置视频的过滤器
按照分辨率比例不动宽度改为100(使用videofilter的scalefilter),帧率改为10(-r)时长改为5(-t)
将一个MP4格式的视频转换为gif格式的动图ffmpeg -i input.mp4 -r 0.25 frames_%04d.png
每4 秒截取一帧视频生成一张图片,生成的图片从frames_0001.png开始递增ffmpeg -i frames_%04d.png -r 5 output.gif
使用一组图片可以组成一个gifffmpeg -i input.wav -af ‘volume=0.5’ output.wav
使用音量效果器,改变一个音频媒体文件中的音量ffmpeg -i input.wav -filter_complex afade=t=in:ss=0:d=5 output.wav
将该音频文件前5秒钟做一个淡入效果ffmpeg -i input.wav -filter_complex afade=t=out:st=200:d=5 output.wav
将音频从200s开始 做5秒的淡出效果ffmpeg -i input1.wav -i input2.wav -filter_complex amix=inputs=2:duration=shortest output.wav
将两个音频进行合并,按照时间较短的音频时间长度作为输出ffmpeg -i input.wav -filter_complex atempo=0.5 output.wav
将音频按照0.5倍的速度进行处理生成output.wav 时间长度变为原来的2倍,音高不变ffmpeg -i test.avi -i frames_0004.jpeg -filter_complex overlay after.avi
给视频添加水印ffmpeg -i test.avi -vf"drawtext=fontfile=simhei.ttf:text=‘雷’:x=100:y=10:fontsize=24:fontcolor=yellow:shadowy=2" after.avi
添加文字水印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。ffmpeg -i input.flv -c:v libx264 -b:v 800k -c:a libfdk_aac -vf eq=contrast=1.5 -f mp4 output.mp4
视频增加对比度 参数contrast,取值范围是从-2.0到2.0ffmpeg -i input.mp4 -vf “transpose=1” -b:v 600k output.mp4
视频旋转效果器使用ffmpeg -i input.mp4 -an -vf “crop=240:480:120:0” -vcodec libx264 -b:v 600k output.mp4
视频裁剪效果器使用ffmpeg -f rawvideo -pix_fmt rgba -s 480*480 -i texture.rgb -f image2 -vcodec mjpeg output.jpg
将一张RGBA格式表示的数据转换为JPEG格式的图片ffmpeg -f rawvideo -pix_fmt yuv420p -s 480*480 -i texture.yuv -f image2 -vcodec mjpeg output.jpg
将一个YUV格式表示的数据转换为JPEG格式的图片ffmpeg -re -i ipnut.mp4 -acodec copy -vcodec copy -f flv rtmp://xxx
将一段视频推送到流媒体服务器上ffmpeg -i http://xxx/xxx.flv -acodec copy -vcodec copy -f flv output.flv
将流媒体服务器上的流dump到本地
硬解码与软解码
CPU富余、需要精准控制解码流程、有解码算法的优化、通用性要求高,直接使用软解(也就是CPU解码);
有其他编解码芯片/模组、CPU不够用,就不得不需要转向硬解码(也就是专用芯片解码)。
分解与复用命令
ffplay animals.mp4ffmpeg -i animals.mp4 -vcodec copy -acodec copy animal.mov 格式转换,将mp4转成mov
ffplay animals.movffmpeg -i animal.mov -an -vcodec copy animal.h264 将mov抽取出视频,去掉音频
ffplay animals.h264 可以直接播放h264ffmpeg -i animal.mov -acodec copy -vn animal.aac 抽取音频
处理原始数据的命令
针对mp4格式的视频文件,不要音频,视频编码格式用rawvideo,像素格式为yuv420p,输出结果为yuv格式
ffmpeg -i animals.mp4 -an -c:v rawvideo -pix_fmt yuv420p animal.yuv ffplay -s 720x1280 animal.yuv 播放时一定要加分辨率大小不要视频,只要音频,音频采样率 44100,通道数 2,-f表示音频存储格式,s表示有正有负,每一个数值都用16位表示,l表示little,e表示end,小端存储
ffmpeg -i animals.mp4 -vn -ar 44100 -ac 2 -f s16le animal.pcmffplay -ar 44100 -ac 2 -f s16le animal.pcm 播放时一定要加参数
滤镜命令
视频画面大小裁剪
-vf表明后面是视频滤镜,这里使用crop滤镜,crop的参数是:in_w是本身视频的宽,减去200,in_h-200视频高度减去200
视频编码器libx264,音频编码器采用copy的模式,表示不处理音频
ffmpeg -i animal.mov -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy animal_crop.mp4
ffmpeg -i animal.mov -vf crop=in_w-200:in_h-200 -vcodec libx264 -acodec copy animal_crop.mp4 完全同上,使用-vcodec代替-c:v
裁剪与合并命令
视频裁剪:
从第0小时,第0分钟,第20s开始,裁剪10s的视频,输出格式是ts
ffmpeg -i animals.mp4 -ss 00:00:20 -t 10 animal_10s.ts视频拼接
将txt文件中的所有视频文件拼接成一个文件
ffmpeg -f concat -i inputs.txt animal_concat.mp4 其中inputs.txt:
file 'animal_10s.ts'
file 'animal_5s.ts'
图片与视频互转命令
视频转图片
-r指定转换图片的帧率,每秒转出1帧
-f告诉ffmpeg,我要将图片输出为image2格式
最后是命名格式
ffmpeg -i animals.mp4 -r 1 -f image2 images/image-%3d.jpeg 这里要自己提前建立好一个空的images文件夹
得到:
image-001.jpeg image-002.jpeg image-003.jpeg image-004.jpeg image-005.jpeg image-006.jpeg image-007.jpeg图片转视频
ffmpeg -i images/image-%3d.jpeg animal_images.mp4
直播拉流和推流
推流
-re 减慢帧率,不要追求尽可能快的播放
-c 表示同时包括音视频的编解码方式,都是copy
-f 表示推送出去的文件格式,是flv格式
ffmpeg -re -i animals.mp4 -c copy -f flv rtmp://server/live/streamName拉流
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv 可以用ffplay去播放湖南卫视的rtmp地址:
ffplay rtmp://58.200.131.2:1935/livetv/hunantv然后用ffmpeg播放同样的地址:
ffmpeg -i rtmp://58.200.131.2:1935/livetv/hunantv -c copy dump.flv 同样的方法拉取cctv1的视频,它会保存成一段一段的:
ffmpeg -i http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8 -c copy dump.m3u8
2022-07-22(四)