ffmpeg 是一个非常流行且好用的图像、音视频处理工具。可以实现视频分割,截图,转码,合并,水印处理等常见媒体操作。它的作者也是一个非常厉害的人,感兴趣的同学可以查查。
- 【音频拼接】✓
# 非wav 速度快,需要 声道/采样率/比特率 一致
ffmpeg -i concat:"input01.mp3|input02.mp3" -avoid_negative_ts 1 -map 0:a -acodec copy -y result.mp3
# 非wav 速度慢,无需一致(重编码)
ffmpeg -i concat:"input01.mp3|input02.mp3" -avoid_negative_ts 1 -map 0:a -acodec libmp3lame -y result.mp3
# wav 根据需要拼接的数量修改参数[0:0][1:0].... n=2、n=3...
ffmpeg -i input01.wav -i input02.wav -filter_complex "[0:0][1:0]concat=n=2:v=0:a=1[out]" -map "[out]" -map 0:a -y result.wav
- 【音频混合】✓
# 参数duration first:按照第一个时长;longest:按照最长的音频、shortest:按照最短的时长
ffmpeg -i input.mp3 -i input01.mp3 -map 0:a -filter_complex amix=inputs=2:duration=longest:dropout_transition=2 -acodec libmp3lame -y result.mp3
- 【音频剪切】✓
# 非WAV
ffmpeg -ss 00:00:00.000 -to 00:10:00.000 -accurate_seek -i input.mp3 -map 0:a -y result.mp3
# wav
# 需要在输入文件后面增加 -c:a copy -avoid_negative_ts 1
ffmpeg -ss 00:00:00.000 -to 00:10:00.000 -accurate_seek -i input.wav -c:a copy -avoid_negative_ts 1 -map 0:a -y result.wav
- 【格式转换】✓
ffmpeg -i input.mp3 -map 0:a -ac 2 -ar 44100 -ab 128k -y result.mp3
参数 | 描述 | 值 | 编码器 |
---|---|---|---|
-ac | 声道(默认原声道) | 单声道:1;双声道:2 | |
-ar | 采样率(Hz) | 22050、32000、44100、48000 | |
-ab | 比特率(默认128k) | 48k、96k、192k、256k、320k | |
-acodec | 目标格式编码 | mp3 | libmp3lame |
wav | pcm_s16le | ||
flac | flac | ||
ac3(未测试) | ac3_fixed | ||
aiff | pcm_s16be | ||
m4a(暂不支持) | libaac | ||
aac(暂不支持) | libaac | ||
ra(未测试) | ac3 | ||
wma(暂不支持) | wmav2 | ||
ogg | libvorbis |
- 采样率(Hz):44100、44056、32000、22050、16000、11025、8000
- 比特率(kbit/s):128、320、256、224、192、160、144、128、112、96、80、64、56、48、40、32
- 【音量调整】✓
# -v 256 默认值256为100%音量(弃用)
ffmpeg -i input.mp3 -map 0:a -y result.mp3 -acodec copy -vol 256
# -音量降到2/3
ffmpeg -i input.mp3 -map 0:a -y result.mp3 -acodec copy -af volume=2/3
# 增加10分贝
ffmpeg -i input.mp3 -map 0:a -y result.mp3 -acodec copy -af volume=10dB
- 【去噪】✓
备注:需要用wav的音频
# 视频中提取视频、音频
ffmpeg -i input.mp4 -vcodec copy -an tmpvid.mp4
ffmpeg -i input.mp4 -acodec pcm_s16le -ar 128k -vn tmpaud.wav
# 手动截取噪音样本
ffmpeg -ss 00:00:00.000 -to 00:10:00.000 -accurate_seek -i inputTemp.wav -acodec pcm_s16le -avoid_negative_ts 1 -map 0:a -y nosieSample.wav
# 生成降噪配置文件
sox nosieSmple.wav -n noiseprof nosiepf.prof
# 音频降噪音 0.21 指的是灵敏度(0.2-0.3之间的效果比较好) 默认是0.5
sox inputTemp.wav result.wav noisered nosiepf.prof 0.21
- 【人声分离】✓
# 1、安装conda环境 https://www.jianshu.com/p/434eaf3af5f4?ivk_sa=1024320u
# 2、创建python3.7虚拟环境
# 3、搭建spleeter环境
conda install -c conda-forge ffmpeg libsndfile
pip install tensorflow -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
conda install -c conda-forge spleeter
# 处理音频 会生成两个音频(背景.wav、人声.wav)
spleeter separate -i 1.mp3 -p spleeter:2stems -o output
- 【增强人声】✓
备注:通过背景分离后,针对人声音频进行放大,然后在进行混音。调节:0-100%
- 【音频压缩】✓
# 数据量(字节/秒)= (采样频率(Hz)* 采样位数(bit)* 声道数)/ 8
# 比特率=采样率* 采样位数*声道数
# 例如:对于5分钟双声道、16位采样位数、44.1kHz采样频率声音的不压缩数据量的计算
# 数据量=[44.1×1000×16×2×(5×60)]/(8×1024×1024)= 50.47MB
# 如果需要固定输出格式,则需要添加 -acodec libmp3lame 指定对应
ffmpeg -i input.mp3 -map 0:a -ar 44100 -ab 128k -y result.mp3
- 【淡入淡出】✓
备注:建议范围 (淡入:0.0-3.0;淡出:0.0-3.0)
# 单音频开始/结尾淡入淡出 各10秒 159代表 音频总时长169s-10s=159s
ffmpeg -i input.mp3 -map 0:a -af "afade=t=in:ss=0:d=10,afade=t=out:st=159:d=10" -y result.mp3
# 淡入 做5秒的淡入
ffmpeg -i input.mp3 -map 0:a -filter_complex afade=t=in:ss=0:d=4 -y result.mp3
# 淡出 从20秒开始持续6秒淡出
ffmpeg -i input.mp3 -map 0:a -filter_complex afade=t=out:st=20:d=6 -y result.mp3
# 多音频交叉淡入淡出(10代表交叉区域时间)
# 该命令将input01.mp3(时长2分49秒)和input02.mp3(时长2分49秒)文件合并,合并后文件时长(5分30秒),它会将input01.mp3文件最后和input02.mp3前各取10秒进行混合,然后实现音频播放淡入淡出的过度效果
ffmpeg -i input02.mp3 -i input02.mp3 -map 0:a -filter_complex acrossfade=d=10:c1=exp:c2=exp -y result.mp3
- 【合唱】✓
备注:为实现强度调节
# 2人合唱效果
ffmpeg -i input.mp3 -map 0:a -af "chorus=0.7:0.9:55:0.4:0.25:2" -y result.mp3
- 【均衡器】《暂无解决方案》
- 60Hz(db):-15.0→15.0
- 230Hz(db):-15.0→15.0
- 910Hz(db):-15.0→15.0
- 3600Hz(db):-15.0→15.0
- 14000Hz(db):-15.0→15.0
- 【低音提升】《暂无解决方案》
- 调节:0-100%
- 【卡拉OK】《暂无解决方案》
- 调节:0-100%
- 【独唱】《暂无解决方案》
- 调节:0-100%
- 【声道转换】✓
# 双声道 => 单声道
ffmpeg -i input.mp3 -map 0:a -ac 1 -y result.mp3
# 单声道 => 双声道
ffmpeg -i input.mp3 -map 0:a -ac 2 -y result.mp3
# 双声道 => 只剩左声道
ffmpeg -i input.mp3 -af "pan=0x3|c0=c0" left.wav
# 双声道 => 只剩右声道
ffmpeg -i input.mp3 -af "pan=0x3|c1=c1" right.wav
# 双声道提取成两个音频(两个音频文件左右喇叭都有声音)
ffmpeg -i input.mp3 -map_channel 0.0.0 left.wav -map_channel 0.0.1 right.wav
# 两个音频合并成双声道
ffmpeg -i left.wav -i right.wav -filter_complex "[0:a][1:a]amerge=inputs=2[aout]" -map "[aout]" result.wav
- 【查看音频信息】✓
备注:以JSON形式输出
# -v:调试信息级别(quiet、panic、fatal、error、warning、info、verbose、debug)
ffprobe -i input.mp3 -v quiet -print_format json -show_format -show_streams
# 样例
{
"streams": [
{
"index": 0,
"codec_name": "mp3",
"codec_long_name": "MP3 (MPEG audio layer 3)",
"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,
"r_frame_rate": "0/0",
"avg_frame_rate": "0/0",
"time_base": "1/14112000",
"start_pts": 353600,
"start_time": "0.025057",
"duration_ts": 15479562240,
"duration": "1096.907755",
"bit_rate": "128000",
"disposition": {
"default": 0,
"dub": 0,
"original": 0,
"comment": 0,
"lyrics": 0,
"karaoke": 0,
"forced": 0,
"hearing_impaired": 0,
"visual_impaired": 0,
"clean_effects": 0,
"attached_pic": 0,
"timed_thumbnails": 0
},
"tags": {
"encoder": "LAME3.99r"
},
"side_data_list": [
{
"side_data_type": "Replay Gain"
}
]
},
{
"index": 1,
"codec_name": "png",
"codec_long_name": "PNG (Portable Network Graphics) image",
"codec_type": "video",
"codec_time_base": "0/1",
"codec_tag_string": "[0][0][0][0]",
"codec_tag": "0x0000",
"width": 0,
"height": 0,
"coded_width": 0,
"coded_height": 0,
"closed_captions": 0,
"has_b_frames": 0,
"level": -99,
"color_range": "pc",
"refs": 1,
"r_frame_rate": "90000/1",
"avg_frame_rate": "0/0",
"time_base": "1/90000",
"start_pts": 2255,
"start_time": "0.025056",
"duration_ts": 98721698,
"duration": "1096.907756",
"disposition": {
"default": 0,
"dub": 0,
"original": 0,
"comment": 0,
"lyrics": 0,
"karaoke": 0,
"forced": 0,
"hearing_impaired": 0,
"visual_impaired": 0,
"clean_effects": 0,
"attached_pic": 1,
"timed_thumbnails": 0
},
"tags": {
"comment": "Other"
}
}
],
"format": {
"filename": "input.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": "1096.907755",
"size": "17558398",
"bit_rate": "128057",
"probe_score": 51,
"tags": {
"title": "属于林俊杰的情歌王 (cover: 林俊杰)",
"album": "歌曲合辑",
"artist": "木子旭",
"genre": "Blues"
}
}
}
sample_fmt:采样位数
name | 占用bit位 |
---|---|
u8 | 8bit |
s16 | 16bit |
s32 | 32bit |
flt | 32bit |
dbl | 64bit |
u8p | 8bit |
s16p | 16bit |
s32p | 32bit |
fltp | 32bit |
dblp | 64bit |
s64 | 64bit |
s64p | 64bit |
- 【其它命令】
# 波形绘制
ffmpeg -i input.mp3 -map 0:a -filter_complex "showwavespic=s=1280*120" -frames:v 1 result.png
# 改变速度(范围 0.5-2.0)
ffmpeg -i input.mp3 -af atempo=1.5 result.mp3
# 指定速度播放
ffplay input.mp3 -af atempo=1.5
# 使用多媒体滤镜 ebur128分析音频响度变化
ffplay -f lavfi -i "amovie=input.mp3,ebur128=video=1:meter=18 [out0][out1]"
#
- 【其它说明】
-an 从视频出分离并保存视频(无声音)
-vn 从视频出分离并保存音频(纯音频)
-map 0:a 可以处理带封面的音频,不然会报错
计算音频文件大小:
* 数据量(字节/秒)= (采样频率(Hz)*采样位数(bit)*声道数)/ 8
* 例如:对于5分钟双声道、16位采样位数、44.1kHz采样频率声音的不压缩数据量的计算
* 数据量=[44.1×1000×16×2×(5×60)]/(8×1024×1024)=50.47MB
评论区