ffmpeg下载地址

编码格式

# 查看所有支持的编码
ffmpeg -codecs

# 格式转换
ffmpeg -i input.mp4 output.mov

主流的编码格式有

  • MP4(H264视频编码 + AAC音频编码)
  • WebM(VP8视频编码 + Vorbis音频编码)
  • OGG(Theora视频编码 + Vorbis音频编码)

音频编码

ffmpeg -i input.flac -acodec libmp3lame -ar 44100 -ab 320k -ac 2 out.mp3

# 根据文件后缀自动选择编码格式
ffmpeg -i input.flac -ar 44100 -ab 320k -ac 2 out.mp3

-acodec: 音频编码格式 libmp3lame(mp3编码格式)
-ar: 采样率 (默认原视频的采样率)
-ab: 比特率 (默认128k)
-ac: 声道   (默认原音频声道数)

视频编码

ffmpeg -i input.mp4 -s 1920x1080 -pix_fmt yuv420p -vcodec libx264 -preset medium -profile:v high -level:v 4.1 -crf 23 -acodec aac -ar 44100 -ac 2 -ab 128k output.mp4

-s: 缩放尺寸
-pix_fmt: 视频颜色空间
	YUV、NV、RGB...
	网络视频一般都是yuv420p
-vcodes: 视频编码格式
libx264: h264的软件编码器
-preset: 编码器预设,改变编码算法的精度,精度越高速度越慢
	ultrafast superfast veryfast faster fast
	medium slow slower veryslow placebo
	默认值medium,一般录制视频选择veryfast,压制视频的时候选择veryslow
-prefile:v 指定编码器的配置,和压缩比有关
	实时通讯:baseline
	流媒体:main
	超清视频:high
-level:v 编码器的具体配置,压缩比和画质不可兼得
	范围:1-5.2
	一般1080视频使用4.1
-crf: 码率控制模式(恒定速率因子模式)
	范围:0-51,数字越小质量越高,0表示无损画质,一般在18-28选择
-r: 帧率
-acodec: 音频编码器

视频处理

# copy表示按照原视频音频的编码格式

# 只提取视频
ffmpeg -i input.mp4 -vcodec copy -an v.mp4

# 只提取音频
ffmpeg -i input.mp4 -acodec copy -vn a.m4a
ffmpeg -i input.mp4 -f mp3 -vn output.mp3

# 合并音频和视频
ffmpeg -i a.m4a -i v.mp4 -c copy out.mp4

# 截取视频
ffmpeg -ss 00:00:00 -t 00:00:30 -i input.mp4 -vcodec copy -acodec copy output.mp4

视频拼接

  • 使用mpeg文件进行拼接(文件大、速度慢)

    先讲mp4转为mpg格式,然后合并转换为mp4格式。

    ffmpeg -i 1.mp4 -qscale 4 1.mpg
    ffmpeg -i 2.mp4 -qscale 4 2.mpg
    cat 1.mpg 2.mpg | ffmpeg -f mpeg -i - -qscale 6 -vcodec mpeg4 output.mp4
  • 使用ts拼接(文件小、速度快)

    先讲mp4转为ts格式,然后合并转换为mp4格式。

    ffmpeg -i 1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts
    ffmpeg -i 2.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 2.ts
    ffmpeg -i "concat:1.ts|2.ts" -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4
    
  • 照片和音频合成视频

    ffmpeg -r 60 -f image2 -loop 1 -i b0001.png -i B0001.mp3 -s 1920x1080 -pix_fmt yuvj420p -t 53 -vcodec libx264 B0001.mp4

    -r: 帧数,-f:图片格式,-loop:循环,-i:输入,-s:分辨率,-pix_fmt:图片输入格式,-t:时长,-vcodes:编码。

  • 通过文件拼接

    ffmpeg -f concat -i list.txt -c copy concat.mp4
    
    file 1.mp4
    file 2.mp4

音频处理

# 截取[1分钟,1分钟10秒]
ffmpeg -i a.mp3 -ss 00:01:00 -to 00:01:10 -acodec copy out.mp3
ffmpeg -i a.mp3 -ss 01:00 -to 01:00 -acodec copy out.mp3
ffmpeg -i a.mp3 -ss 60 -to 70 -acodec copy out.mp3
ffmpeg -i a.mp3 -ss 60 -t 10 -acodec copy out.mp3

# 截取后10s音频
ffmpeg -sseof -00:10  -i a.mp3   -acodec copy out.mp3

# 合并音频
ffmpeg -i "concat:1.mp3|2.mp3" -acodec copy output.mp3

-ss: 开始时间
-to: 结束时间
-t: 截取时长
-sseof: 音频末尾
ffmpeg -i a.mp3 -ss 01:00 -to 01:10 -c copy out.mp3
ffmpeg -ss 01:00 -i a.mp3 -to 01:10 -c copy out.mp3
ffmpeg -ss 01:00 -i a.mp3 -to 01:10 -c copy -copyts out.mp3

上面三种都是剪切01::00 - 01:10区间的视频,但是把-ss放到前面会采用关键帧技术,截取之后的视频,播放器的区间可能会识别错误(第二种操作),可以使用-copyts来保留时间戳。

图片处理

  • 截图

    ffmpeg -i input.mp4 -ss 5 -vframes 2 img1.jpg   
    -ss: 第5秒
    -vframes: 指定帧数
  • 水印

    ffmpeg -i input.mp4 -i JB.ico -filter_complex "overlay=10:30" out.mp4
    
    -filter_complex: 设置滤镜
    overlay=10:30: 左上角,距离左边10,距离右边30
  • 动图

    ffmpeg -i test.mp4 -ss 5 -to 12 -s 360x360 -r 15 out.gif
  • 将照片合成视频或动图

    cat ./*.jpg | ffmpeg -framerate 1 -f image2pipe -i - out.gif
    cat ./*.jpg | ffmpeg -framerate 1 -f image2pipe -i - out.avi

录屏

只能录制屏幕不包含音频。

ffmpeg -f gdigrab -i desktop rec.mp4

-f: 格式化
gdigrab: 用来捕获视频设备

录像

ffmpeg -f v4l2 -framerate 60 -video_size 1920x1080 -i /dev/video0 -t 3600 out.mp4

直播

ffmpeg -re -i rec.mp4 网站视频的编码 -f flv "rtmp地址/推流码"

添加字幕

# mkv格式的软字幕 
ffmpeg -i input.mp4 -i input.srt -c copy output.mkv