资讯详情

FFmpeg 2 - ffplay、ffprobe、ffmpeg 命令使用

文章目录

    • 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 seconds
    • 12:03:45, 12 hours, 03 minutes and 45 seconds
    • 23.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

高级命令


使用示例

播放

# 播放音频、视频文件
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 查看视频信息

选项说明


  • -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变送器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台