FFmpeg命令整合(音频篇)

太白
2022-04-23 / 0 评论 / 6 点赞 / 1,709 阅读 / 7,831 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-06-21,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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
6

评论区