FFmpeg

采用FFmpeg从视频中提取音频(声音)保存为mp3文件

下载mp3的编码库

因为FFmpeg默认只支持mp3的解码,不支持mp3编码.需要借助第三方的mp3编码库。这里采用lame编码库 下载地址

1
2
3
4
cd lame-3.100
./configure
make
make install

下载FFmpeg

下载

1
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg

brew

1
brew install ffmpeg

编译

1
2
3
./configure --enable-libmp3lame 
make
make install

提取音频

1
ffmpeg -i apple.mp4 -f mp3 -vn apple.mp3

mp4 -> wav

1
ffmpeg -i .xx.mp4 -f wav -ar 16000 xx.wav

wav -> mp3

1
ffmepg -i input.wav -f mp3 -acodec libmp3lame -y output.mp3

扩展信息

1
2
ffmpeg -i apple.mp4
ffmpeg -i apple.mp3

常用参数说明:

主要参数: -i 设定输入流 -f 设定输出格式 -ss 开始时间

视频参数: -b 设定视频流量,默认为200Kbit/s -r 设定帧速率,默认为25 -s 设定画面的宽与高 -aspect 设定画面的比例 -vn 不处理视频 -vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器

音频参数: -ar 设定采样率 -ac 设定声音的Channel数 -acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器 -an 不处理音频

混音

会把2个输入音频流混合成一个输出流,持续时间采用第一个输入流的持续时间并且有2秒的结束过渡

1
ffmpeg -i apple.mp3 -i 天后.mp3 -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f mp3 a.mp3

  • inputs: 输入数,如果没有指定则默认为2

  • duration: 确定流结束的方法,有:

    • longest: 按最长持续时间输入(默认)
    • shortest: 按最短持续时间输入
    • first: 按第一个输入持续时间
  • dropout_trnsition: 过渡时间,单位秒,指一个输入流结束时音量从正常到无声渐止效果,默认为2秒

图片 + 音频 = 视频

方案一

1
ffmpeg -threads2 -y -r 10 -i /tmpdir/image%04d.jpg -i audio.mp3 -absf aac_adtstoasc output.mp4
  • -threads 2 以两个线程进行运行, 加快处理的速度。

  • -y 对输出文件进行覆盖

  • -r 10 fps 帧率 设置为10帧/秒 可以指定两个帧率,输入帧率,输出帧率;

    • 输入帧率:-i之前,设定读入帧率,比如 -r 0.5 ,也就是说1秒要播0.5个图片,那么一个图也就是要播2s;
    • 输出频率:-i之后,真正的输出视频播放帧率,不写话,是默认和输入频率一样。比如设 -r 30 ,对应上面的设定,一个图播2
      s,那么输出文件播放时,这2s内,都是这张图,但是播放了60帧。
  • -i /tmpdir/image%04d.jpg 输入图片文件,图片文件保存为 image0001.jpg image0002.jpg ….

  • -i audio.mp3 输入的音频文件

  • -absf aac_adtstoasc 将结果的音频格式转为faac格式时需要这个选项。将音频格式转为faac是因为在iphone上某些音频格式的视频无法播放,例如mp3. 但faac格式的音频的视频在iphone上可以播放。-absf 的意思是设置一个bitstream filter进行某些转换。可以用ffmpeg -bsfs 查看所有支持的bitstream filter。 bitstream filter和 aac_adtstoasc的具体含义我也说不上。但是如果不用这个选项又会导致转换失败。!

问题:

图片不能循环轮播

方案二

1
ffmpeg -loop 1 -f image2 -r 1 -i img/appstore%d.png  -t 60 image.mp4
  • -loop 1循环读输入 0读完就不读了
  • -t 输出视频总时长
  • -b 指定200k码率
1
ffmpeg -i image.mp4 -i a.mp3 imageVideo.mp4

方案三

1
ffmpeg -loop 1 -f image2 -s 720x1280 -r 5 -i img/black.png -vcodec libx264 -pix_fmt yuv420p -t 180 black.mp4
  • -r is the framerate (fps)
  • -crf is the quality, lower means better quality, 15-25 is usually good
  • -s is the resolution
  • -pix_fmt yuv420p specifies the pixel format, change this as needed

源地址

问题:

视频 跟音频的时长必须统一