FFmpeg

2020-01-11
6分钟阅读时长

完整说明见 官方文档

文件封装格式

查看支持的封装格式

返回第一列 D~,~E 分表示 Demuxing 支持 和 Muxing 支持。第二列表示封装格式,第三列为详细说明。

ffmpeg -formats
# =>
# D mov,mp4,m4a,3gp,3g2,mj2 QuickTime / MOV
# E mp4             MP4 (MPEG-4 Part 14)

查看指定封装格式的详细信息

可以通过以下方式查看某个封装格式的详细信息

ffmpeg -h muxer=mp4
# ffmpeg -h demuxer=mp4
# =>
# Muxer mp4 [MP4 (MPEG-4 Part 14)]:
#     Common extensions: mp4.     默认扩展名
#     Mime type: video/mp4.
#     Default video codec: h264.  默认的视频编码格式
#     Default audio codec: aac.   默认的音频编码格式
# mp4 muxer AVOptions:            详细参数
#   -movflags          <flags>      E....... MOV muxer flags (default 0)
#   ....

仅显示视频信息

ffmpeg -i ${INPUT}

修改封装格式

一般可以直接通过后缀名确定文件的封装格式

ffmpeg -i ${INPUT} ${OUTPUT}
# ffmpeg -i "芒种-花丸晴琉.flv" "芒种-花丸晴琉.mp4"

也可以通过 -f 选项指定文件的封装格式

ffmpeg -i ${INPUT} -f ${FORMAT} ${OUTPUT}
# ffmpeg -i "芒种-花丸晴琉.flv" -f avi "芒种-花丸晴琉.dat"

文件编码格式

查看支持的编码格式

FFmpeg 支持的编码和解码在编译时确定,可以用过以下命令查看。第一列第一个字段 V~, ~A~,~S 分别表示视频,音频和字幕。第二、三个字段 F~,~S 表示帧级别多线程支持和分片级别多线程支持。第四个字段 X 表示试验版本。第二列是编码格式,第三列为详细说明。

ffmpeg -encoders  # 查看所有支持的编码器
ffmpeg -decoders  # 查看所有支持的解码器
# =>
# V..... libx265 libx265 H.265 / HEVC (codec hevc)

查看指定编码格式的详细信息

ffmpeg -h encoder=h264
ffmpeg -h deencoder=h264

将视频转为音频并且编辑 metadata 信息

ffmpeg -i 000.flv -i ../thumb.jpg -map 0:1 -map 1:0 -acodec libmp3lame -id3v2_version 3 \
        -metadata title="Sadistic Love" \
        -metadata artist="鹿乃" \
        -metadata comment="演唱 鹿乃
混音 ●テラピコス

サディスティック・ラブ
本家動画 sm13292326" output.mp3

参数解释

-i 000.flv -i ../thumb.jpg
# 输入文件分别为视频和一张图片
-map 0:1 -map 1:0
# 取第一个文件的第二个流 (视频的 :0 是 video, :1 是 audio)
# 取第二个文件的第一个流 (图片只有 :0 为 png 流)
-acodec libmp3lame
# 指定音频使用 mp3 编码
-id3v2_version 3
# 指定 mp3 的 ID3 头信息版本为 id3v2.3
-metadata ${metadata}
# 写入 metadata 的信息, 包括
# title         标题
# artist        艺术家
# comment       备注

分离声道, 分离合并视频声音

# 交换 1.mp3 的左右声道 输出到 output.mp3
ffmpeg -i 1.mp3 -map_channel 0.0.1 -map_channel 0.0.0 output.mp3
# 单独提取视频
ffmpeg -i video.mp4 -vcodec copy -an video_silent.mp4
# 单独提取音频
ffmpeg -i video.mp4 -vn [-ar 44100 -ac 2 -ab 192|-acodec copy] [-f mp3] video_novideo.mp3
# 合并
ffmpeg -i video_novideo.mp3 -i video_silent.mp4 -c copy video_merge.mp4

参数解释

-map_channel 0.0.1 -map_channel 0.0.0
# 输出两个声道, 顺序以此为 左, 右
# 第一个声道 (左) 取 0.0.0 第一个文件(1.mp3) 的第一个流 (audio) 的第二个声道 (右)
# 第二个声道 (右) 取 0.0.1 第一个文件(1.mp3) 的第一个流 (audio) 的第一个声道 (左)
-vn -an
# 不输出视频和音频
-vcodec copy -acodec acopy
# 原样输出视频和音频
-ar 44100 -ac 2 -ab 192
# 设置音频采样率 44100, 通道数为 2, 码率为 192 Kbps

剪切视频或音频

# 30s 开始截取到 120s
ffmpeg -i music.mp3 -ss 00:00:30 -to 00:02:00 -acodec copy music_cut.mp3
# 30s 开始截取 60s
ffmpeg -i music.mp3 -ss 00:00:30 -t 60 -acodec copy music_cut.mp3
# 截取时间不准确可以尝试加上 -copyts
ffmpeg -ss 00:00:30 -i music.mp3 -t 60 -acodec copy [-copyts] music_cut.mp3
# 合并多个视频, 不同格式的视频连接也许会有一些问题
ffmpeg -i "concat:01.mp4|02.mp4|03.mp4" -c copy out.mp4

参数解释

-copyts 保留时间戳, 保证时间准确

-sseof 从媒体末尾开始截取

修改音频参数

ffmpeg -i input.flac [-ar 44100] [-ab 192k] [-ac 2] output.mp3

参数解释

-ar 44100
设定音频采样率, 默认采用源视频的采样率
一般有 11025, 22050, 24000, 44100, 48000
11025 Hz 能达到 AM 调幅广播的声音品质
22050 Hz, 24000 Hz 能达到 FM 调频广播所用采样率
44100 Hz 达到音频 CD 的采样率

-ab 192k
设定音频比特率, 默认为 128 kbps
32 kbps, MW(AM) 质量, 高糊
96 kbps, FM 质量
128 kbps, 高音颤抖, 几乎无差别
192 kbps, 192 以上无差别

-ac 2
设定声道数, 默认采用源视频的声道数

修改视频参数

ffmpeg -i video.mp4 [-ss 10|0:10] [-s 1920x1080] [-pix_fmt yuv420p] [-preset medium] [-profile:v high] [-crf 23] [-r 30] [-b:a 128k] output.mp4

参数解释

-ss 0:10
指定时间

-s 1920x1080
设定视频的分辨率

-pix_fmt yuv420p
设置视频颜色空间, 一般有 yuv 和 rgb 和一些对应的压缩方式

-preset medium
编码器预设, 可以用 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo

-profile:v high
编码器配置
baseline: 实时通讯
main: 流媒体
high: 超清视频

-crf 23
设置码率控制模式, 范围 [0, 51], 一般在 [8, 28] 内

-r 30
设置视频帧率

-b a:128k
音频比特率, 与音频 -ab 选项相同

截图和水印

# 截取第 7 秒第 1 帧的画面
ffmpeg -i video.mp4 -ss 7 -vframes 1 video_image.jpg
# 截取第 0 秒到第 1 秒的所有画面
ffmpeg -i video.mp4 [-ss 0 -to 1] video-%03d.png
# 将图片重新合并成视频
ffmpeg -i video-%03d.png output.mp4
# 视频增加水印
ffmpeg -i video.mp4 -i watermark.png -filter_complex "overlay=20:80" video_output.mp4
# 截取 gif, 与视频剪辑一样
ffmpeg -i video.mp4 -ss 7.5 -to 8.5 [-s 640x320] [-r 15] video.dif
# -r 设置每秒帧数, -s 设置分辨率

# 将视频的前 30 帧转换成 gif
ffmpeg -i input.mp4 -vframes 30 -y -f gif output.gif

filter 功能

将视频下面一般替换为上面一半的上下对称形式

ffmpeg -i ${INPUT} -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" ${OUTPUT}
# [input] split [main][tmp];    将输入复制(split)成两份命名为 [main][tmp]
# [input] crop w:h:x:y [output];    将输入根据四个参数裁剪
# [input] vflip [output];    将输入水平反转(上下颠倒)
# [tmp] crop=iw:ih/2:0:0, vflip
# w 为 iw, h 为 ih/2, 宽度不变 高度为一半, 水平反转, 输出到 flip
# [main][flip] overlay=x:y [output]    将两路视频合并输出为一路视频, 第二个视频的左上角左边为 (x, y)
# [main][flip] overlay=0:H/2
# x 为 0, y 为 H (main 的 h)

ffmpeg -i ${INPUT} -vf "setopts=0.5*PTS" output.mp4
# 加/减速视频(音频原速) 0.5 表示二倍速

其他工具

ffprobe

ffprobe 是一个多媒体分析工具,可以获得一个视频或者音频的详细参数

ffprobe (-show_streams|-show_streams|....) [(-print_format|-of) (xml|ini|json|csv|flat)] ${FILE}
# -show_format 查看多媒体的封装格式
# -show_streams 查看多媒体文件的流信息
# [-show_data] -show_packets 查看每一数据包的信息
# -show_frames [-select_streams $select] 查看每一帧信息
# $select 可以为 a(只查看音频), v(只查看视频), s(只查看字幕)

# -of 指定输出的格式

show_format

ffprobe -show_format letter_song.mp3

返回内容

[FORMAT]                ;; -show_format 才会显示的内容
filename=letter_song.mp3   ;; 文件名
nb_streams=2            ;; 媒体中包含的流的个数
nb_programs=0           ;; 节目数
format_name=mp3         ;; 使用的封装模块的名称
format_long_name=MP2/3 (MPEG audio layer 2/3)
start_time=0.025056     ;; 媒体文件的起始时间
duration=335.124898     ;; 媒体文件的总时间长度
size=13447501           ;; 媒体文件的大小(字节)
bit_rate=321014         ;; 媒体文件的码率
probe_score=51
TAG:title=letter song (致十年后的我)
TAG:artist=ヲタみん (KUMI)
TAG:album=letter song
TAG:ID=8594724872
TAG:track=1
TAG:disc=0
TAG:genre=Blues
[/FORMAT]

show_streams

ffprobe -show_streams letter_song.mp3

返回内容

[STREAM]                ;; -show_streams 才会显示的内容
index=0                 ;; 流所在的索引区域
codec_name=mp3          ;; 编码名
codec_long_name=MP3 (MPEG audio layer 3)
profile=unknown         ;; 编码的 profile
codec_type=audio        ;; 编码类型
codec_time_base=1/44100 ;; 编码的时间戳计算基础单位
codec_tag_string=[0][0][0][0]
codec_tag=0x0000
sample_fmt=fltp
sample_rate=44100
channels=2
channel_layout=stereo
bits_per_sample=0
id=N/A
r_frame_rate=0/0        ;; 实际帧率
avg_frame_rate=0/0      ;; 平均帧率
time_base=1/14112000    ;; 时间基数
start_pts=353600
start_time=0.025057
duration_ts=4729282560
duration=335.124898
bit_rate=320000         ;; 码率
max_bit_rate=N/A        ;; 最大码率
bits_per_raw_sample=N/A
nb_frames=N/A           ;; 帧数
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=0
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
TAG:encoder=LAME3.99r
[SIDE_DATA]
side_data_type=Replay Gain
[/SIDE_DATA]
[/STREAM]
[STREAM]
index=1
codec_name=mjpeg
codec_long_name=Motion JPEG
profile=Baseline
codec_type=video
codec_time_base=0/1
codec_tag_string=[0][0][0][0]
codec_tag=0x0000
width=500
height=500
coded_width=500
coded_height=500
has_b_frames=0
sample_aspect_ratio=1:1
display_aspect_ratio=1:1
pix_fmt=yuvj444p
level=-99
color_range=pc
color_space=bt470bg
color_transfer=unknown
color_primaries=unknown
chroma_location=center
field_order=unknown
timecode=N/A
refs=1
id=N/A
r_frame_rate=90000/1
avg_frame_rate=0/0
time_base=1/90000
start_pts=2255
start_time=0.025056
duration_ts=30161241
duration=335.124900
bit_rate=N/A
max_bit_rate=N/A
bits_per_raw_sample=8
nb_frames=N/A
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=0
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=1
DISPOSITION:timed_thumbnails=0
TAG:comment=Cover (front)
[/STREAM]

show_data 和 -show_packets

ffprobe -show_data -show_packets ヲタみん.mp3

返回内容

[PACKET]                ;; -show_packets 才会显示的内容, 以其中一个数据包为例
codec_type=audio        ;; 多媒体类型, audio 或 video
stream_index=0          ;; 多媒体的 stream 索引
pts=368640              ;; 多媒体的显示时间值
pts_time=0.026122       ;; 根据不同格式计算过后的多媒体的显示时间
dts=368640              ;; 多媒体解码时间值
dts_time=0.026122       ;; 根据不同格式计算过后的多媒体解码时间
duration=368640         ;; 多媒体包占用的时间值
duration_time=0.026122  ;; 根据不同格式计算过后的多媒体包所占用的时间值
convergence_duration=N/A
convergence_duration_time=N/A
size=1045               ;; 多媒体包的大小
pos=43183               ;; 多媒体包所在的文件偏移位置
flags=K_                ;; 多媒体包标记,如关键包与非关键包的标记
data=                   ;; -show_data 才会显示的内容
00000000: fffb e244 ff8b ff73 84ad ab19 d625 0a30  ...D...s.....%.0
00000010: 45e0 312f b06a b60e d807 b1e0 4570 c21a  E.1/.j......Ep..
;; ....
00000400: 4981 2854 8894 9534 8467 566b 0dbe 3878  I.(T...4.gVk..8x
00000410: d36b a3a6 1b                             .k...
[/PACKET]

show_frames

ffprobe -show_frames ヲタみん.mp3

返回内容

[FRAME]                 ;; -show_frames 才会显示的内容,以其中一帧为例
media_type=audio        ;; 帧的类型, audio video 或 subtitle
stream_index=0          ;; 帧所在的索引区域
key_frame=1             ;; 是否为关键帧
pkt_pts=368640          ;; frame 包的 pts
pkt_pts_time=0.026122   ;; frame 包的 pts 时间显示
pkt_dts=368640          ;; frame 包的 dts
pkt_dts_time=0.026122   ;; frame 包的 dts 时间显示
best_effort_timestamp=368640            ;; frame 包的时长
best_effort_timestamp_time=0.026122     ;; frame 包的时长时间显示
pkt_duration=368640     ;; frame 包的时长
pkt_duration_time=0.026122              ;; frame 包的时长时间显示
pkt_pos=43183           ;; frame 包的文件偏移位置
pkt_size=1045
sample_fmt=fltp
nb_samples=1152
channels=2
channel_layout=stereo
[/FRAME]

ffplay

ffplay 提供播放功能。通过源码编译的 ffmpeg 不一定可以使用 ffplay 功能,需要安装对应的 SDL 模块

ffplay ${FILE}
上一页 BeautifulSoup
下一页 Python 协程