FFmpeg常用命令

216 阅读7分钟

FFmpeg

1.剪辑
按时间剪辑,从5s开始,持续20s。

ffmpeg -i input.mp4 -ss 00:00:05 -t 00:00:20 -codec copy output.mp4
  1. 提取音频或视频
ffmpeg -i input.mp4 -acodec copy -vn out.aac #提取音频,保存为aac,要求原视频音频编码也为AAC
ffmpeg -i output.mp4 -vcodec copy -an out.h264 #提取视频,保存为h264,codec按原视频
  1. 设置转码分辨率
# -s 设置导出的分辨率
ffmpeg -i input.mp4 -vcodec libx265 -acodec copy -s 1280x720 -ss 00:00:05 -t 00:00:20 out.mp4
  1. 设置输出的容器格式
# 限定输出文件名后缀则可, out.avi
ffmpeg -i input.mp4 -vcodec libx264 -acodec copy -s 1280x720 -ss 00:00:05 -t 00:00:20 out.avi
  1. 查看支持容器类型
# 查看所有支持容器,会打印所有支持解复用和复用的格式 demuxer + muxer
ffmpeg -formats
# 查看所有支持的解复用格式
ffmpeg -demuxers
# 查看所有支持的复用格式
ffmpeg -muxers
  1. 查看所有的输入输出设备
ffmpeg -devices

# 输出结果如下:一般D是输入设备,E是输出设备
#Devices:
# D. = Demuxing supported
# .E = Muxing supported
# --
#  E audiotoolbox    AudioToolbox output device
# D  avfoundation    AVFoundation input device
# D  lavfi           Libavfilter virtual input device
#  E sdl,sdl2        SDL2 output device
  1. 查看所有支持的编解码器
# 查看所有支持的编解码器 decoders + encoders
ffmpeg -codecs
# 查看所有支持的解码器
ffmpeg -decoders
# 查看所有支持的编码器
ffmpeg -encoders

# ffmpeg -codecs 输出如下
#Codecs:
# D..... = Decoding supported     支持解码
# .E.... = Encoding supported     支持编码
# ..V... = Video codec            视频编解码器
# ..A... = Audio codec            音频编解码器
# ..S... = Subtitle codec         字幕编解码器
# ..D... = Data codec             数据编解码器?
# ..T... = Attachment codec       附件编解码器?
# ...I.. = Intra frame-only codec 内部帧编码器, 每帧都独立编码, 不需要参考其它帧
# ....L. = Lossy compression      有损压缩
# .....S = Lossless compression   无损压缩
# -------
# D.VI.S 012v                 Uncompressed 4:2:2 10-bit
# D.V.L. 4xm                  4X Movie
# D.VI.S 8bps                 QuickTime 8BPS video
# .EVIL. a64_multi            Multicolor charset for Commodore 64 (encoders: a64multi )
# .EVIL. a64_multi5           Multicolor charset for Commodore 64, extended with 5th color (colram) (encoders: a64multi5 )
# D.V..S aasc                 Autodesk RLE
# D.V.L. agm                  Amuse Graphics Movie
# D.VIL. aic                  Apple Intermediate Codec
# DEVI.S alias_pix            Alias/Wavefront PIX image
# DEVIL. amv                  AMV Video
# D.V.L. anm                  Deluxe Paint Animation
# D.V.L. ansi                 ASCII/ANSI art
# DEV..S apng                 APNG (Animated Portable Network Graphics) image
# D.V.L. arbc                 Gryphon's Anim Compressor
# ......
  1. 查看所有的bitstream filter
    Bitstream Filter:
  • 主要目的是对数据进行格式转换,使它能够被解码器处理(比如HEVC QSV的解码器)。
    Bitstream Filter对已编码的码流进行操作,不涉及解码过程。
  • 使用ffmpeg -bsfs命令可以查看ffmpeg工具支持的Bitstream Filter类型。
  • 使用ff*工具的 -bsf 选项来指定对具体流的Bitstream Filter,使用逗号分割的多个filter,如果filter有参数, 参数名和参数值跟在filter名称后面。
  • 常用的h264_mp4toannexb,提供两种h264封装格式的转换
  • 分离某些封装格式(如mp4/flv/mkv等)中的h264数据时,需要首先写入SPS和PPS,否则会导致分离出来的数据中没有SPS、PPS而无法播放。h264码流的SPS和PPS信息存储在AVCodecContext的extradata中,需要使用ffmpeg中名为“h264_mp4toannexb”的bitstream filter处理
ffmpeg -bsfs
  1. 查看所有支持的协议
ffmpeg -protcols
  1. 查看所有支持的filter类型
ffmpeg -filters
  1. 查看所有支持的像素格式类型
ffmpeg -pix_fmts
  1. 查看所有支持的声道布局
ffmpeg -layouts
  1. 查看所有支持的音频采样格式
ffmpeg -sample_fmts
  1. 查看所有支持的颜色(别名)
ffmpeg -colors
  1. 查看具体分类所支持的参数
# 语法 ffmpeg -h type=name
# 比如查看x264编码的其他参数
ffmpeg -h encoder=libx264
  1. 设置输出格式
# -f 手动设置输出的格式,如果不加,可以从输出文件名来判断,加了则以-f所设置参数为准
ffmpeg -i input.mp4 -codec copy -f avi output.avi
  1. 导出音频常用设置
# -b:a设置音频码率, -ac设置声道数,-ar设置采样率
ffmpeg -i input.mp4 -b:a 192k -ar 48000 -ac 2 -acodec mp2 out.mp2
  1. 导出视频常用设置
# -b:v设置视频码率, -aspect设置宽高比
ffmpeg -i input.mp4 -b:v 256k -r 120 -aspect 16:9 -vcodec hevc -an -vframes 3000 outh265.mp4
  1. 导出yuv视频数据
# pix_fmt指定yuv420p格式,导出文件名最好带上宽高
ffmpeg -i input.mp4 -t 30 -pix_fmt yuv420p yuv420_1920x872.yuv
# 播放
ffplay -i yuv420_1920x872.yuv -pixel_format yuv420p -video_size 1920x872 -framerate 30
  1. 导出rgb24视频数据
# pix_fmt指定rgb24格式
ffmpeg -i input.mp4 -t 30 -pix_fmt rgb24 rgb24_1920x872.rgb
# 播放
ffplay -i rgb24_1920x872.rgb -video_size 1920x872 -pixel_format rgb24 -framerate 30
  1. yuv与rgb数据互转
# 需要设置输入的格式以及输出的格式, -i 之前的参数是设置给输入文件的,之后是设置给输出文件
ffmpeg -s 1920x872 -pix_fmt yuv420p -i yuv420_1920x872.yuv -pix_fmt rgb24 rgb24_1920x872_new.rgb
  1. 导出pcm数据
# -ar设置采样频率 -f 设置的采样点的数据格式
ffmpeg -i input.mp4 -ar 48000 -ac 2 -f s16le -t 30 48000_2_s16le.pcm
# 播放
ffplay -ar 48000 -ac 2 -f s16le 48000_2_s16le.pcm

# -sample_fmt设置的采样点数据精度和位数,可以用 ffmpeg -sample_fmts查看,wav相比裸的pcm数据多了一个头部,可以不必设置大小端的格式
ffmpeg -i input.mp4 -ar 48000 -sample_fmt s16 out_s16.wav
# 播放
fplay -i out2_s16le.wav -ar 48000 -ac 2

# -codec:a 和 -acodec 一样,后面的codec可以从ffmpeg -encoders查到
ffmpeg -i input.mp4 -ar 48000 -codec:a pcm_s16le out2.s16le.wav
  1. 提取和拼接视频
# 视频拼接前提:
# - 1. 视频分辨率可以不同,但编码格式需要统一
# - 2. 音频编码格式需要统一,音频参数(采样率/声道等)也需要统一.音频码率可以不同。
# 拼接时*优先将所有文件转成ts格式*,进行拼接后再转成其他需要格式,否则容易出现音视频不同步,画面割裂的现象。
# 1. 将视频段提取出来, 如果音视频格式不同意,则强制统一
ffmpeg -i video1.mp4 -ss 00:05:00 -t 10 -vcodec libx264 -acodec aac segment1.mp4
ffmpeg -i video2.mp4 -ss 00:05:00 -t 10 -vcodec libx264 -acodec aac segment2.mp4
# 2. 将视频统一转换成ts格式
ffmpeg -i segment1.mp4 -codec copy -vbsf h264_mp4toannexb segment1.ts
ffmpeg -i segment2.mp4 -codec copy -vbsf h264_mp4toannexb segment2.ts

# 3. 进行拼接,这里输出可以转封装
# 两种命令方式
# 命令行输入拼接视频信息, 只适用于ts封装格式
ffmpeg -i "concat:segment1.ts|segment2.ts" -codec copy output.mp4
# 文件输入拼接视频信息,也适用于mp4/flv...其他封装格式
ffmpeg -f concat -i fileTs.txt -codec copy output.mp4
# fileTs.txt中的文件内容如下:
# file 'segment1.ts'
# file 'segment2.ts'
  1. 图片和视频的相互转换
# 1. 截取视频保存为图片
# -y 覆盖 
# -f 格式  image2是一种格式
# -vframes 帧数量,如果大于1,则输出文件名要加上%d

# 下面命令会生成 5x15=75张图片
ffmpeg -i input.mp4 -y -f image2 -t 5 -s 640x360 -r 15 frame%d.jpg

# 生成gif
ffmpeg -i input.mp4 -t 5 -r 25 image.gif

# 2. 图片序列转换为视频
ffmpeg -f image2 -i frame%d.jpg -r 15 video.mp4

# gif转视频
ffmpeg -f gif -i image.gif output.mp4

FFplay

  1. 视频旋转
# 视频旋转90度
ffplay -i input.mp4 -vf transpose=1
  1. 视频反转
# 水平方向反转
ffplay -i input.mp4 -vf hflip
# 垂直方向反转
ffplay -i input.mp4 -vf vflip
  1. 视频旋转和反转
# 视频旋转90度+水平方向反转,主要是注意多个filter时的设置方式
ffplay -i input -vf hflip,transpose=1
  1. 音频变速播放
# 音频2倍速播放,会音画不同步
ffplay -i input.mp4 -af atempo=2
  1. 视频变速播放
# 视频2倍速播放,会音画不同步
ffplay -i input.mp4 -vf setpts=PTS/2
  1. 音频及视频同时变速播放
# 音频及视频同时2倍速播放
ffplay -i input.mp4 -vf setpts=PTS/2 -af atempo=2