文章目录
- 前言
- 一、视频
-
- [1.1 修改格式转码](#1.1 修改格式转码)
- [1.2 截取片段](#1.2 截取片段)
- [1.3 合并多个视频](#1.3 合并多个视频)
- [1.4 裁剪区域](#1.4 裁剪区域)
- [1.5 修改分辨率](#1.5 修改分辨率)
- [1.6 翻转视频](#1.6 翻转视频)
- [1.7 调整速度](#1.7 调整速度)
- [1.8 多个视频拼接](#1.8 多个视频拼接)
- [1.9 添加字幕](#1.9 添加字幕)
- [1.10 修改文件封面](#1.10 修改文件封面)
- [1.11 添加文字水印](#1.11 添加文字水印)
- [1.12 制作画中画](#1.12 制作画中画)
- [1.13 音视频混合/分离](#1.13 音视频混合/分离)
- [1.14 视频直播推流](#1.14 视频直播推流)
- [1.15 m3u8切片](#1.15 m3u8切片)
- 二、音频
-
- [2.1 视频提取音频](#2.1 视频提取音频)
- [2.2 修改格式转码](#2.2 修改格式转码)
- [2.3 裁剪音频](#2.3 裁剪音频)
- [2.4 合并音频](#2.4 合并音频)
- [2.5 调整音量](#2.5 调整音量)
- [2.6 调整速度](#2.6 调整速度)
- [2.7 采样率](#2.7 采样率)
- [2.8 音频降噪](#2.8 音频降噪)
- 参考
前言
FFmpeg 是一个强大的开源多媒体框架,被广泛应用于视频编辑、视频转码、流媒体处理、视频直播等领域。
FFmpeg 包含了一系列的库和工具,用于处理和操作音视频文件。这些库包括音视频编解码器、格式转换器、滤镜、封装器等,可以处理几乎所有常见的音视频格式.
- 源码 github 地址:https://github.com/FFmpeg/FFmpeg
- release windows 版本 :https://www.gyan.dev/ffmpeg/builds/#release-builds
ffmpeg 相关命令行语法如下:
bash
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
一、视频
1.1 修改格式转码
bash
# 将mp4格式转化为avi格式
ffmpeg -i input.mp4 output.avi
# 转码不清晰,指定比特率
ffmpeg -i input.mp4 -b:v 20000k output.mp4
1.2 截取片段
bash
# 从时间2分钟往后截取30秒
ffmpeg -ss 00:02:00 -t 30 -i input.mp4 -c:v copy -c:a copy output1.mp4
# 从时间2分钟往后截取到2分30秒
ffmpeg -ss 00:02:00 -to 00:02:30 -i input.mp4 -c:v copy -c:a copy output2.mp4
上述命令实际测试会发现多 1s,可通过减一秒实现
1.3 合并多个视频
bash
# 第一种,先转化为ts,再合并
ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input1.ts
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input2.ts
ffmpeg -i "concat:input1.ts|input2.ts" -c copy -bsf:a aac_adtstoasc output.mp4
# 第二种, 建一个文件file.txt,内容如下,包含所要合并视频文件名字,注意,每行要以file起始
# file input1.mp4
# file input2.mp4
ffmpeg -f concat -i file.txt -c copy output.mp4
# 上述两种是相同码率分辨率的视频
# 第三种,分辨率如果不同,可用-filter_complex实现
# 下面就是将两个输入文件的视频流分辨率都转为1024x576,然后合并
ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0:v]scale=1024:576:force_original_aspect_ratio=1[v0]; [1:v]scale=1024:576:force_original_aspect_ratio=1[v1]; [v0][0:a][v1][1:a]concat=n=2:v=1:a=1[v][a]" -map [v] -map [a] output.mp4
# 可去掉音频
ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0:v][1:v]concat=n=2:v=1:a=0[outv]" -map "[outv]" -strict -2 output.mp4
# [0:v] 和 [1:v] 是视频流的输入标签,表示要连接的第一个和第二个视频文件。
# concat=n=2:v=1:a=0[outv] 部分定义了连接的方式:n 表示输入的文件数,v=1表示1个输出视频流,a=0表示0个输出音频流,[outv] 是输出标签。
# -map "[outv]" 用于将输出的视频流映射到输出文件。
# -strict -2 用于确保兼容性。
1.4 裁剪区域
bash
# 截图将第20s截取为1张352x240的jpg
ffmpeg -ss 20 -i input1.mp4 -y -f image2 -t 0.001 -s 352x240 output.jpg
# 截取第一帧
ffmpeg -i input1.mp4 -y -f image2 -frames 1 cover_1f.jpg
# 裁剪部分区域视频
ffmpeg -i input1.mp4 -filter:v "crop=w=500:h=500:x=12:y=34" output.mp4
# 抖动裁剪
ffmpeg -i input1.mp4 -filter:v "crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2)*sin(n/10):(in_h-out_h)/2 +((in_h-out_h)/2)*sin(n/7)" output.mp4
1.5 修改分辨率
bash
# 转化视频分辨率为960x540
ffmpeg -i input1.mp4 -vf scale=960:540 output.mp4
# 转化为缩略图大小分辨率
ffmpeg -i input1.mp4 -vf scale=qcif output.mp4
# 长宽都缩小一半
ffmpeg -i input1.mp4 -vf scale=w=iw/2:h=ih/2 output.mp4
1.6 翻转视频
bash
# 水平翻转
ffmpeg -i input1.mp4 -vf "hflip" output.mp4
# 垂直翻转
ffmpeg -i input1.mp4 -vf "vflip" output.mp4
1.7 调整速度
bash
# 视频加速,2倍速,音频也实现加速
ffmpeg -i input1.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mp4
# 减速
ffmpeg -i input1.mp4 -filter_complex "[0:v]setpts=2*PTS[v];[0:a]atempo=0.5[a]" -map "[v]" -map "[a]" output.mp4
1.8 多个视频拼接
bash
# 将视频横向拼接
ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex hstack output.mp4
# 竖向拼接
ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex vstack output.mp4
# 四宫格
ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -i input4.mp4 -filter_complex "[0:v]scale=960:540 [s1]; [1:v]scale=960:540 [s2]; [2:v]scale=960:540 [s3]; [3:v]scale=960:540 [s4]; [s1][s2]hstack[top]; [s3][s4]hstack[bottom]; [top][bottom]vstack" output.mp4
1.9 添加字幕
bash
# 内嵌字幕
ffmpeg -i input1.mp4 -i subtitle.ass -c copy -c:s mov_text output.mp4
ffmpeg -i input1.mp4 -vf "ass=subtitle.ass" output.mp4
1.10 修改文件封面
bash
# 给视频文件添加封面
ffmpeg -i input1.mp4 -i qizai.jpg -map 1 -map 0 -c copy -disposition:0 attached_pic output.mp4
1.11 添加文字水印
bash
# 文字水印,中文需要指定字体文件
ffmpeg -i input1.mp4 -vf "drawtext=text='中文水印':x=10:y=10:fontsize=24:fontcolor=white:fontfile=msyh.ttc" output.mp4
1.12 制作画中画
bash
# 实现视频添加视频
ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[1:v]scale=320:240 [pip]; [0:v][pip]overlay=W-w-20:y=H-h-10" output.mp4
# 左上角添加图片
ffmpeg -i input1.mp4 -i qizai.jpg -filter_complex "overlay=20:10" output.mp4
# 右下角加图片
ffmpeg -i input1.mp4 -i qizai.jpg -filter_complex "overlay=W-w-20:H-h-10" output.mp4
1.13 音视频混合/分离
bash
# 混合音频和视频
ffmpeg -i input.mp4 -i input.mp3 -map 0:v:0 -map 1:a:0 -c:v copy -c:a copy output.mp4
# 分离音视频
ffmpeg -i input1.mp4 -vn output.mp3
ffmpeg -i input1.mp4 -an output.mp4
1.14 视频直播推流
bash
# rtmp为推流地址
ffmpeg -re -stream_loop -1 -i input.mp4 -c copy -f flv "${rtmp}"
1.15 m3u8切片
bash
# mp4转m3u8
ffmpeg -i input.mp4 -profile:v baseline -level 3.0 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls output.m3u8
# m3u8转mp4
ffmpeg -i output.m3u8 -vcodec copy -acodec copy -absf aac_adtstoasc output.mp4
二、音频
2.1 视频提取音频
bash
# 提取音频
ffmpeg -i input1.mp4 -vn -map 0:a:0 -c:a libmp3lame -q:a 2 output.mp3
2.2 修改格式转码
bash
# 将wav转为mp3
ffmpeg -i input.wav input.mp3
2.3 裁剪音频
bash
# 和视频类似,裁剪
ffmpeg -ss 00:00:10 -i input.mp3 -t 10 output.mp3
2.4 合并音频
bash
# 合并音频
ffmpeg -i "concat:input1.mp3|input2.mp3" -acodec copy output.mp3
2.5 调整音量
bash
# 将音量变为2倍
ffmpeg -i input.mp3 -vn -af "volume=2.0" output.mp3
# 减少6分贝
ffmpeg -i input.mp3 -vn -af "volume=-6dB" output.mp3
2.6 调整速度
bash
# 2倍速
ffmpeg -i input.mp3 -filter:a "atempo=2.0" -vn output.mp3
2.7 采样率
bash
# 修改音频采样率
ffmpeg -i input.mp3 -ar 44100 output.mp3
2.8 音频降噪
bash
# 过滤掉200hz及以下频率和过滤掉3000hz及以上频率
ffmpeg -i 1.wav -af "highpass=f=200, lowpass=f=3000" output.mp3
ffmpeg -i 1.wav -af "highpass=200,lowpass=3000,afftdn" output.mp3