FFmpeg学习笔记
1、官网下载
官网下载地址:http://ffmpeg.org/download.html
3大组件:
1、ffmpeg 转换多媒体内容;
2、ffplay 简介播放器。比如:ffplay 视频名称.mp4
;
3、ffprobe 媒体参数分析工具。比如:ffprobe 视频名称.mp4
;
2、视频格式转换
2.1、常见视频格式
视频格式 | 说明 |
---|---|
RMVB | 较为封闭 |
MKV | 最开放 几乎支持所有的音视频 但体积太大 |
AVI | 有点老 已经不适应最近的音视频 |
MOV | 主流 苹果公司制定、支持透明视频 |
MP4 | 最主流 软硬件厂商都大力支持 |
2.2、转换命令
ffmpeg -i input.mov output.mp4
2、视频转码
# 查看命令
ffmpeg -h #最基本命令
ffmpeg -h long #较丰富的命令
ffmpeg -h full #全部命令
ffmpeg -h full | findstr 264 #检索带有字符串246的命令
2.1、基础说明
查看ffmpeg支持的编解码类型列表
ffmpeg -codecs
1080p之下的编码方案:
目前首先方案:MP4 封装:H264 视频编码 + AAC 音频编码
google方案:WebM 封装:VP8 视频编码 + Vorbis 音频编码
完全开源的编码方案:OGG 封装:Theora 视频编码 + Vorbis 音频编码
转码命令
ffmpeg -i 好音乐0603-01.mp3 -acodec libmp3lame -ar 44100 -ab 320k -ac 2 out.mp3
# -i 输入的文件
# -acodec a是audo,音频的缩写。codec:编解码器
# libmp3lame mp3的编码器,此处可省略。当输出文件后缀为mp3时,ffmpeg会自动识别为当前编码格式
# -ar 44100 音频采样率。如果不输入时,默认为原音频的采样率。一般为:48khz和44.1khz
# -ab 320k 设置音频的比特率。如果不输入时,ffmpeg默认为128k
# -ac 2 双声道。1单声道、2双声道立体声。默认为原音频的声道数。
# out.mp3 新的文件名和后缀。
2.2、实战
将webm的4k文件,转换为1080p的视频文件。
ffmpeg -i in.webm -s 1920x1080 -pix_fmt yuv420p \
-vcodec libx264 -preset medium -profile:v high -level:v 4.1 \
-crf 23 -acodec aac -ar 44100 -ac 2 -b:a 128k out.mp4
# -s 缩放视频尺寸。1920x1080 即为新视频的宽高。
# -pix_fmt 设置视频颜色空间。支持:yuv、nv、rgb......。具体可使用命令:ffmpeg -pix_fmts 查询。
# -vcodec 设置视频流的编码器指令。libx264是H264的软件编码器。一般都用libx264,较为通用、稳定、非常好。
# -preset 编码器的预设。可选参数包括:ultrafast superfast veryfast(录制视频时、快,但体积较大)
faster fast medium(默认类型) slow slower
veryslow(压缩视频、慢、可精准压缩) placebo。
# -profile:v 指定编码器的配置,主要是合压缩比有关。(实时通信一般领域采用:baseline、流媒体采用:main、超清视频:high)
# -level:v 对编码器配置的具体规范和限制,压缩比和画质。区间包括:(1~5.2)。一般情况下,1080p的视频,就用4.1。
# -crf 设置码率控制模式/恒定速率因子模式。视频的质量。参数:0~18~23~28~51都行。默认值为:23。数值越小质量越稿。
0表示无损的画质。一般在8~28之间选择。
# -acodec 视频格式编码器aac
# -ar 44100 音频采样率。如果不输入时,默认为原音频的采样率。一般为:48khz和44.1khz
# -ac 2 双声道。1单声道、2双声道立体声。默认为原音频的声道数。
# -b:a 等于 -ab。设置音频比特率。目前大部分视频网站限制视频流比特率为:128kb/s或192kb/s。
改变视频尺寸和格式
ffmpeg -i test_1920x1080.mp4 -acodec copy -vcodec libx264 -s 1280x720 test_1280x720.flv
ffmpeg -i test_1920x1080.mp4 -acodec copy -vcodec libx265 -s 1280x720 test_1280x720.mkv
保持编码格式
ffmpeg -i test.mp4 -vcodec copy -acodec copy test_copy.ts
ffmpeg -i test.mp4 -codec copy test_copy2.ts
改变编码格式
ffmpeg -i test.mp4 -vcodec libx265 -acodec libmp3lame out_h265_mp3.mkv
修改帧率
ffmpeg -i test.mp4 -r 15 output.mp4
修改视频码率
ffmpeg -i test.mp4 -b 400k output_b.mkv
修改视频码率
ffmpeg -i test.mp4 -b:v 400k output_bv.flv
修改音频码率
ffmpeg -i test.mp4 -b:a 192k output_ba.mp4
修改音频视频码率
ffmpeg -i test.mp4 -b:v 400k -b:a 192k output_bva.mp4
修改视频分辨率
ffmpeg -i test.mp4 -s 480x270 output_480x270.mp4
修改音频采样率
ffmpeg -i test.mp4 -ar 44100 output_44100hz.mp4
2.3、提取视频流
ffmpeg -i in.mp4 -vcodec copy -an v.mp4
2.4、提取音频流
ffmpeg -i in.mp4 -vn -acodec copy a.m4a
# 多个音频流时,提取具体的某个音频流
ffmpeg -i in.mp4 -vn -acodec -map 0:3 copy a.m4a
2.5、合并音视频流
# 同一个文件分离出来的,提取出来时也没改动,所以合并时,无需再编码。
ffmpeg -i a.m4a -i v.mp4 -c copy out.mp4
2.5.1、完整版视频拼接流程
# 1、将所有待拼接视频段,分别转换为ts格式
ffmpeg -i 1.mp4 -codec copy -vbsf h264_mp4toannexb 1.ts
ffmpeg -i 2.mp4 -codec copy -vbsf h264_mp4toannexb 2.ts
ffmpeg -i 3.mp4 -codec copy -vbsf h264_mp4toannexb 3.ts
# 2、以TS格式进行拼接
## 方法1:
ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out_ts.mp4
## 方法2:
ffmpeg -f concat -i tslist.txt -codec copy out_ts2.mp4
tslist.txt
file '1.ts'
file '2.ts'
file '3.ts'
说明:
1、把每个视频封装格式统一为ts流,拼接输出的时候再输出你需要的封装个是,比如MP4;
2、视频分辨率可以不同,但是编码格式需要统一;(若分辨率不同时,最终合成视频以第一个视频的分辨率为准)
3、音频编码格式需要统一,音频参数(采样率/声道等)也需要统一;
2.6、截取连接音视频
2.6.1、截取音视频
# 方式一
ffmpeg -i in.mp3 -ss 00:01:00 -to 00:01:10 -acodec copy out.mp3
# 方式二
ffmpeg -i in.mp3 -ss 00:01:00 -t 10 -acodec copy out.mp3
# 方式三(注意-ss后面的单位,可以精确到毫秒)
ffmpeg -i 远走高飞.m4a -ss 00:00:53.20 -to 00:04:01 -acodec copy out2.m4a
2.6.2、连接音视频
ffmpeg -i "concat:01.mp4|02.mp4|03.mp4" -c copy out.mp4
2.6.3、视频增加封面图
ffmpeg -i www.mp4 -i 李老师-006.JPG -map 0 -map 1 -c copy -c:v:1 png -disposition:v:1 attached_pic 111111111111.mp4
2.6.4、利用水印原理将视频的前0.1秒用图片覆盖
ffmpeg -threads 8 -i 001.mp4 -vf "movie=c2.jpg,scale=1920:1080[watermask];[in][watermask] overlay=0:0:enable='between(t,0,0.1)" -y out.mp4
2.7、截图、水印、动图
2.7.1 截图
# 截取第5秒的第1帧画面
ffmpeg -i in.mp4 -ss 5 -vframes 1 img.jpg
# -ss 起点,单位秒
# 视频截取封面,1秒5祯,并且压缩到160*90
ffmpeg -i 少年-0719--23.mov -s 160x90 -vf fps=5 wc/image%d.jpg
图片和视频转换
ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.jpg
ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.bmp
# -f 格式
# image2 是一种格式
# -vframes 帧,如果大于1,那么输出加 %03d,比如:test%03d.jpg
# -s 格式大小
视频每帧一张图片
ffmpeg -i test.mp4 -t 5 -s 640x360 -r 15 frame%03d.jpg
# -t 5 截取5秒的图片
# -r 15 美妙截取15帧
图片转换为视频
ffmpeg -f image2 -i frame%03d.jpg -r 25 video.mp4
2.7.2 水印
# 将水印图logo.png覆盖到视频的左上角,距顶部20,距左20的位置
ffmpeg -i in.mp4 -i logo.png -filter_complex "overlay=20:20" out.mp4
2.7.3 gif动图
# 将视频in.mp4从7.5秒截取到8.5秒 缩放大小到640x320 降低帧率为15 输出到out.gif
ffmpeg -i in.mp4 -ss 7.5 -to 8.5 -s 640x320 -r 15 out.gif
# -r 帧率
# -t 时长,单位秒
# -to 截止时间
# -s 分辨率
从视频中生成GIF图片
ffmpeg -i test.mp4 -t 5 -r 1 image1.gif
ffmpeg -i test.mp4 -t 5 -r 25 -s 640x360 image2.gif
将GIF转为视频
ffmpeg -f gif -i image2.gif image2.mp4
2.7.4 可可发现的avi录屏视频转m3u8报错处理(视频源帧数中没有PTS问题处理)
# 增加以下参数
-fflags +genpts
补充资料
获取视频信息
ffprobe -v quiet -print_format json -show_format -show_streams 101.mp4
# 不让log影响输出显示
ffprobe -v quiet
# 输出格式为json
-print_format json
# 显示输入多媒体流的容器格式信息
-show_format
# 显示输入多媒体流中每一个流的信息
-show_streams
最简单的用法
ffprobe -i 101.mp4
临时笔记
ffmpeg -i %s -vcodec %s -s %dx%d -acodec %s -threads 1 -f %s -y %s
ffmpeg -i D:\tmp\少年.mp4 -vcodec libx264 -s 640x360 -acodec aac -threads 2 -f avi -y 少年_640.avi -vcodec libx264 -s 960x540 -acodec aac -threads 2 -f avi -y 少年_960.avi
ffmpeg -i 少年.mp4 -vbsf h264_mp4toannexb -vcodec libx264 -acodec aac -strict -2 -s 640x480 -r 30 -g 60 -start_number 0 -hls_time 5 -hls_list_size 0 -threads 1 -f hls -y aa.m3u8
ffmpeg -i 101.mp4 -vf "drawtext=fontfile='D\:/simhei.ttf':text='hello, 你 好 ffmpeg':x=(mod(2*n\,w+tw)-tw):y=10:fontcolor=#FF6600:fontsize=60" -f mp4 -y 101test.mp4
#静止
ffmpeg -i 101.mp4 -vf "drawtext=fontfile='D\:/simhei.ttf':text='hello, 你 好 ffmpeg':x=10:y=10:fontcolor=#FF6600:fontsize=60" -f mp4 -y 101test.mp4
临时记录
//截取从头开始的30s
ffmpeg -ss 00:00:00 -t 00:00:03 -i input.mp4 -vcodec libx264 -acodec aac -crf 23 -s 1920x1080 split.mp4
//截取从30s开始的30s
ffmpeg -ss 00:00:00 -t 00:00:16 -i input2.MOV -s 1920x1080 split1.mp4
//进行视频的合并
ffmpeg -i input.mp4 -y -qscale 0 -vcodec libx264 -s 1920x1080 a1_1920x1080.mp4
ffmpeg -i input2.mp4 -y -qscale 0 -vcodec libx264 -s 1920x1080 a2.mp4
ffmpeg -f concat -i filelist.txt -c copy concat_1280x721.mp4
filelist.txt
file 'a1.mp4'
file 'a2.mp4'
临时记录2
ffmpeg转码同时,将视频基础信息前置命令
ffmpeg -i 一个视频上传.mp4 -codec copy -movflags faststart 456.mp4